diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000000..d352b823d05 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,121 @@ +#------------------------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. +#------------------------------------------------------------------------------------------------------------- + +FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:0-10 + +ARG TARGET_DISPLAY=":1" + +# VNC options +ARG MAX_VNC_RESOLUTION=1920x1080x16 +ARG TARGET_VNC_RESOLUTION=1920x1080 +ARG TARGET_VNC_DPI=72 +ARG TARGET_VNC_PORT=5901 +ARG VNC_PASSWORD="vscode" + +# noVNC (VNC web client) options +ARG INSTALL_NOVNC="true" +ARG NOVNC_VERSION=1.1.0 +ARG TARGET_NOVNC_PORT=6080 +ARG WEBSOCKETIFY_VERSION=0.9.0 + +# Firefox is useful for testing things like browser launch events, but optional +ARG INSTALL_FIREFOX="false" + +# Expected non-root username from base image +ARG USERNAME=node + +# Core environment variables for X11, VNC, and fluxbox +ENV DBUS_SESSION_BUS_ADDRESS="autolaunch:" \ + MAX_VNC_RESOLUTION="${MAX_VNC_RESOLUTION}" \ + VNC_RESOLUTION="${TARGET_VNC_RESOLUTION}" \ + VNC_DPI="${TARGET_VNC_DPI}" \ + VNC_PORT="${TARGET_VNC_PORT}" \ + NOVNC_PORT="${TARGET_NOVNC_PORT}" \ + DISPLAY="${TARGET_DISPLAY}" \ + LANG="en_US.UTF-8" \ + LANGUAGE="en_US.UTF-8" \ + VISUAL="nano" \ + EDITOR="nano" + +# Configure apt and install packages +RUN apt-get update \ + && export DEBIAN_FRONTEND=noninteractive \ + # + # Install the Cascadia Code fonts - https://github.com/microsoft/cascadia-code + && curl -sSL https://github.com/microsoft/cascadia-code/releases/download/v2004.30/CascadiaCode_2004.30.zip -o /tmp/cascadia-fonts.zip \ + && unzip /tmp/cascadia-fonts.zip -d /tmp/cascadia-fonts \ + && mkdir -p /usr/share/fonts/truetype/cascadia \ + && mv /tmp/cascadia-fonts/ttf/* /usr/share/fonts/truetype/cascadia/ \ + && rm -rf /tmp/cascadia-fonts.zip /tmp/cascadia-fonts \ + # + # Install X11, fluxbox and VS Code dependencies + && apt-get -y install --no-install-recommends \ + xvfb \ + x11vnc \ + fluxbox \ + dbus-x11 \ + x11-utils \ + x11-xserver-utils \ + xdg-utils \ + fbautostart \ + xterm \ + eterm \ + gnome-terminal \ + gnome-keyring \ + seahorse \ + nautilus \ + libx11-dev \ + libxkbfile-dev \ + libsecret-1-dev \ + libnotify4 \ + libnss3 \ + libxss1 \ + libasound2 \ + xfonts-base \ + xfonts-terminus \ + fonts-noto \ + fonts-wqy-microhei \ + fonts-droid-fallback \ + vim-tiny \ + nano \ + # + # [Optional] Install noVNC + && if [ "${INSTALL_NOVNC}" = "true" ]; then \ + mkdir -p /usr/local/novnc \ + && curl -sSL https://github.com/novnc/noVNC/archive/v${NOVNC_VERSION}.zip -o /tmp/novnc-install.zip \ + && unzip /tmp/novnc-install.zip -d /usr/local/novnc \ + && cp /usr/local/novnc/noVNC-${NOVNC_VERSION}/vnc_lite.html /usr/local/novnc/noVNC-${NOVNC_VERSION}/index.html \ + && rm /tmp/novnc-install.zip \ + && curl -sSL https://github.com/novnc/websockify/archive/v${WEBSOCKETIFY_VERSION}.zip -o /tmp/websockify-install.zip \ + && unzip /tmp/websockify-install.zip -d /usr/local/novnc \ + && apt-get -y install --no-install-recommends python-numpy \ + && ln -s /usr/local/novnc/websockify-${WEBSOCKETIFY_VERSION} /usr/local/novnc/noVNC-${NOVNC_VERSION}/utils/websockify \ + && rm /tmp/websockify-install.zip; \ + fi \ + # + # [Optional] Install Firefox + && if [ "${INSTALL_FIREFOX}" = "true" ]; then \ + apt-get -y install --no-install-recommends firefox-esr; \ + fi \ + # + # Clean up + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* + +COPY bin/init-dev-container.sh /usr/local/share/ +COPY bin/set-resolution /usr/local/bin/ +COPY fluxbox/* /root/.fluxbox/ +COPY fluxbox/* /home/${USERNAME}/.fluxbox/ + +# Update privs, owners of config files +RUN mkdir -p /var/run/dbus /root/.vnc /home/${USERNAME}/.vnc \ + && touch /root/.Xmodmap /home/${USERNAME}/.Xmodmap \ + && echo "${VNC_PASSWORD}" | tee /root/.vnc/passwd > /home/${USERNAME}/.vnc/passwd \ + && chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}/.Xmodmap /home/${USERNAME}/.fluxbox /home/${USERNAME}/.vnc \ + && chmod +x /usr/local/share/init-dev-container.sh /usr/local/bin/set-resolution + +ENTRYPOINT ["/usr/local/share/init-dev-container.sh"] +CMD ["sleep", "infinity"] diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 00000000000..79fdfb487aa --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,82 @@ +# Code - OSS Development Container + +This repository includes configuration for a development container for working with Code - OSS in an isolated local container or using [Visual Studio Codespaces](https://aka.ms/vso). + +> **Tip:** The default VNC password is `vscode`. The VNC server runs on port `5901` with a web client at `6080`. For better performance, we recommend using a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/). Applications like the macOS Screen Sharing app will not perform as well. [Chicken](https://sourceforge.net/projects/chicken/) is a good macOS alternative. + +## Quick start - local + +1. Install Docker Desktop or Docker on your local machine. (See [docs](https://aka.ms/vscode-remote/containers/getting-started) for additional details.) + +2. [Docker Desktop] If you are not using the new WSL2 Docker Desktop engine, increase the resources allocated to Docker Desktop to at least **4 Cores and 4 GB of RAM (8 GB recommended)**. Right-click on the Docker status bar item, go to **Preferences/Settings > Resources > Advanced** to do so. + + > **Note:** The [Resource Monitor](https://marketplace.visualstudio.com/items?itemName=mutantdino.resourcemonitor) extension is included in the container so you can keep an eye on CPU/Memory in the status bar. + +3. Install [Visual Studio Code Stable](https://code.visualstudio.com/) or [Insiders](https://code.visualstudio.com/insiders/) and the [Remote - Containers](https://aka.ms/vscode-remote/download/containers) extension. + + ![Image of Remote - Containers extension](https://microsoft.github.io/vscode-remote-release/images/remote-containers-extn.png) + + > Note that the Remote - Containers extension requires the Visual Studio Code distribution of Code - OSS. See the [FAQ](https://aka.ms/vscode-remote/faq/license) for details. + +4. Press Ctrl/Cmd + Shift + P and select **Remote - Containers: Open Repository in Container...**. + + > **Tip:** While you can use your local source tree instead, operations like `yarn install` can be slow on macOS or using the Hyper-V engine on Windows. We recommend the "open repository" approach instead since it uses "named volume" rather than the local filesystem. + +5. Type `https://github.com/microsoft/vscode` (or a branch or PR URL) in the input box and press Enter. + +6. After the container is running, open a web browser and go to [http://localhost:6080](http://localhost:6080) or use a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) to connect to `localhost:5901` and enter `vscode` as the password. + +Anything you start in VS Code or the integrated terminal will appear here. + +Next: **[Try it out!](#try-it)** + +## Quick start - Codespaces + +>Note that the Codespaces browser-based editor cannot currently access the desktop environment in this container (due to a [missing feature](https://github.com/MicrosoftDocs/vsonline/issues/117)). We recommend using Visual Studio Code from the desktop to connect instead in the near term. + +1. Install [Visual Studio Code Stable](https://code.visualstudio.com/) or [Insiders](https://code.visualstudio.com/insiders/) and the [Visual Studio Codespaces](https://aka.ms/vscs-ext-vscode) extension. + + ![Image of VS Codespaces extension](https://microsoft.github.io/vscode-remote-release/images/codespaces-extn.png) + + > Note that the Visual Studio Codespaces extension requires the Visual Studio Code distribution of Code - OSS. + +2. Sign in by pressing Ctrl/Cmd + Shift + P and selecting **Codespaces: Sign In**. You may also need to use the **Codespaces: Create Plan** if you do not have a plan. See the [Codespaces docs](https://aka.ms/vso-docs/vscode) for details. + +3. Press Ctrl/Cmd + Shift + P and select **Codespaces: Create New Codespace**. + +4. Use default settings, select a plan, and then enter the repository URL `https://github.com/microsoft/vscode` (or a branch or PR URL) in the input box when prompted. + +5. After the container is running, open a web browser and go to [http://localhost:6080](http://localhost:6080) or use a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) to connect to `localhost:5901` and enter `vscode` as the password. + +6. Anything you start in VS Code or the integrated terminal will appear here. + +## Try it! + +This container uses the [Fluxbox](http://fluxbox.org/) window manager to keep things lean. **Right-click on the desktop** to see menu options. It works with GNOME and GTK applications, so other tools can be installed if needed. + +Note you can also set the resolution from the command line by typing `set-resolution`. + +To start working with Code - OSS, follow these steps: + +1. In your local VS Code, open a terminal (Ctrl/Cmd + Shift + \`) and type the following commands: + + ```bash + yarn install + bash scripts/code.sh + ``` + +2. After the build is complete, open a web browser and go to [http://localhost:6080](http://localhost:6080) or use a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) to connect to `localhost:5901` and enter `vscode` as the password. + +3. You should now see Code - OSS! + +Next, let's try debugging. + +1. Shut down Code - OSS by clicking the box in the upper right corner of the Code - OSS window through your browser or VNC viewer. + +2. Go to your local VS Code client, and use Run / Debug view to launch the **VS Code** configuration. (Typically the default, so you can likely just press F5). + + > **Note:** If launching times out, you can increase the value of `timeout` in the "VS Code", "Attach Main Process", "Attach Extension Host", and "Attach to Shared Process" configurations in [launch.json](../.vscode/launch.json). However, running `scripts/code.sh` first will set up Electron which will usually solve timeout issues. + +3. After a bit, Code - OSS will appear with the debugger attached! + +Enjoy! diff --git a/.devcontainer/bin/init-dev-container.sh b/.devcontainer/bin/init-dev-container.sh new file mode 100644 index 00000000000..260cc275922 --- /dev/null +++ b/.devcontainer/bin/init-dev-container.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +NONROOT_USER=node +LOG=/tmp/container-init.log + +# Execute the command it not already running +startInBackgroundIfNotRunning() +{ + log "Starting $1." + echo -e "\n** $(date) **" | sudoIf tee -a /tmp/$1.log > /dev/null + if ! pidof $1 > /dev/null; then + keepRunningInBackground "$@" + while ! pidof $1 > /dev/null; do + sleep 1 + done + log "$1 started." + else + echo "$1 is already running." | sudoIf tee -a /tmp/$1.log > /dev/null + log "$1 is already running." + fi +} + +# Keep command running in background +keepRunningInBackground() +{ + ($2 sh -c "while :; do echo [\$(date)] Process started.; $3; echo [\$(date)] Process exited!; sleep 5; done 2>&1" | sudoIf tee -a /tmp/$1.log > /dev/null & echo "$!" | sudoIf tee /tmp/$1.pid > /dev/null) +} + +# Use sudo to run as root when required +sudoIf() +{ + if [ "$(id -u)" -ne 0 ]; then + sudo "$@" + else + "$@" + fi +} + +# Use sudo to run as non-root user if not already running +sudoUserIf() +{ + if [ "$(id -u)" -eq 0 ]; then + sudo -u ${NONROOT_USER} "$@" + else + "$@" + fi +} + +# Log messages +log() +{ + echo -e "[$(date)] $@" | sudoIf tee -a $LOG > /dev/null +} + +log "** SCRIPT START **" + +# Start dbus. +log 'Running "/etc/init.d/dbus start".' +if [ -f "/var/run/dbus/pid" ] && ! pidof dbus-daemon > /dev/null; then + sudoIf rm -f /var/run/dbus/pid +fi +sudoIf /etc/init.d/dbus start 2>&1 | sudoIf tee -a /tmp/dbus-daemon-system.log > /dev/null +while ! pidof dbus-daemon > /dev/null; do + sleep 1 +done + +# Set up Xvfb. +startInBackgroundIfNotRunning "Xvfb" sudoIf "Xvfb ${DISPLAY:-:1} +extension RANDR -screen 0 ${MAX_VNC_RESOLUTION:-1920x1080x16}" + +# Start fluxbox as a light weight window manager. +startInBackgroundIfNotRunning "fluxbox" sudoUserIf "dbus-launch startfluxbox" + +# Start x11vnc +startInBackgroundIfNotRunning "x11vnc" sudoIf "x11vnc -display ${DISPLAY:-:1} -rfbport ${VNC_PORT:-5901} -localhost -no6 -xkb -shared -forever -passwdfile $HOME/.vnc/passwd" + +# Set resolution +/usr/local/bin/set-resolution ${VNC_RESOLUTION:-1280x720} ${VNC_DPI:-72} + + +# Spin up noVNC if installed and not runnning. +if [ -d "/usr/local/novnc" ] && [ "$(ps -ef | grep /usr/local/novnc/noVNC*/utils/launch.sh | grep -v grep)" = "" ]; then + keepRunningInBackground "noVNC" sudoIf "/usr/local/novnc/noVNC*/utils/launch.sh --listen ${NOVNC_PORT:-6080} --vnc localhost:${VNC_PORT:-5901}" + log "noVNC started." +else + log "noVNC is already running or not installed." +fi + +# Run whatever was passed in +log "Executing \"$@\"." +"$@" +log "** SCRIPT EXIT **" diff --git a/.devcontainer/bin/set-resolution b/.devcontainer/bin/set-resolution new file mode 100644 index 00000000000..5b4ca79f518 --- /dev/null +++ b/.devcontainer/bin/set-resolution @@ -0,0 +1,25 @@ +#!/bin/bash +RESOLUTION=${1:-${VNC_RESOLUTION:-1920x1080}} +DPI=${2:-${VNC_DPI:-72}} +if [ -z "$1" ]; then + echo -e "**Current Settings **\n" + xrandr + echo -n -e "\nEnter new resolution (WIDTHxHEIGHT, blank for ${RESOLUTION}, Ctrl+C to abort).\n> " + read NEW_RES + if [ "${NEW_RES}" != "" ]; then + RESOLUTION=${NEW_RES} + fi + if [ -z "$2" ]; then + echo -n -e "\nEnter new DPI (blank for ${DPI}, Ctrl+C to abort).\n> " + read NEW_DPI + if [ "${NEW_DPI}" != "" ]; then + DPI=${NEW_DPI} + fi + fi +fi + +xrandr --fb ${RESOLUTION} --dpi ${DPI} > /dev/null 2>&1 + +echo -e "\n**New Settings **\n" +xrandr +echo diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..b9f3e6d79b1 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,41 @@ +{ + "name": "Code - OSS", + "build": { + "dockerfile": "Dockerfile", + "args": { + "MAX_VNC_RESOLUTION": "1920x1080x16", + "TARGET_VNC_RESOLUTION": "1280x768", + "TARGET_VNC_PORT": "5901", + "TARGET_NOVNC_PORT": "6080", + "VNC_PASSWORD": "vscode", + "INSTALL_FIREFOX": "true" + } + }, + "overrideCommand": false, + "runArgs": ["--init"], + + "settings": { + // zsh is also available + "terminal.integrated.shell.linux": "/bin/bash", + "resmon.show.battery": false, + "resmon.show.cpufreq": false, + "remote.extensionKind": { + "ms-vscode.js-debug-nightly": "workspace", + "msjsdiag.debugger-for-chrome": "workspace" + }, + "debug.chrome.useV3": true + }, + + // noVNC, VNC ports + "forwardPorts": [6080, 5901], + + "extensions": [ + "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig", + "msjsdiag.debugger-for-chrome", + "mutantdino.resourcemonitor", + "GitHub.vscode-pull-request-github" + ], + + "remoteUser": "node" +} diff --git a/.devcontainer/fluxbox/apps b/.devcontainer/fluxbox/apps new file mode 100644 index 00000000000..d43f05e9e20 --- /dev/null +++ b/.devcontainer/fluxbox/apps @@ -0,0 +1,9 @@ +[app] (name=code-oss-dev) + [Position] (CENTER) {0 0} + [Maximized] {yes} + [Dimensions] {100% 100%} +[end] +[transient] (role=GtkFileChooserDialog) + [Position] (CENTER) {0 0} + [Dimensions] {70% 70%} +[end] diff --git a/.devcontainer/fluxbox/init b/.devcontainer/fluxbox/init new file mode 100644 index 00000000000..a6b8d73fa73 --- /dev/null +++ b/.devcontainer/fluxbox/init @@ -0,0 +1,9 @@ +session.menuFile: ~/.fluxbox/menu +session.keyFile: ~/.fluxbox/keys +session.styleFile: /usr/share/fluxbox/styles//Squared_for_Debian +session.configVersion: 13 +session.screen0.workspaces: 1 +session.screen0.workspacewarping: false +session.screen0.toolbar.widthPercent: 100 +session.screen0.strftimeFormat: %d %b, %a %02k:%M:%S +session.screen0.toolbar.tools: prevworkspace, workspacename, nextworkspace, clock, prevwindow, nextwindow, iconbar, systemtray diff --git a/.devcontainer/fluxbox/menu b/.devcontainer/fluxbox/menu new file mode 100644 index 00000000000..ff5955a2fe7 --- /dev/null +++ b/.devcontainer/fluxbox/menu @@ -0,0 +1,16 @@ +[begin] ( Code - OSS Development Container ) + [exec] (File Manager) { nautilus ~ } <> + [exec] (Terminal) {/usr/bin/gnome-terminal --working-directory=~ } <> + [exec] (Start Code - OSS) { x-terminal-emulator -T "Code - OSS Build" -e bash /workspaces/vscode*/scripts/code.sh } <> + [submenu] (System >) {} + [exec] (Set Resolution) { x-terminal-emulator -T "Set Resolution" -e bash /usr/local/bin/set-resolution } <> + [exec] (Passwords and Keys) { seahorse } <> + [exec] (Top) { x-terminal-emulator -T "Top" -e /usr/bin/top } <> + [exec] (Editres) {editres} <> + [exec] (Xfontsel) {xfontsel} <> + [exec] (Xkill) {xkill} <> + [exec] (Xrefresh) {xrefresh} <> + [end] + [config] (Configuration >) + [workspaces] (Workspaces >) +[end] diff --git a/.eslintrc.json b/.eslintrc.json index c33949be69a..0abb18adee2 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -519,7 +519,9 @@ "**/vs/workbench/services/**/common/**", "**/vs/workbench/api/**/common/**", "vscode-textmate", - "vscode-oniguruma" + "vscode-oniguruma", + "iconv-lite-umd", + "semver-umd" ] }, { diff --git a/.github/classifier.json b/.github/classifier.json index 8dd33213239..8b5b7941d05 100644 --- a/.github/classifier.json +++ b/.github/classifier.json @@ -1,82 +1,181 @@ { - "$schema": "https://raw.githubusercontent.com/microsoft/vscode-github-triage-actions/master/classifier/apply/apply-labels/classifier-config.schema.json", + "$schema": "https://raw.githubusercontent.com/microsoft/vscode-github-triage-actions/master/classifier-deep/apply/apply-labels/deep-classifier-config.schema.json", "assignees": { - "JacksonKearl": { - "assign": true - }, - "bpasero": { - "assign": true - }, - "Tyriar": { - "assign": true - }, - "misolori": { - "assign": true - }, - "joaomoreno": { - "assign": true - } + "JacksonKearl": {"accuracy": 0.5} }, "labels": { - "search-editor": { - "applyLabel": true, - "assign": [ - "JacksonKearl" - ] - }, - "snippets": { - "applyLabel": false, - "assign": [ - "jrieken" - ] - }, - "integrated-terminal": { - "applyLabel": true, - "assign": [ - "Tyriar" - ] - }, - "workbench-editors": { - "applyLabel": false, - "assign": [ - "bpasero" - ] - }, - "workbench-history": { - "applyLabel": false, - "assign": [ - "bpasero" - ] - }, - "workbench-notifications": { - "applyLabel": false, - "assign": [ - "bpasero" - ] - }, - "workbench-tabs": { - "applyLabel": false, - "assign": [ - "bpasero" - ] - }, - "icons-product": { - "applyLabel": true, - "assign": [ - "misolori" - ] - }, - "ux": { - "applyLabel": true, - "assign": [ - "misolori" - ] - }, - "git": { - "applyLabel": false, - "assign": [ - "joaomoreno" - ] + "L10N": {"assign": []}, + "VIM": {"assign": []}, + "api": {"assign": ["jrieken"]}, + "api-finalization": {"assign": []}, + "api-proposal": {"assign": ["jrieken"]}, + "authentication": {"assign": ["RMacfarlane"]}, + "breadcrumbs": {"assign": ["jrieken"]}, + "callhierarchy": {"assign": ["jrieken"]}, + "code-lens": {"assign": ["jrieken"]}, + "color-palette": {"assign": []}, + "comments": {"assign": ["rebornix"]}, + "config": {"assign": ["sandy081"]}, + "context-keys": {"assign": []}, + "css-less-scss": {"assign": ["aeschli"]}, + "custom-editors": {"assign": ["mjbvz"]}, + "debug": {"assign": ["weinand"]}, + "debug-console": {"assign": ["weinand"]}, + "dialogs": {"assign": ["sbatten"]}, + "diff-editor": {"assign": []}, + "dropdown": {"assign": []}, + "editor": {"assign": ["rebornix"]}, + "editor-autoclosing": {"assign": []}, + "editor-autoindent": {"assign": ["rebornix"]}, + "editor-bracket-matching": {"assign": []}, + "editor-clipboard": {"assign": ["jrieken"]}, + "editor-code-actions": {"assign": []}, + "editor-color-picker": {"assign": ["rebornix"]}, + "editor-columnselect": {"assign": ["alexdima"]}, + "editor-commands": {"assign": ["jrieken"]}, + "editor-comments": {"assign": []}, + "editor-contrib": {"assign": []}, + "editor-core": {"assign": []}, + "editor-drag-and-drop": {"assign": ["rebornix"]}, + "editor-error-widget": {"assign": ["sandy081"]}, + "editor-find": {"assign": ["rebornix"]}, + "editor-folding": {"assign": ["aeschli"]}, + "editor-hover": {"assign": []}, + "editor-indent-guides": {"assign": []}, + "editor-input": {"assign": ["alexdima"]}, + "editor-input-IME": {"assign": ["rebornix"]}, + "editor-minimap": {"assign": []}, + "editor-multicursor": {"assign": ["alexdima"]}, + "editor-parameter-hints": {"assign": []}, + "editor-render-whitespace": {"assign": []}, + "editor-rendering": {"assign": ["alexdima"]}, + "editor-scrollbar": {"assign": []}, + "editor-symbols": {"assign": ["jrieken"]}, + "editor-synced-region": {"assign": ["aeschli"]}, + "editor-textbuffer": {"assign": ["rebornix"]}, + "editor-theming": {"assign": []}, + "editor-wordnav": {"assign": ["alexdima"]}, + "editor-wrapping": {"assign": ["alexdima"]}, + "emmet": {"assign": []}, + "error-list": {"assign": ["sandy081"]}, + "explorer-custom": {"assign": ["sandy081"]}, + "extension-host": {"assign": []}, + "extensions": {"assign": ["sandy081"]}, + "extensions-development": {"assign": []}, + "file-decorations": {"assign": ["jrieken"]}, + "file-encoding": {"assign": ["bpasero"]}, + "file-explorer": {"assign": ["isidorn"]}, + "file-glob": {"assign": []}, + "file-guess-encoding": {"assign": ["bpasero"]}, + "file-io": {"assign": ["bpasero"]}, + "file-watcher": {"assign": ["bpasero"]}, + "font-rendering": {"assign": []}, + "formatting": {"assign": []}, + "git": {"assign": ["joaomoreno"]}, + "gpu": {"assign": ["deepak1556"]}, + "grammar": {"assign": ["mjbvz"]}, + "grid-view": {"assign": ["joaomoreno"]}, + "html": {"assign": ["aeschli"]}, + "i18n": {"assign": []}, + "icon-brand": {"assign": []}, + "icons-product": {"assign": ["misolori"]}, + "install-update": {"assign": []}, + "integrated-terminal": {"assign": ["Tyriar"]}, + "integrated-terminal-conpty": {"assign": ["Tyriar"]}, + "integrated-terminal-links": {"assign": ["Tyriar"]}, + "integration-test": {"assign": []}, + "intellisense-config": {"assign": []}, + "ipc": {"assign": ["joaomoreno"]}, + "issue-bot": {"assign": ["chrmarti"]}, + "issue-reporter": {"assign": ["RMacfarlane"]}, + "javascript": {"assign": ["mjbvz"]}, + "json": {"assign": ["aeschli"]}, + "keybindings": {"assign": []}, + "keybindings-editor": {"assign": ["sandy081"]}, + "keyboard-layout": {"assign": ["alexdima"]}, + "languages-basic": {"assign": ["aeschli"]}, + "languages-diagnostics": {"assign": ["jrieken"]}, + "layout": {"assign": ["sbatten"]}, + "lcd-text-rendering": {"assign": []}, + "list": {"assign": ["joaomoreno"]}, + "log": {"assign": []}, + "markdown": {"assign": ["mjbvz"]}, + "marketplace": {"assign": []}, + "menus": {"assign": ["sbatten"]}, + "merge-conflict": {"assign": ["chrmarti"]}, + "notebook": {"assign": ["rebornix"]}, + "outline": {"assign": ["jrieken"]}, + "output": {"assign": []}, + "perf": {"assign": []}, + "perf-bloat": {"assign": []}, + "perf-startup": {"assign": []}, + "php": {"assign": ["roblourens"]}, + "portable-mode": {"assign": ["joaomoreno"]}, + "proxy": {"assign": []}, + "quick-pick": {"assign": ["chrmarti"]}, + "references-viewlet": {"assign": ["jrieken"]}, + "release-notes": {"assign": []}, + "remote": {"assign": []}, + "remote-explorer": {"assign": ["alexr00"]}, + "rename": {"assign": ["jrieken"]}, + "scm": {"assign": ["joaomoreno"]}, + "screencast-mode": {"assign": ["joaomoreno"]}, + "search": {"assign": ["roblourens"]}, + "search-editor": {"assign": ["JacksonKearl"]}, + "search-replace": {"assign": ["sandy081"]}, + "semantic-tokens": {"assign": ["aeschli"]}, + "settings-editor": {"assign": ["roblourens"]}, + "settings-sync": {"assign": ["sandy081"]}, + "simple-file-dialog": {"assign": ["alexr00"]}, + "smart-select": {"assign": ["jrieken"]}, + "smoke-test": {"assign": []}, + "snap": {"assign": ["joaomoreno"]}, + "snippets": {"assign": ["jrieken"]}, + "splitview": {"assign": ["joaomoreno"]}, + "suggest": {"assign": ["jrieken"]}, + "tasks": {"assign": ["alexr00"]}, + "telemetry": {"assign": []}, + "themes": {"assign": ["aeschli"]}, + "timeline": {"assign": ["eamodio"]}, + "timeline-git": {"assign": ["eamodio"]}, + "titlebar": {"assign": ["sbatten"]}, + "tokenization": {"assign": []}, + "tree": {"assign": ["joaomoreno"]}, + "typescript": {"assign": ["mjbvz"]}, + "undo-redo": {"assign": []}, + "unit-test": {"assign": []}, + "uri": {"assign": ["jrieken"]}, + "ux": {"assign": ["misolori"]}, + "variable-resolving": {"assign": []}, + "vscode-build": {"assign": []}, + "web": {"assign": ["bpasero"]}, + "webview": {"assign": ["mjbvz"]}, + "workbench-cli": {"assign": []}, + "workbench-diagnostics": {"assign": ["RMacfarlane"]}, + "workbench-dnd": {"assign": ["bpasero"]}, + "workbench-editor-grid": {"assign": ["sbatten"]}, + "workbench-editors": {"assign": ["bpasero"]}, + "workbench-electron": {"assign": ["deepak1556"]}, + "workbench-feedback": {"assign": ["bpasero"]}, + "workbench-history": {"assign": ["bpasero"]}, + "workbench-hot-exit": {"assign": ["Tyriar"]}, + "workbench-launch": {"assign": []}, + "workbench-link": {"assign": []}, + "workbench-multiroot": {"assign": ["bpasero"]}, + "workbench-notifications": {"assign": ["bpasero"]}, + "workbench-os-integration": {"assign": []}, + "workbench-rapid-render": {"assign": ["jrieken"]}, + "workbench-run-as-admin": {"assign": []}, + "workbench-state": {"assign": ["bpasero"]}, + "workbench-status": {"assign": ["bpasero"]}, + "workbench-tabs": {"assign": ["bpasero"]}, + "workbench-touchbar": {"assign": ["bpasero"]}, + "workbench-views": {"assign": ["sbatten"]}, + "workbench-welcome": {"assign": ["chrmarti"]}, + "workbench-window": {"assign": ["bpasero"]}, + "workbench-zen": {"assign": ["isidorn"]}, + "workspace-edit": {"assign": ["jrieken"]}, + "workspace-symbols": {"assign": []}, + "zoom": {"assign": ["alexdima"] } } - } } diff --git a/.github/commands.json b/.github/commands.json index 6bacd7963bb..45e8b89deae 100644 --- a/.github/commands.json +++ b/.github/commands.json @@ -221,6 +221,19 @@ "addLabel": "*caused-by-extension", "comment": "It looks like this is caused by the C++ extension. Please file it with the repository [here](https://github.com/Microsoft/vscode-cpptools). Make sure to check their issue reporting template and provide them relevant information such as the extension version you're using. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines for more information.\n\nHappy Coding!" }, + { + "type": "comment", + "name": "extCpp", + "allowUsers": [ + "cleidigh", + "usernamehw", + "gjsjohnmurray", + "IllusionMH" + ], + "action": "close", + "addLabel": "*caused-by-extension", + "comment": "It looks like this is caused by the C++ extension. Please file it with the repository [here](https://github.com/Microsoft/vscode-cpptools). Make sure to check their issue reporting template and provide them relevant information such as the extension version you're using. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines for more information.\n\nHappy Coding!" + }, { "type": "comment", "name": "extTS", @@ -271,7 +284,7 @@ ], "action": "close", "addLabel": "*caused-by-extension", - "comment": "It looks like this is caused by the Go extension. Please file it with the repository [here](https://github.com/microsoft/vscode-go). Make sure to check their [contributing guidelines](https://github.com/microsoft/vscode-go/blob/master/CONTRIBUTING.md) and provide relevant information such as the extension version you're using. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines for more information.\n\nHappy Coding!" + "comment": "It looks like this is caused by the Go extension. Please file it with the repository [here](https://github.com/golang/vscode-go). Make sure to check their issue reporting template and provide them relevant information such as the extension version you're using. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines for more information.\n\nHappy Coding!" }, { "type": "comment", diff --git a/.github/workflows/author-verified.yml b/.github/workflows/author-verified.yml index 5ba6db14812..7114f351353 100644 --- a/.github/workflows/author-verified.yml +++ b/.github/workflows/author-verified.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v27 + ref: v31 path: ./actions - name: Install Actions if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'author-verification-requested') diff --git a/.github/workflows/classifier-train.yml b/.github/workflows/classifier-train.yml deleted file mode 100644 index c728e374a78..00000000000 --- a/.github/workflows/classifier-train.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: "Classifier: Trainer" -on: - schedule: - - cron: 0 0 12 * * - -jobs: - main: - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v2 - with: - repository: 'microsoft/vscode-github-triage-actions' - ref: master - lfs: true - path: ./actions - - name: Install Actions - run: npm install --production --prefix ./actions - - name: Install Additional Dependencies - # Pulls in a bunch of other packages that arent needed for the rest of the actions - run: npm install @azure/storage-blob@12 - - name: "Run Classifier: Scraper" - uses: ./actions/classifier/train/fetch-issues - with: - token: ${{secrets.ISSUE_SCRAPER_TOKEN}} # My personal token, so as to not risk going over quota on main token - - name: Set up Python 3.7 - uses: actions/setup-python@v1 - with: - python-version: 3.7 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install --upgrade numpy scipy scikit-learn joblib nltk - - name: "Run Classifier: Generator" - run: python ./actions/classifier/train/generate-models/generate.py category - - name: "Run Classifier: Upload" - uses: ./actions/classifier/train/upload-models - with: - blobContainerName: classifier-models - blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} diff --git a/.github/workflows/commands.yml b/.github/workflows/commands.yml index b4542529e4d..7036a4937d4 100644 --- a/.github/workflows/commands.yml +++ b/.github/workflows/commands.yml @@ -13,7 +13,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v27 + ref: v31 - name: Install Actions run: npm install --production --prefix ./actions - name: Run Commands diff --git a/.github/workflows/deep-classifier-monitor.yml b/.github/workflows/deep-classifier-monitor.yml new file mode 100644 index 00000000000..7aa6d9de22f --- /dev/null +++ b/.github/workflows/deep-classifier-monitor.yml @@ -0,0 +1,23 @@ +name: "Deep Classifier: Monitor" +on: + issues: + types: [unassigned] + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: v31 + path: ./actions + - name: Install Actions + run: npm install --production --prefix ./actions + - name: "Run Classifier: Monitor" + uses: ./actions/classifier-deep/monitor + with: + botName: vscode-triage-bot + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} diff --git a/.github/workflows/classifier-apply.yml b/.github/workflows/deep-classifier-runner.yml similarity index 60% rename from .github/workflows/classifier-apply.yml rename to .github/workflows/deep-classifier-runner.yml index b00e793e500..4ac237e5f83 100644 --- a/.github/workflows/classifier-apply.yml +++ b/.github/workflows/deep-classifier-runner.yml @@ -1,7 +1,9 @@ -name: "Classifier: Apply" +name: "Deep Classifier: Runner" on: schedule: - - cron: 0,30 * * * * + - cron: 0/30 * * * * + repository_dispatch: + types: [trigger-deep-classifier-runner] jobs: main: @@ -11,7 +13,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v22 # dont bump, we use an old classifier implementation. TODO: dont. + ref: v31 path: ./actions - name: Install Actions run: npm install --production --prefix ./actions @@ -19,13 +21,16 @@ jobs: # Pulls in a bunch of other packages that arent needed for the rest of the actions run: npm install @azure/storage-blob@12 - name: "Run Classifier: Scraper" - uses: ./actions/classifier/apply/fetch-issues + uses: ./actions/classifier-deep/apply/fetch-sources with: # slightly overlapping to protect against issues slipping through the cracks if a run is delayed - from: 45 + from: 40 until: 5 - blobContainerName: classifier-models + configPath: classifier + blobContainerName: vscode-issue-classifier blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} - name: Set up Python 3.7 uses: actions/setup-python@v1 with: @@ -33,11 +38,13 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install --upgrade numpy scipy scikit-learn joblib nltk + pip install --upgrade numpy scipy scikit-learn joblib nltk simpletransformers torch torchvision - name: "Run Classifier: Generator" - run: python ./actions/classifier/apply/generate-labels/main.py + run: python ./actions/classifier-deep/apply/generate-labels/main.py - name: "Run Classifier: Labeler" - uses: ./actions/classifier/apply/apply-labels + uses: ./actions/classifier-deep/apply/apply-labels with: - config-path: classifier + configPath: classifier + allowLabels: "needs more info|new release" + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} diff --git a/.github/workflows/deep-classifier-scraper.yml b/.github/workflows/deep-classifier-scraper.yml new file mode 100644 index 00000000000..c93f2b5352f --- /dev/null +++ b/.github/workflows/deep-classifier-scraper.yml @@ -0,0 +1,27 @@ +name: "Deep Classifier: Scraper" +on: + repository_dispatch: + types: [trigger-deep-classifier-scraper] + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: v31 + path: ./actions + - name: Install Actions + run: npm install --production --prefix ./actions + - name: Install Additional Dependencies + # Pulls in a bunch of other packages that arent needed for the rest of the actions + run: npm install @azure/storage-blob@12 + - name: "Run Classifier: Scraper" + uses: ./actions/classifier-deep/train/fetch-issues + with: + blobContainerName: vscode-issue-classifier + blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} + token: ${{secrets.ISSUE_SCRAPER_TOKEN}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} diff --git a/.github/workflows/english-please.yml b/.github/workflows/english-please.yml index 7efae4bafc1..1ecc532ce88 100644 --- a/.github/workflows/english-please.yml +++ b/.github/workflows/english-please.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v27 + ref: v31 path: ./actions - name: Install Actions if: contains(github.event.issue.labels.*.name, '*english-please') diff --git a/.github/workflows/feature-request.yml b/.github/workflows/feature-request.yml index f681f3ab0d4..893bba74a16 100644 --- a/.github/workflows/feature-request.yml +++ b/.github/workflows/feature-request.yml @@ -18,7 +18,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v27 + ref: v31 - name: Install Actions if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'feature-request') run: npm install --production --prefix ./actions diff --git a/.github/workflows/latest-release-monitor.yml b/.github/workflows/latest-release-monitor.yml index 21127e19f5e..a00d3554147 100644 --- a/.github/workflows/latest-release-monitor.yml +++ b/.github/workflows/latest-release-monitor.yml @@ -2,6 +2,8 @@ name: Latest Release Monitor on: schedule: - cron: 0/5 * * * * + repository_dispatch: + types: [trigger-latest-release-monitor] jobs: main: @@ -12,7 +14,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v27 + ref: v31 - name: Install Actions run: npm install --production --prefix ./actions - name: Install Storage Module @@ -20,6 +22,6 @@ jobs: - name: Run Latest Release Monitor uses: ./actions/latest-release-monitor with: - storageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING_NEW}} + storageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml index f9dbefb567f..d805f6a6428 100644 --- a/.github/workflows/locker.yml +++ b/.github/workflows/locker.yml @@ -14,7 +14,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v27 + ref: v31 - name: Install Actions run: npm install --production --prefix ./actions - name: Run Locker diff --git a/.github/workflows/needs-more-info-closer.yml b/.github/workflows/needs-more-info-closer.yml index a4c4e3396ea..3628c16ca83 100644 --- a/.github/workflows/needs-more-info-closer.yml +++ b/.github/workflows/needs-more-info-closer.yml @@ -14,7 +14,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v27 + ref: v31 - name: Install Actions run: npm install --production --prefix ./actions - name: Run Needs More Info Closer diff --git a/.github/workflows/on-label.yml b/.github/workflows/on-label.yml index 8f9ef71a0e9..97c8ee18e8e 100644 --- a/.github/workflows/on-label.yml +++ b/.github/workflows/on-label.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v27 + ref: v31 path: ./actions - name: Install Actions run: npm install --production --prefix ./actions diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml index 3c9a2ea54df..e8c41404d99 100644 --- a/.github/workflows/on-open.yml +++ b/.github/workflows/on-open.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v27 + ref: v31 path: ./actions - name: Install Actions run: npm install --production --prefix ./actions @@ -48,6 +48,14 @@ jobs: mustNotMatch: "^We have written the needed data into your clipboard because it was too large to send\\. Please paste\\.$" comment: "It looks like you're using the VS Code Issue Reporter but did not paste the text generated into the created issue. We've closed this issue, please open a new one containing the text we placed in your clipboard.\n\nHappy Coding!" + - name: Run Clipboard Labeler (Chinese) + uses: ./actions/regex-labeler + with: + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} + label: "invalid" + mustNotMatch: "^所需的数据太大,无法直接发送。我们已经将其写入剪贴板,请粘贴。$" + comment: "看起来您正在使用 VS Code 问题报告程序,但是没有将生成的文本粘贴到创建的问题中。我们将关闭这个问题,请使用剪贴板中的内容创建一个新的问题。\n\n祝您使用愉快!" + # source of truth in ./english-please.yml - name: Run English Please uses: ./actions/english-please diff --git a/.github/workflows/release-pipeline-labeler.yml b/.github/workflows/release-pipeline-labeler.yml index ebe6d5cab18..bc45221133f 100644 --- a/.github/workflows/release-pipeline-labeler.yml +++ b/.github/workflows/release-pipeline-labeler.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v27 + ref: v31 path: ./actions - name: Checkout Repo if: github.event_name != 'issues' diff --git a/.github/workflows/rich-navigation.yml b/.github/workflows/rich-navigation.yml new file mode 100644 index 00000000000..d1ac9f09921 --- /dev/null +++ b/.github/workflows/rich-navigation.yml @@ -0,0 +1,23 @@ +name: "Rich Navigation Indexing" +on: + pull_request: + push: + branches: + - master + +jobs: + richnav: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - name: Use Node.js + uses: actions/setup-node@v1 + - name: Install dependencies + run: yarn --frozen-lockfile + env: + CHILD_CONCURRENCY: 1 + - uses: microsoft/RichCodeNavIndexer@master + with: + languages: typescript + repo-token: ${{ secrets.GITHUB_TOKEN }} + continue-on-error: true diff --git a/.github/workflows/test-plan-item-validator.yml b/.github/workflows/test-plan-item-validator.yml index 530f51ae695..2dbf0e45871 100644 --- a/.github/workflows/test-plan-item-validator.yml +++ b/.github/workflows/test-plan-item-validator.yml @@ -14,7 +14,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v27 + ref: v31 - name: Install Actions if: contains(github.event.issue.labels.*.name, 'testplan-item') || contains(github.event.issue.labels.*.name, 'invalid-testplan-item') run: npm install --production --prefix ./actions diff --git a/.vscode/launch.json b/.vscode/launch.json index ffc76f2c1e3..a46026d692b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -26,6 +26,7 @@ "type": "pwa-chrome", "request": "attach", "name": "Attach to Shared Process", + "timeout": 30000, "port": 9222, "urlFilter": "*sharedProcess.html*", "presentation": { @@ -57,6 +58,7 @@ "type": "node", "request": "attach", "name": "Attach to Main Process", + "timeout": 30000, "port": 5875, "outFiles": [ "${workspaceFolder}/out/**/*.js" @@ -198,6 +200,7 @@ "env": { "VSCODE_EXTHOST_WILL_SEND_SOCKET": null }, + "cleanUp": "wholeBrowser", "breakOnLoad": false, "urlFilter": "*workbench.html*", "runtimeArgs": [ diff --git a/.vscode/notebooks/inbox.github-issues b/.vscode/notebooks/inbox.github-issues index 9edd342251c..8931e7b0b3b 100644 --- a/.vscode/notebooks/inbox.github-issues +++ b/.vscode/notebooks/inbox.github-issues @@ -2,12 +2,14 @@ { "kind": 1, "language": "markdown", - "value": "##### `Config`: defines the inbox query" + "value": "##### `Config`: defines the inbox query", + "editable": true }, { "kind": 2, "language": "github-issues", - "value": "$inbox=repo:microsoft/vscode is:open no:assignee -label:feature-request -label:testplan-item -label:plan-item " + "value": "$inbox=repo:microsoft/vscode is:open no:assignee -label:feature-request -label:testplan-item -label:plan-item ", + "editable": true }, { "kind": 1, @@ -18,7 +20,7 @@ { "kind": 2, "language": "github-issues", - "value": "$inbox -label:\"needs more info\"", + "value": "$inbox -label:\"needs more info\" -label:emmet", "editable": true }, { @@ -31,6 +33,6 @@ "kind": 2, "language": "github-issues", "value": "$inbox", - "editable": true + "editable": false } ] \ No newline at end of file diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues index c6d2309b392..dc6d33365d7 100644 --- a/.vscode/notebooks/my-work.github-issues +++ b/.vscode/notebooks/my-work.github-issues @@ -20,7 +20,7 @@ { "kind": 2, "language": "github-issues", - "value": "$repos $milestone assignee:@me is:open\n", + "value": "$repos $milestone assignee:@me is:open", "editable": false }, { diff --git a/.vscode/notebooks/verification.github-issues b/.vscode/notebooks/verification.github-issues new file mode 100644 index 00000000000..6f32df8e077 --- /dev/null +++ b/.vscode/notebooks/verification.github-issues @@ -0,0 +1,55 @@ +[ + { + "kind": 1, + "language": "markdown", + "value": "### Bug Verification Queries\n\nBefore shipping we want to verify _all_ bugs. That means when a bug is fixed we check that the fix actually works. It's always best to start with bugs that you have filed and the proceed with bugs that have been filed from users outside the development team. ", + "editable": true + }, + { + "kind": 1, + "language": "markdown", + "value": "#### Config: update list of `repos` and the `milestone`", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks \n$milestone=milestone:\"June 2020\"", + "editable": true + }, + { + "kind": 1, + "language": "markdown", + "value": "### Bugs You Filed", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos $milestone is:closed -assignee:@me label:bug -label:verified -label:*duplicate author:@me", + "editable": false + }, + { + "kind": 1, + "language": "markdown", + "value": "### Bugs From Outside", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos $milestone is:closed -assignee:@me label:bug -label:verified -label:*duplicate -author:@me -assignee:@me label:bug -label:verified -author:@me -author:aeschli -author:alexdima -author:alexr00 -author:bpasero -author:chrisdias -author:chrmarti -author:connor4312 -author:dbaeumer -author:deepak1556 -author:eamodio -author:egamma -author:gregvanl -author:isidorn -author:JacksonKearl -author:joaomoreno -author:jrieken -author:lramos15 -author:lszomoru -author:misolori -author:mjbvz -author:rebornix -author:RMacfarlane -author:roblourens -author:sana-ajani -author:sandy081 -author:sbatten -author:Tyriar -author:weinand", + "editable": false + }, + { + "kind": 1, + "language": "markdown", + "value": "### All" + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos $milestone is:closed -assignee:@me label:bug -label:verified -label:*duplicate", + "editable": false + } +] \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 1ffd534543d..9239eae0d4d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -26,6 +26,7 @@ "test/automation/out/**": true, "test/integration/browser/out/**": true, "src/vs/base/test/node/uri.test.data.txt": true, + "src/vs/workbench/test/browser/api/extHostDocumentData.test.perf-data.ts": true, "src/vs/server": false }, "lcov.path": [ @@ -72,7 +73,7 @@ }, "gulp.autoDetect": "off", "files.insertFinalNewline": true, - "[typescript]": { + "[typescript]": { "editor.defaultFormatter": "vscode.typescript-language-features" }, "typescript.tsc.autoDetect": "off" diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 6c5a87c673a..e7f21525948 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -26,8 +26,8 @@ "message": 3 }, "background": { - "beginsPattern": "Starting compilation", - "endsPattern": "Finished compilation" + "beginsPattern": "\\[watch-client\\].*Starting compilation", + "endsPattern": "\\[watch-client\\].*Finished compilation" } } }, @@ -41,6 +41,43 @@ }, "problemMatcher": "$tsc" }, + { + "type": "npm", + "script": "watch-webd", + "label": "Build Web Extensions", + "group": "build", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "problemMatcher": { + "owner": "typescript", + "applyTo": "closedDocuments", + "fileLocation": [ + "absolute" + ], + "pattern": { + "regexp": "Error: ([^(]+)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\): (.*)$", + "file": 1, + "location": 2, + "message": 3 + }, + "background": { + "beginsPattern": "Starting compilation", + "endsPattern": "Finished compilation" + } + } + }, + { + "type": "npm", + "script": "kill-watch-webd", + "label": "Kill Build Web Extensions", + "group": "build", + "presentation": { + "reveal": "never", + }, + "problemMatcher": "$tsc" + }, { "label": "Run tests", "type": "shell", diff --git a/.yarnrc b/.yarnrc index 1406d749d70..135e10442a7 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://atom.io/download/electron" -target "7.3.1" +target "7.3.2" runtime "electron" diff --git a/README.md b/README.md index 7737ab636af..0ab89500ea0 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,10 @@ Many of the core components and extensions to VS Code live in their own reposito VS Code includes a set of built-in extensions located in the [extensions](extensions) folder, including grammars and snippets for many languages. Extensions that provide rich language support (code completion, Go to Definition) for a language have the suffix `language-features`. For example, the `json` extension provides coloring for `JSON` and the `json-language-features` provides rich language support for `JSON`. +## Development Container + +This repository includes a Visual Studio Code Remote - Containers / Codespaces development container. You can open it using the **Remote-Containers: Open Repository in Container...** from the [Remote - Containers](https://aka.ms/vscode-remote/download/containers) extension or by referencing the repository Git URL when creating a cloud-based environment using the [Visual Studio Codespaces](https://aka.ms/vscs-ext-vscode) extension. See the [development container README](.devcontainer/README.md) for more details on its use. + ## Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. diff --git a/build/.webignore b/build/.webignore new file mode 100644 index 00000000000..1035cb291cc --- /dev/null +++ b/build/.webignore @@ -0,0 +1,27 @@ +# cleanup rules for web node modules, .gitignore style + +**/*.txt +**/*.json +**/*.md +**/*.d.ts +**/*.js.map +**/LICENSE +**/CONTRIBUTORS + +jschardet/index.js +jschardet/src/** +jschardet/dist/jschardet.js + +vscode-textmate/webpack.config.js + +xterm/src/** + +xterm-addon-search/src/** +xterm-addon-search/out/** +xterm-addon-search/fixtures/** + +xterm-addon-unicode11/src/** +xterm-addon-unicode11/out/** + +xterm-addon-webgl/src/** +xterm-addon-webgl/out/** diff --git a/build/azure-pipelines/common/extract-telemetry.sh b/build/azure-pipelines/common/extract-telemetry.sh index 84bbd9c537c..6436e93c8c1 100755 --- a/build/azure-pipelines/common/extract-telemetry.sh +++ b/build/azure-pipelines/common/extract-telemetry.sh @@ -10,10 +10,10 @@ git clone --depth 1 https://github.com/Microsoft/vscode-node-debug2.git git clone --depth 1 https://github.com/Microsoft/vscode-node-debug.git git clone --depth 1 https://github.com/Microsoft/vscode-html-languageservice.git git clone --depth 1 https://github.com/Microsoft/vscode-json-languageservice.git -$BUILD_SOURCESDIRECTORY/build/node_modules/.bin/vscode-telemetry-extractor --sourceDir $BUILD_SOURCESDIRECTORY --excludedDir $BUILD_SOURCESDIRECTORY/extensions --outputDir . --applyEndpoints -$BUILD_SOURCESDIRECTORY/build/node_modules/.bin/vscode-telemetry-extractor --config $BUILD_SOURCESDIRECTORY/build/azure-pipelines/common/telemetry-config.json -o . +node $BUILD_SOURCESDIRECTORY/build/node_modules/.bin/vscode-telemetry-extractor --sourceDir $BUILD_SOURCESDIRECTORY --excludedDir $BUILD_SOURCESDIRECTORY/extensions --outputDir . --applyEndpoints +node $BUILD_SOURCESDIRECTORY/build/node_modules/.bin/vscode-telemetry-extractor --config $BUILD_SOURCESDIRECTORY/build/azure-pipelines/common/telemetry-config.json -o . mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json mv config-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json cd .. -rm -rf extraction \ No newline at end of file +rm -rf extraction diff --git a/build/azure-pipelines/exploration-build.yml b/build/azure-pipelines/exploration-build.yml index e0b1ef7d613..370c56fa6a1 100644 --- a/build/azure-pipelines/exploration-build.yml +++ b/build/azure-pipelines/exploration-build.yml @@ -31,10 +31,10 @@ steps: git config user.email "vscode@microsoft.com" git config user.name "VSCode" - git checkout origin/electron-8.0.x + git checkout origin/electron-x.y.z git merge origin/master # Push master branch into exploration branch - git push origin HEAD:electron-8.0.x + git push origin HEAD:electron-x.y.z displayName: Sync & Merge Exploration diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 466d3dd3328..fb4f3052578 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -218,7 +218,7 @@ steps: restoreSolution: 'build\azure-pipelines\win32\ESRPClient\packages.config' feedsToUse: config nugetConfigPath: 'build\azure-pipelines\win32\ESRPClient\NuGet.config' - externalFeedCredentials: 3fc0b7f7-da09-4ae7-a9c8-d69824b1819b + externalFeedCredentials: 'ESRP Nuget' restoreDirectory: packages - task: ESRPImportCertTask@1 diff --git a/build/builtin/main.js b/build/builtin/main.js index 93cef8cbdad..7379de7a93d 100644 --- a/build/builtin/main.js +++ b/build/builtin/main.js @@ -10,7 +10,7 @@ const path = require('path'); let window = null; app.once('ready', () => { - window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, webviewTag: true, enableWebSQL: false } }); + window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, webviewTag: true, enableWebSQL: false, nativeWindowOpen: true } }); window.setMenuBarVisibility(false); window.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true })); // window.webContents.openDevTools(); diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index 25cccf6d8e5..6f7a9e678b4 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -8,9 +8,11 @@ require('events').EventEmitter.defaultMaxListeners = 100; const gulp = require('gulp'); const path = require('path'); +const nodeUtil = require('util'); const tsb = require('gulp-tsb'); const es = require('event-stream'); const filter = require('gulp-filter'); +const webpack = require('webpack'); const util = require('./lib/util'); const task = require('./lib/task'); const watcher = require('./lib/watch'); @@ -21,6 +23,8 @@ const nlsDev = require('vscode-nls-dev'); const root = path.dirname(__dirname); const commit = util.getVersion(root); const plumber = require('gulp-plumber'); +const fancyLog = require('fancy-log'); +const ansiColors = require('ansi-colors'); const ext = require('./lib/extensions'); const extensionsPath = path.join(path.dirname(__dirname), 'extensions'); @@ -167,3 +171,78 @@ const compileExtensionsBuildTask = task.define('compile-extensions-build', task. gulp.task(compileExtensionsBuildTask); exports.compileExtensionsBuildTask = compileExtensionsBuildTask; + +const compileWebExtensionsTask = task.define('compile-web', () => buildWebExtensions(false)); +gulp.task(compileWebExtensionsTask); +exports.compileWebExtensionsTask = compileWebExtensionsTask; + +const watchWebExtensionsTask = task.define('watch-web', () => buildWebExtensions(true)); +gulp.task(watchWebExtensionsTask); +exports.watchWebExtensionsTask = watchWebExtensionsTask; + +async function buildWebExtensions(isWatch) { + + const webpackConfigLocations = await nodeUtil.promisify(glob)( + path.join(extensionsPath, '**', 'extension-browser.webpack.config.js'), + { ignore: ['**/node_modules'] } + ); + + const webpackConfigs = []; + + for (const webpackConfigPath of webpackConfigLocations) { + const configOrFnOrArray = require(webpackConfigPath); + function addConfig(configOrFn) { + if (typeof configOrFn === 'function') { + webpackConfigs.push(configOrFn({}, {})); + } else { + webpackConfigs.push(configOrFn); + } + } + addConfig(configOrFnOrArray); + } + function reporter(fullStats) { + if (Array.isArray(fullStats.children)) { + for (const stats of fullStats.children) { + const outputPath = stats.outputPath; + if (outputPath) { + const relativePath = path.relative(extensionsPath, outputPath).replace(/\\/g, '/'); + const match = relativePath.match(/[^\/]+(\/server|\/client)?/); + fancyLog(`Finished ${ansiColors.green('packaging web extension')} ${ansiColors.cyan(match[0])} with ${stats.errors.length} errors.`); + } + if (Array.isArray(stats.errors)) { + stats.errors.forEach(error => { + fancyLog.error(error); + }); + } + if (Array.isArray(stats.warnings)) { + stats.warnings.forEach(warning => { + fancyLog.warn(warning); + }); + } + } + } + } + return new Promise((resolve, reject) => { + if (isWatch) { + webpack(webpackConfigs).watch({}, (err, stats) => { + if (err) { + reject(); + } else { + reporter(stats.toJson()); + } + }); + } else { + webpack(webpackConfigs).run((err, stats) => { + if (err) { + fancyLog.error(err); + reject(); + } else { + reporter(stats.toJson()); + resolve(); + } + }); + } + }); +} + + diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 5881bc66e91..4b46a5d856c 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -47,6 +47,7 @@ const nodeModules = ['electron', 'original-fs'] const vscodeEntryPoints = _.flatten([ buildfile.entrypoint('vs/workbench/workbench.desktop.main'), buildfile.base, + buildfile.workerExtensionHost, buildfile.workbenchDesktop, buildfile.code ]); @@ -58,10 +59,12 @@ const vscodeResources = [ 'out-build/bootstrap.js', 'out-build/bootstrap-fork.js', 'out-build/bootstrap-amd.js', + 'out-build/bootstrap-node.js', 'out-build/bootstrap-window.js', 'out-build/paths.js', 'out-build/vs/**/*.{svg,png,html}', '!out-build/vs/code/browser/**/*.html', + '!out-build/vs/editor/standalone/**/*.svg', 'out-build/vs/base/common/performance.js', 'out-build/vs/base/node/languagePacks.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}', @@ -72,6 +75,7 @@ const vscodeResources = [ 'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt', 'out-build/vs/workbench/contrib/webview/browser/pre/*.js', 'out-build/vs/workbench/contrib/webview/electron-browser/pre/*.js', + 'out-build/vs/workbench/services/extensions/worker/extensionHostWorkerMain.js', 'out-build/vs/**/markdown.css', 'out-build/vs/workbench/contrib/tasks/**/*.json', 'out-build/vs/platform/files/**/*.exe', diff --git a/build/lib/eslint/vscode-dts-literal-or-types.js b/build/lib/eslint/vscode-dts-literal-or-types.js index 02e6de876ba..e07dfc6de28 100644 --- a/build/lib/eslint/vscode-dts-literal-or-types.js +++ b/build/lib/eslint/vscode-dts-literal-or-types.js @@ -13,6 +13,10 @@ module.exports = new class ApiLiteralOrTypes { create(context) { return { ['TSTypeAnnotation TSUnionType TSLiteralType']: (node) => { + var _a; + if (((_a = node.literal) === null || _a === void 0 ? void 0 : _a.type) === 'TSNullKeyword') { + return; + } context.report({ node: node, messageId: 'useEnum' diff --git a/build/lib/eslint/vscode-dts-literal-or-types.ts b/build/lib/eslint/vscode-dts-literal-or-types.ts index 01a3eb21523..fe4befd84e7 100644 --- a/build/lib/eslint/vscode-dts-literal-or-types.ts +++ b/build/lib/eslint/vscode-dts-literal-or-types.ts @@ -15,6 +15,9 @@ export = new class ApiLiteralOrTypes implements eslint.Rule.RuleModule { create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { return { ['TSTypeAnnotation TSUnionType TSLiteralType']: (node: any) => { + if (node.literal?.type === 'TSNullKeyword') { + return; + } context.report({ node: node, messageId: 'useEnum' diff --git a/build/lib/extensions.js b/build/lib/extensions.js index f2c586695d2..d289ccf9107 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -4,7 +4,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); -exports.packageMarketplaceExtensionsStream = exports.packageLocalWebExtensionsStream = exports.packageLocalExtensionsStream = exports.fromMarketplace = void 0; +exports.translatePackageJSON = exports.scanBuiltinExtensions = exports.packageMarketplaceWebExtensionsStream = exports.packageMarketplaceExtensionsStream = exports.packageLocalWebExtensionsStream = exports.packageLocalExtensionsStream = exports.fromMarketplace = void 0; const es = require("event-stream"); const fs = require("fs"); const glob = require("glob"); @@ -245,3 +245,75 @@ function packageMarketplaceExtensionsStream() { .pipe(util2.setExecutableBit(['**/*.sh'])); } exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream; +function packageMarketplaceWebExtensionsStream(builtInExtensions) { + const extensions = builtInExtensions + .map(extension => { + const input = fromMarketplace(extension.name, extension.version, extension.metadata) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + return updateExtensionPackageJSON(input, (data) => { + if (data.main) { + data.browser = data.main; + } + data.extensionKind = ['web']; + return data; + }); + }); + return es.merge(extensions); +} +exports.packageMarketplaceWebExtensionsStream = packageMarketplaceWebExtensionsStream; +function scanBuiltinExtensions(extensionsRoot, forWeb) { + const scannedExtensions = []; + const extensionsFolders = fs.readdirSync(extensionsRoot); + for (const extensionFolder of extensionsFolders) { + const packageJSONPath = path.join(extensionsRoot, extensionFolder, 'package.json'); + if (!fs.existsSync(packageJSONPath)) { + continue; + } + let packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString('utf8')); + const extensionKind = packageJSON['extensionKind'] || []; + if (forWeb && extensionKind.indexOf('web') === -1) { + continue; + } + const children = fs.readdirSync(path.join(extensionsRoot, extensionFolder)); + const packageNLS = children.filter(child => child === 'package.nls.json')[0]; + const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0]; + const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; + if (packageNLS) { + // temporary + packageJSON = translatePackageJSON(packageJSON, path.join(extensionsRoot, extensionFolder, packageNLS)); + } + scannedExtensions.push({ + extensionPath: extensionFolder, + packageJSON, + packageNLSPath: packageNLS ? path.join(extensionFolder, packageNLS) : undefined, + readmePath: readme ? path.join(extensionFolder, readme) : undefined, + changelogPath: changelog ? path.join(extensionFolder, changelog) : undefined, + }); + } + return scannedExtensions; +} +exports.scanBuiltinExtensions = scanBuiltinExtensions; +function translatePackageJSON(packageJSON, packageNLSPath) { + const CharCode_PC = '%'.charCodeAt(0); + const packageNls = JSON.parse(fs.readFileSync(packageNLSPath).toString()); + const translate = (obj) => { + for (let key in obj) { + const val = obj[key]; + if (Array.isArray(val)) { + val.forEach(translate); + } + else if (val && typeof val === 'object') { + translate(val); + } + else if (typeof val === 'string' && val.charCodeAt(0) === CharCode_PC && val.charCodeAt(val.length - 1) === CharCode_PC) { + const translated = packageNls[val.substr(1, val.length - 2)]; + if (translated) { + obj[key] = translated; + } + } + } + }; + translate(packageJSON); + return packageJSON; +} +exports.translatePackageJSON = translatePackageJSON; diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index f64f813d947..3810723d7d4 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -78,7 +78,7 @@ function fromLocal(extensionPath: string, forWeb: boolean): Stream { }); } - return minimizeLanguageJSON(input) + return minimizeLanguageJSON(input); } @@ -291,3 +291,82 @@ export function packageMarketplaceExtensionsStream(): NodeJS.ReadWriteStream { return es.merge(extensions) .pipe(util2.setExecutableBit(['**/*.sh'])); } + +export function packageMarketplaceWebExtensionsStream(builtInExtensions: IBuiltInExtension[]): NodeJS.ReadWriteStream { + const extensions = builtInExtensions + .map(extension => { + const input = fromMarketplace(extension.name, extension.version, extension.metadata) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + return updateExtensionPackageJSON(input, (data: any) => { + if (data.main) { + data.browser = data.main; + } + data.extensionKind = ['web']; + return data; + }); + }); + return es.merge(extensions); +} + +export interface IScannedBuiltinExtension { + extensionPath: string, + packageJSON: any, + packageNLSPath?: string, + readmePath?: string, + changelogPath?: string, +} + +export function scanBuiltinExtensions(extensionsRoot: string, forWeb: boolean): IScannedBuiltinExtension[] { + const scannedExtensions: IScannedBuiltinExtension[] = []; + const extensionsFolders = fs.readdirSync(extensionsRoot); + for (const extensionFolder of extensionsFolders) { + const packageJSONPath = path.join(extensionsRoot, extensionFolder, 'package.json'); + if (!fs.existsSync(packageJSONPath)) { + continue; + } + let packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString('utf8')); + const extensionKind: string[] = packageJSON['extensionKind'] || []; + if (forWeb && extensionKind.indexOf('web') === -1) { + continue; + } + const children = fs.readdirSync(path.join(extensionsRoot, extensionFolder)); + const packageNLS = children.filter(child => child === 'package.nls.json')[0]; + const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0]; + const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; + + if (packageNLS) { + // temporary + packageJSON = translatePackageJSON(packageJSON, path.join(extensionsRoot, extensionFolder, packageNLS)) + } + scannedExtensions.push({ + extensionPath: extensionFolder, + packageJSON, + packageNLSPath: packageNLS ? path.join(extensionFolder, packageNLS) : undefined, + readmePath: readme ? path.join(extensionFolder, readme) : undefined, + changelogPath: changelog ? path.join(extensionFolder, changelog) : undefined, + }); + } + return scannedExtensions; +} + +export function translatePackageJSON(packageJSON: string, packageNLSPath: string) { + const CharCode_PC = '%'.charCodeAt(0); + const packageNls = JSON.parse(fs.readFileSync(packageNLSPath).toString()); + const translate = (obj: any) => { + for (let key in obj) { + const val = obj[key]; + if (Array.isArray(val)) { + val.forEach(translate); + } else if (val && typeof val === 'object') { + translate(val); + } else if (typeof val === 'string' && val.charCodeAt(0) === CharCode_PC && val.charCodeAt(val.length - 1) === CharCode_PC) { + const translated = packageNls[val.substr(1, val.length - 2)]; + if (translated) { + obj[key] = translated; + } + } + } + }; + translate(packageJSON); + return packageJSON; +} diff --git a/build/lib/i18n.js b/build/lib/i18n.js index 2e7415cd721..def00ab6cc3 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -16,7 +16,7 @@ const https = require("https"); const gulp = require("gulp"); const fancyLog = require("fancy-log"); const ansiColors = require("ansi-colors"); -const iconv = require("iconv-lite"); +const iconv = require("iconv-lite-umd"); const NUMBER_OF_CONCURRENT_DOWNLOADS = 4; function log(message, ...rest) { fancyLog(ansiColors.green('[i18n]'), message, ...rest); @@ -101,161 +101,158 @@ class TextModel { return this._lines; } } -let XLF = /** @class */ (() => { - class XLF { - constructor(project) { - this.project = project; - this.buffer = []; - this.files = Object.create(null); - this.numberOfMessages = 0; +class XLF { + constructor(project) { + this.project = project; + this.buffer = []; + this.files = Object.create(null); + this.numberOfMessages = 0; + } + toString() { + this.appendHeader(); + for (let file in this.files) { + this.appendNewLine(``, 2); + for (let item of this.files[file]) { + this.addStringItem(file, item); + } + this.appendNewLine('', 2); } - toString() { - this.appendHeader(); - for (let file in this.files) { - this.appendNewLine(``, 2); - for (let item of this.files[file]) { - this.addStringItem(file, item); + this.appendFooter(); + return this.buffer.join('\r\n'); + } + addFile(original, keys, messages) { + if (keys.length === 0) { + console.log('No keys in ' + original); + return; + } + if (keys.length !== messages.length) { + throw new Error(`Unmatching keys(${keys.length}) and messages(${messages.length}).`); + } + this.numberOfMessages += keys.length; + this.files[original] = []; + let existingKeys = new Set(); + for (let i = 0; i < keys.length; i++) { + let key = keys[i]; + let realKey; + let comment; + if (Is.string(key)) { + realKey = key; + comment = undefined; + } + else if (LocalizeInfo.is(key)) { + realKey = key.key; + if (key.comment && key.comment.length > 0) { + comment = key.comment.map(comment => encodeEntities(comment)).join('\r\n'); } - this.appendNewLine('', 2); } - this.appendFooter(); - return this.buffer.join('\r\n'); - } - addFile(original, keys, messages) { - if (keys.length === 0) { - console.log('No keys in ' + original); - return; + if (!realKey || existingKeys.has(realKey)) { + continue; } - if (keys.length !== messages.length) { - throw new Error(`Unmatching keys(${keys.length}) and messages(${messages.length}).`); - } - this.numberOfMessages += keys.length; - this.files[original] = []; - let existingKeys = new Set(); - for (let i = 0; i < keys.length; i++) { - let key = keys[i]; - let realKey; - let comment; - if (Is.string(key)) { - realKey = key; - comment = undefined; - } - else if (LocalizeInfo.is(key)) { - realKey = key.key; - if (key.comment && key.comment.length > 0) { - comment = key.comment.map(comment => encodeEntities(comment)).join('\r\n'); - } - } - if (!realKey || existingKeys.has(realKey)) { - continue; - } - existingKeys.add(realKey); - let message = encodeEntities(messages[i]); - this.files[original].push({ id: realKey, message: message, comment: comment }); - } - } - addStringItem(file, item) { - if (!item.id || item.message === undefined || item.message === null) { - throw new Error(`No item ID or value specified: ${JSON.stringify(item)}. File: ${file}`); - } - if (item.message.length === 0) { - log(`Item with id ${item.id} in file ${file} has an empty message.`); - } - this.appendNewLine(``, 4); - this.appendNewLine(`${item.message}`, 6); - if (item.comment) { - this.appendNewLine(`${item.comment}`, 6); - } - this.appendNewLine('', 4); - } - appendHeader() { - this.appendNewLine('', 0); - this.appendNewLine('', 0); - } - appendFooter() { - this.appendNewLine('', 0); - } - appendNewLine(content, indent) { - let line = new Line(indent); - line.append(content); - this.buffer.push(line.toString()); + existingKeys.add(realKey); + let message = encodeEntities(messages[i]); + this.files[original].push({ id: realKey, message: message, comment: comment }); } } - XLF.parsePseudo = function (xlfString) { - return new Promise((resolve) => { - let parser = new xml2js.Parser(); - let files = []; - parser.parseString(xlfString, function (_err, result) { - const fileNodes = result['xliff']['file']; - fileNodes.forEach(file => { - const originalFilePath = file.$.original; - const messages = {}; - const transUnits = file.body[0]['trans-unit']; - if (transUnits) { - transUnits.forEach((unit) => { - const key = unit.$.id; - const val = pseudify(unit.source[0]['_'].toString()); - if (key && val) { - messages[key] = decodeEntities(val); - } - }); - files.push({ messages: messages, originalFilePath: originalFilePath, language: 'ps' }); - } - }); - resolve(files); - }); - }); - }; - XLF.parse = function (xlfString) { - return new Promise((resolve, reject) => { - let parser = new xml2js.Parser(); - let files = []; - parser.parseString(xlfString, function (err, result) { - if (err) { - reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`)); - } - const fileNodes = result['xliff']['file']; - if (!fileNodes) { - reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`)); - } - fileNodes.forEach((file) => { - const originalFilePath = file.$.original; - if (!originalFilePath) { - reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`)); - } - let language = file.$['target-language']; - if (!language) { - reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`)); - } - const messages = {}; - const transUnits = file.body[0]['trans-unit']; - if (transUnits) { - transUnits.forEach((unit) => { - const key = unit.$.id; - if (!unit.target) { - return; // No translation available - } - let val = unit.target[0]; - if (typeof val !== 'string') { - val = val._; - } - if (key && val) { - messages[key] = decodeEntities(val); - } - else { - reject(new Error(`XLF parsing error: XLIFF file ${originalFilePath} does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.`)); - } - }); - files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() }); - } - }); - resolve(files); - }); - }); - }; - return XLF; -})(); + addStringItem(file, item) { + if (!item.id || item.message === undefined || item.message === null) { + throw new Error(`No item ID or value specified: ${JSON.stringify(item)}. File: ${file}`); + } + if (item.message.length === 0) { + log(`Item with id ${item.id} in file ${file} has an empty message.`); + } + this.appendNewLine(``, 4); + this.appendNewLine(`${item.message}`, 6); + if (item.comment) { + this.appendNewLine(`${item.comment}`, 6); + } + this.appendNewLine('', 4); + } + appendHeader() { + this.appendNewLine('', 0); + this.appendNewLine('', 0); + } + appendFooter() { + this.appendNewLine('', 0); + } + appendNewLine(content, indent) { + let line = new Line(indent); + line.append(content); + this.buffer.push(line.toString()); + } +} exports.XLF = XLF; +XLF.parsePseudo = function (xlfString) { + return new Promise((resolve) => { + let parser = new xml2js.Parser(); + let files = []; + parser.parseString(xlfString, function (_err, result) { + const fileNodes = result['xliff']['file']; + fileNodes.forEach(file => { + const originalFilePath = file.$.original; + const messages = {}; + const transUnits = file.body[0]['trans-unit']; + if (transUnits) { + transUnits.forEach((unit) => { + const key = unit.$.id; + const val = pseudify(unit.source[0]['_'].toString()); + if (key && val) { + messages[key] = decodeEntities(val); + } + }); + files.push({ messages: messages, originalFilePath: originalFilePath, language: 'ps' }); + } + }); + resolve(files); + }); + }); +}; +XLF.parse = function (xlfString) { + return new Promise((resolve, reject) => { + let parser = new xml2js.Parser(); + let files = []; + parser.parseString(xlfString, function (err, result) { + if (err) { + reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`)); + } + const fileNodes = result['xliff']['file']; + if (!fileNodes) { + reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`)); + } + fileNodes.forEach((file) => { + const originalFilePath = file.$.original; + if (!originalFilePath) { + reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`)); + } + let language = file.$['target-language']; + if (!language) { + reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`)); + } + const messages = {}; + const transUnits = file.body[0]['trans-unit']; + if (transUnits) { + transUnits.forEach((unit) => { + const key = unit.$.id; + if (!unit.target) { + return; // No translation available + } + let val = unit.target[0]; + if (typeof val !== 'string') { + val = val._; + } + if (key && val) { + messages[key] = decodeEntities(val); + } + else { + reject(new Error(`XLF parsing error: XLIFF file ${originalFilePath} does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.`)); + } + }); + files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() }); + } + }); + resolve(files); + }); + }); +}; class Limiter { constructor(maxDegreeOfParalellism) { this.maxDegreeOfParalellism = maxDegreeOfParalellism; @@ -1178,9 +1175,10 @@ function createIslFile(originalFilePath, messages, language, innoSetup) { }); const basename = path.basename(originalFilePath); const filePath = `${basename}.${language.id}.isl`; + const encoded = iconv.encode(Buffer.from(content.join('\r\n'), 'utf8').toString(), innoSetup.codePage); return new File({ path: filePath, - contents: iconv.encode(Buffer.from(content.join('\r\n'), 'utf8').toString(), innoSetup.codePage) + contents: Buffer.from(encoded), }); } function encodeEntities(value) { diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index 93a6992e411..9bba404c243 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -218,6 +218,10 @@ "name": "vs/workbench/contrib/userDataSync", "project": "vscode-workbench" }, + { + "name": "vs/workbench/contrib/views", + "project": "vscode-workbench" + }, { "name": "vs/workbench/services/actions", "project": "vscode-workbench" diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index b9fb3879872..7e386a7fd6f 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -15,7 +15,7 @@ import * as https from 'https'; import * as gulp from 'gulp'; import * as fancyLog from 'fancy-log'; import * as ansiColors from 'ansi-colors'; -import * as iconv from 'iconv-lite'; +import * as iconv from 'iconv-lite-umd'; const NUMBER_OF_CONCURRENT_DOWNLOADS = 4; @@ -1339,10 +1339,11 @@ function createIslFile(originalFilePath: string, messages: Map, language const basename = path.basename(originalFilePath); const filePath = `${basename}.${language.id}.isl`; + const encoded = iconv.encode(Buffer.from(content.join('\r\n'), 'utf8').toString(), innoSetup.codePage); return new File({ path: filePath, - contents: iconv.encode(Buffer.from(content.join('\r\n'), 'utf8').toString(), innoSetup.codePage) + contents: Buffer.from(encoded), }); } diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index 7b8b710636a..ef8fa4a47f6 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -73,3 +73,5 @@ yarnInstall('test/automation'); // node modules required for smoketest yarnInstall('test/smoke'); // node modules required for smoketest yarnInstall('test/integration/browser'); // node modules required for integration yarnInstallBuildDependencies(); // node modules for watching, specific to host node version, not electron + +cp.execSync('git config pull.rebase true'); diff --git a/build/package.json b/build/package.json index ecff6c7a182..5fb14851a21 100644 --- a/build/package.json +++ b/build/package.json @@ -38,15 +38,15 @@ "gulp-bom": "^1.0.0", "gulp-sourcemaps": "^1.11.0", "gulp-uglify": "^3.0.0", - "iconv-lite": "0.4.23", + "iconv-lite-umd": "0.6.5", "mime": "^1.3.4", "minimatch": "3.0.4", "minimist": "^1.2.3", "request": "^2.85.0", "terser": "4.3.8", - "typescript": "^3.9.3", + "typescript": "^4.0.0-dev.20200629", "vsce": "1.48.0", - "vscode-telemetry-extractor": "^1.5.4", + "vscode-telemetry-extractor": "^1.6.0", "xml2js": "^0.4.17" }, "scripts": { diff --git a/build/win32/code.iss b/build/win32/code.iss index 74773730071..f1d4e8b747c 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -1132,7 +1132,7 @@ begin end; end; -// http://stackoverflow.com/a/23838239/261019 +// https://stackoverflow.com/a/23838239/261019 procedure Explode(var Dest: TArrayOfString; Text: String; Separator: String); var i, p: Integer; diff --git a/build/yarn.lock b/build/yarn.lock index 8f615cb4e6c..f10fe7302e6 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -394,6 +394,11 @@ acorn@4.X: resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -845,7 +850,7 @@ debug@2.X, debug@^2.6.8: dependencies: ms "2.0.0" -debug@^4.1.1: +debug@4, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -1415,12 +1420,18 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== dependencies: - safer-buffer ">= 2.1.2 < 3" + agent-base "5" + debug "4" + +iconv-lite-umd@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.5.tgz#6a1f621a3b4d125f72feff813a9839e1ebd6c722" + integrity sha512-WDegH4al+e3n3jTOStRvm+jzDA3JMUQGgzdAsMxAgcgB0Oi72HjfdsoX08ieKsy3rKexXVjWZr41aOIUaCZnMg== ignore@^5.1.1: version "5.1.2" @@ -2053,6 +2064,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -2228,11 +2244,6 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - sax@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.2.tgz#735ffaa39a1cff8ffb9598f0223abdb03a9fb2ea" @@ -2519,10 +2530,10 @@ typescript@^3.0.1: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== -typescript@^3.9.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== +typescript@^4.0.0-dev.20200629: + version "4.0.0-dev.20200629" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.0-dev.20200629.tgz#4631667ebffe3a340beee885a4bebe3a73b6f18e" + integrity sha512-c4DUu7KvTcx4x7V8sBWexYNkCfioiH1huOJL6WFAA8Oot0Gr/+PlKKDBS9fYjsadEv1JI1qboJKobwLQn0kQXw== typical@^4.0.0: version "4.0.0" @@ -2654,19 +2665,22 @@ vsce@1.48.0: yauzl "^2.3.1" yazl "^2.2.2" -vscode-ripgrep@^1.5.6: - version "1.5.7" - resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.5.7.tgz#acb6b548af488a4bca5d0f1bb5faf761343289ce" - integrity sha512-/Vsz/+k8kTvui0q3O74pif9FK0nKopgFTiGNVvxicZANxtSA8J8gUE9GQ/4dpi7D/2yI/YVORszwVskFbz46hQ== +vscode-ripgrep@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.6.2.tgz#fb912c7465699f10ce0218a6676cc632c77369b4" + integrity sha512-jkZEWnQFcE+QuQFfxQXWcWtDafTmgkp3DjMKawDkajZwgnDlGKpFp15ybKrZNVTi1SLEF/12BzxYSZVVZ2XrkA== + dependencies: + https-proxy-agent "^4.0.0" + proxy-from-env "^1.1.0" -vscode-telemetry-extractor@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/vscode-telemetry-extractor/-/vscode-telemetry-extractor-1.5.4.tgz#bcb0d17667fa1b77715e3a3bf372ade18f846782" - integrity sha512-MN9LNPo0Rc6cy3sIWTAG97PTWkEKdRnP0VeYoS8vjKSNtG9CAsrUxHgFfYoHm2vNK/ijd0a4NzETyVGO2kT6hw== +vscode-telemetry-extractor@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vscode-telemetry-extractor/-/vscode-telemetry-extractor-1.6.0.tgz#e9d9c1d24863cce8d3d715f0287de3b31eb90c56" + integrity sha512-zSxvkbyAMa1lTRGIHfGg7gW2e9Sey+2zGYD19uNWCsVEfoXAr2NB6uzb0sNHtbZ2SSqxSePmFXzBAavsudT5fw== dependencies: command-line-args "^5.1.1" ts-morph "^3.1.3" - vscode-ripgrep "^1.5.6" + vscode-ripgrep "^1.6.2" vso-node-api@6.1.2-preview: version "6.1.2-preview" diff --git a/cglicenses.json b/cglicenses.json index fcbac22e310..f2d5a39a2b1 100644 --- a/cglicenses.json +++ b/cglicenses.json @@ -200,6 +200,135 @@ }, { "name": "big-integer", - "prependLicenseText": ["Copyright released to public domain"] + "prependLicenseText": [ + "Copyright released to public domain" + ] + }, + { + // Reason: The license at https://github.com/justmoon/node-extend/blob/main/LICENSE + // cannot be found by the OSS tool automatically. + "name": "extend", + "fullLicenseText": [ + "The MIT License (MIT)", + "", + "Copyright (c) 2014 Stefan Thomas", + "", + "Permission is hereby granted, free of charge, to any person obtaining", + "a copy of this software and associated documentation files (the", + "\"Software\"), to deal in the Software without restriction, including", + "without limitation the rights to use, copy, modify, merge, publish,", + "distribute, sublicense, and/or sell copies of the Software, and to", + "permit persons to whom the Software is furnished to do so, subject to", + "the following conditions:", + "", + "The above copyright notice and this permission notice shall be", + "included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,", + "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", + "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND", + "NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE", + "LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION", + "WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] + }, + { + // Reason: The license at https://github.com/retep998/winapi-rs/blob/0.3/LICENSE-MIT + // cannot be found by the OSS tool automatically. + "name": "retep998/winapi-rs", + "fullLicenseText": [ + "Copyright (c) 2015-2018 The winapi-rs Developers", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ] + }, + { + // Reason: The license at https://github.com/digitaldesignlabs/es6-promisify/blob/main/LICENSE + // cannot be found by the OSS tool automatically. + "name": "es6-promisify", + "fullLicenseText": [ + "Copyright (c) 2014 Mike Hall / Digital Design Labs", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ] + }, + { + // Reason: The license at https://github.com/zkat/json-parse-better-errors/blob/latest/LICENSE.md + // cannot be found by the OSS tool automatically. + "name": "json-parse-better-errors", + "fullLicenseText": [ + "Copyright 2017 Kat Marchán", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the", + "\"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute,", + "sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE", + "WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS", + "OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR", + "OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] + }, + { + // Reason: The license at https://github.com/time-rs/time/blob/main/LICENSE-MIT + // cannot be found by the OSS tool automatically. + "name": "time-rs/time", + "fullLicenseText": [ + "Copyright (c) 2019 Jacob Pratt", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ] } ] diff --git a/cgmanifest.json b/cgmanifest.json index b1fd733d7ea..cb9954628dd 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -60,12 +60,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "bc8fc0d406d32e4c02f3ec9f161deaacbe4f5989" + "commitHash": "5f93e889020d279d5a9cd1ecab080ab467312447" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "7.3.1" + "version": "7.3.2" }, { "component": { @@ -77,6 +77,40 @@ } }, "isOnlyProductionDependency": true, + "licenseDetail": [ + "Inno Setup License", + "==================", + "", + "Except where otherwise noted, all of the documentation and software included in the Inno Setup", + "package is copyrighted by Jordan Russell.", + "", + "Copyright (C) 1997-2020 Jordan Russell. All rights reserved.", + "Portions Copyright (C) 2000-2020 Martijn Laan. All rights reserved.", + "", + "This software is provided \"as-is,\" without any express or implied warranty. In no event shall the", + "author be held liable for any damages arising from the use of this software.", + "", + "Permission is granted to anyone to use this software for any purpose, including commercial", + "applications, and to alter and redistribute it, provided that the following conditions are met:", + "", + "1. All redistributions of source code files must retain all copyright notices that are currently in", + " place, and this list of conditions without modification.", + "", + "2. All redistributions in binary form must retain all occurrences of the above copyright notice and", + " web site addresses that are currently in place (for example, in the About boxes).", + "", + "3. The origin of this software must not be misrepresented; you must not claim that you wrote the", + " original software. If you use this software to distribute a product, an acknowledgment in the", + " product documentation would be appreciated but is not required.", + "", + "4. Modified versions in source or binary form must be plainly marked as such, and must not be", + " misrepresented as being the original software.", + "", + "", + "Jordan Russell", + "jr-2010 AT jrsoftware.org", + "https://jrsoftware.org/" + ], "version": "5.5.6" }, { @@ -499,7 +533,7 @@ "git": { "name": "ripgrep", "repositoryUrl": "https://github.com/BurntSushi/ripgrep", - "commitHash": "8a7db1a918e969b85cd933d8ed9fa5285b281ba4" + "commitHash": "973de50c9ef451da2cfcdfa86f2b2711d8d6ff48" } }, "isOnlyProductionDependency": true, diff --git a/extensions/configuration-editing/extension-browser.webpack.config.js b/extensions/configuration-editing/extension-browser.webpack.config.js index 22f2aa2d67a..de941625373 100644 --- a/extensions/configuration-editing/extension-browser.webpack.config.js +++ b/extensions/configuration-editing/extension-browser.webpack.config.js @@ -7,27 +7,15 @@ 'use strict'; -const withDefaults = require('../shared.webpack.config'); -const path = require('path'); +const withBrowserDefaults = require('../shared.webpack.config').browser; -const clientConfig = withDefaults({ - target: 'webworker', +module.exports = withBrowserDefaults({ context: __dirname, entry: { extension: './src/configurationEditingMain.ts' }, output: { filename: 'configurationEditingMain.js' - }, - performance: { - hints: false - }, - resolve: { - alias: { - 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') - } } }); -clientConfig.module.rules[0].use.shift(); // remove nls loader -module.exports = clientConfig; diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index 023745d0c28..477d530a0ed 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -13,7 +13,7 @@ "onLanguage:jsonc" ], "main": "./out/configurationEditingMain", - "browser": "./dist/configurationEditingMain", + "browser": "./dist/browser/configurationEditingMain", "scripts": { "compile": "gulp compile-extension:configuration-editing", "watch": "gulp watch-extension:configuration-editing" @@ -117,6 +117,10 @@ "fileMatch": "/.devcontainer.json", "url": "./schemas/devContainer.schema.json" }, + { + "fileMatch": "%APP_SETTINGS_HOME%/globalStorage/ms-vscode-remote.remote-containers/nameConfigs/*.json", + "url": "./schemas/attachContainer.schema.json" + }, { "fileMatch": "%APP_SETTINGS_HOME%/globalStorage/ms-vscode-remote.remote-containers/imageConfigs/*.json", "url": "./schemas/attachContainer.schema.json" diff --git a/extensions/configuration-editing/schemas/attachContainer.schema.json b/extensions/configuration-editing/schemas/attachContainer.schema.json index c5d46bb836f..da06cb1c9ff 100644 --- a/extensions/configuration-editing/schemas/attachContainer.schema.json +++ b/extensions/configuration-editing/schemas/attachContainer.schema.json @@ -42,8 +42,8 @@ "description": "An array of extensions that should be installed into the container.", "items": { "type": "string", - "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)$", - "errorMessage": "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'." + "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)(@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$", + "errorMessage": "Expected format: '${publisher}.${name}' or '${publisher}.${name}@${version}'. Example: 'ms-dotnettools.csharp'." } }, "postAttachCommand": { diff --git a/extensions/configuration-editing/schemas/devContainer.schema.json b/extensions/configuration-editing/schemas/devContainer.schema.json index abf7469d356..596672dede5 100644 --- a/extensions/configuration-editing/schemas/devContainer.schema.json +++ b/extensions/configuration-editing/schemas/devContainer.schema.json @@ -17,8 +17,8 @@ "description": "An array of extensions that should be installed into the container.", "items": { "type": "string", - "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)$", - "errorMessage": "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'." + "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)(@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$", + "errorMessage": "Expected format: '${publisher}.${name}' or '${publisher}.${name}@${version}'. Example: 'ms-dotnettools.csharp'." } }, "settings": { diff --git a/extensions/cpp/cgmanifest.json b/extensions/cpp/cgmanifest.json index 1690f2220d1..070312a63e4 100644 --- a/extensions/cpp/cgmanifest.json +++ b/extensions/cpp/cgmanifest.json @@ -19,7 +19,7 @@ "git": { "name": "textmate/c.tmbundle", "repositoryUrl": "https://github.com/textmate/c.tmbundle", - "commitHash": "9aa365882274ca52f01722f3dbb169b9539a20ee" + "commitHash": "60daf83b9d45329524f7847a75e9298b3aae5805" } }, "licenseDetail": [ @@ -42,4 +42,4 @@ } ], "version": 1 -} +} \ No newline at end of file diff --git a/extensions/cpp/syntaxes/platform.tmLanguage.json b/extensions/cpp/syntaxes/platform.tmLanguage.json index 14fb45016c0..0147e6629a2 100644 --- a/extensions/cpp/syntaxes/platform.tmLanguage.json +++ b/extensions/cpp/syntaxes/platform.tmLanguage.json @@ -4,23 +4,131 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/textmate/c.tmbundle/commit/9aa365882274ca52f01722f3dbb169b9539a20ee", + "version": "https://github.com/textmate/c.tmbundle/commit/60daf83b9d45329524f7847a75e9298b3aae5805", "name": "Platform", "scopeName": "source.c.platform", - "comment": "This file was generated with clang-C using MacOSX10.12.sdk", + "comment": "This file was generated with clang-C using MacOSX10.15.sdk", "patterns": [ + { + "match": "\\bkAudioUnitSubType_3DMixer\\b", + "name": "invalid.deprecated.10.10.support.constant.c" + }, { "match": "\\bkCF(?:CalendarUnitWeek|Gregorian(?:AllUnits|Units(?:Days|Hours|M(?:inutes|onths)|Seconds|Years)))\\b", "name": "invalid.deprecated.10.10.support.constant.cf.c" }, + { + "match": "\\bLS(?:ApplicationParameters|LaunchFSRefSpec)\\b", + "name": "invalid.deprecated.10.10.support.type.c" + }, { "match": "\\bCFGregorian(?:Date|Units)\\b", "name": "invalid.deprecated.10.10.support.type.cf.c" }, { - "match": "\\bkCFURL(?:CustomIconKey|EffectiveIconKey|LabelColorKey)\\b", + "match": "\\bkLSItem(?:ContentType|Display(?:Kind|Name)|Extension(?:IsHidden)?|File(?:Creator|Type)|IsInvisible|QuarantineProperties|RoleHandlerDisplayName)\\b", + "name": "invalid.deprecated.10.10.support.variable.c" + }, + { + "match": "\\bk(?:AudioUnitProperty_(?:3DMixer(?:AttenuationCurve|Distance(?:Atten|Params)|RenderingFlags)|D(?:istanceAttenuationData|opplerShift)|ReverbPreset)|CT(?:Adobe(?:CNS1CharacterCollection|GB1CharacterCollection|Japan(?:1CharacterCollection|2CharacterCollection)|Korea1CharacterCollection)|CenterTextAlignment|Font(?:A(?:lertHeaderFontType|pplicationFontType)|ControlContentFontType|DefaultOrientation|EmphasizedSystem(?:DetailFontType|FontType)|HorizontalOrientation|LabelFontType|M(?:e(?:nu(?:Item(?:CmdKeyFontType|FontType|MarkFontType)|TitleFontType)|ssageFontType)|ini(?:EmphasizedSystemFontType|SystemFontType))|NoFontType|P(?:aletteFontType|ushButtonFontType)|S(?:mall(?:EmphasizedSystemFontType|SystemFontType|ToolbarFontType)|ystem(?:DetailFontType|FontType))|Tool(?:TipFontType|barFontType)|U(?:serF(?:ixedPitchFontType|ontType)|tilityWindowTitleFontType)|V(?:erticalOrientation|iewsFontType)|WindowTitleFontType)|IdentityMappingCharacterCollection|JustifiedTextAlignment|LeftTextAlignment|NaturalTextAlignment|RightTextAlignment)|LS(?:HandlerOptions(?:Default|IgnoreCreator)|ItemInfo(?:App(?:IsScriptable|Prefers(?:Classic|Native))|ExtensionIsHidden|Is(?:A(?:liasFile|pplication)|C(?:lassicApp|ontainer)|Invisible|NativeApp|P(?:ackage|lainFile)|Symlink|Volume))|Launch(?:InClassic|StartClassic)|Request(?:A(?:ll(?:Flags|Info)|ppTypeFlags)|BasicFlagsOnly|Extension(?:FlagsOnly)?|IconAndKind|TypeCreator)))\\b", + "name": "invalid.deprecated.10.11.support.constant.c" + }, + { + "match": "\\b(?:AUDistanceAttenuationData|LSItemInfoRecord)\\b", + "name": "invalid.deprecated.10.11.support.type.c" + }, + { + "match": "\\bk(?:C(?:F(?:FTPResource(?:Group|Link|Mod(?:Date|e)|Name|Owner|Size|Type)|Stream(?:NetworkServiceTypeVoIP|Property(?:FTP(?:AttemptPersistentConnection|F(?:etchResourceInfo|ileTransferOffset)|P(?:assword|roxy(?:Host|P(?:assword|ort)|User)?)|ResourceSize|Use(?:PassiveMode|rName))|HTTP(?:AttemptPersistentConnection|Final(?:Request|URL)|Proxy(?:Host|Port)?|Re(?:questBytesWrittenCount|sponseHeader)|S(?:Proxy(?:Host|Port)|houldAutoredirect)))))|GImagePropertyExifSubsecTimeOrginal|TCharacterShapeAttributeName)|IOSurfaceIsGlobal|LSSharedFileList(?:Favorite(?:Items|Volumes)|Item(?:BeforeFirst|Hidden|Last)|LoginItemHidden|Recent(?:ApplicationItems|DocumentItems|ItemsMaxAmount|ServerItems)|SessionLoginItems|Volumes(?:ComputerVisible|NetworkVisible))|SecUseNoAuthenticationUI)\\b", + "name": "invalid.deprecated.10.11.support.variable.c" + }, + { + "match": "\\bkLSLaunch(?:HasUntrustedContents|InhibitBGOnly|NoParams)\\b", + "name": "invalid.deprecated.10.12.support.constant.c" + }, + { + "match": "\\bOSSpinLock\\b", + "name": "invalid.deprecated.10.12.support.type.c" + }, + { + "match": "\\bkSC(?:EntNetPPTP|NetworkInterfaceTypePPTP|ValNetInterfaceSubTypePPTP)\\b", + "name": "invalid.deprecated.10.12.support.variable.c" + }, + { + "match": "\\bkCF(?:StreamSocketSecurityLevelSSLv(?:2|3)|URL(?:CustomIconKey|EffectiveIconKey|LabelColorKey))\\b", "name": "invalid.deprecated.10.12.support.variable.cf.c" }, + { + "match": "\\bk(?:C(?:FNetDiagnostic(?:Connection(?:Down|Indeterminate|Up)|Err|NoErr)|TFontManagerAutoActivationPromptUser)|SecAccessControlTouchID(?:Any|CurrentSet))\\b", + "name": "invalid.deprecated.10.13.support.constant.c" + }, + { + "match": "\\bCFNetDiagnosticStatus\\b", + "name": "invalid.deprecated.10.13.support.type.c" + }, + { + "match": "\\bkS(?:CPropNetInterfaceSupportsModemOnHold|SLSessionConfig_(?:3DES_fallback|RC4_fallback|TLSv1_(?:3DES_fallback|RC4_fallback)|default)|ecTrustCertificateTransparencyWhiteList)\\b", + "name": "invalid.deprecated.10.13.support.variable.c" + }, + { + "match": "\\bk(?:CVOpenGL(?:Buffer(?:Height|InternalFormat|MaximumMipmapLevel|PoolM(?:aximumBufferAgeKey|inimumBufferCountKey)|Target|Width)|TextureCacheChromaSamplingMode(?:Automatic|BestPerformance|HighestQuality|Key))|SecAttrAccessibleAlways(?:ThisDeviceOnly)?)\\b", + "name": "invalid.deprecated.10.14.support.variable.c" + }, + { + "match": "\\bk(?:DTLSProtocol1(?:2)?|S(?:SL(?:Aborted|C(?:l(?:ient(?:Cert(?:None|Re(?:jected|quested)|Sent)|Side)|osed)|onnected)|DatagramType|Handshake|Idle|Protocol(?:2|3(?:Only)?|All|Unknown)|S(?:e(?:rverSide|ssionOption(?:Allow(?:Renegotiation|ServerIdentityChange)|BreakOn(?:C(?:ertRequested|lient(?:Auth|Hello))|ServerAuth)|EnableSessionTickets|Fal(?:lback|seStart)|SendOneByteRecord))|treamType))|ecDataAccessEvent(?:Mask)?)|TLSProtocol(?:1(?:1|2|3|Only)?|MaxSupported))\\b", + "name": "invalid.deprecated.10.15.support.constant.c" + }, + { + "match": "\\bk(?:MIDIPropertyNameConfiguration|S(?:CPropNetPPP(?:AuthEAPPlugins|Plugins)|SLSessionConfig_(?:ATSv1(?:_noPFS)?|TLSv1_fallback|anonymous|legacy(?:_DHE)?|standard)))\\b", + "name": "invalid.deprecated.10.15.support.variable.c" + }, + { + "match": "\\bkCGColorSpace(?:DisplayP3_PQ_EOTF|ITUR_2020_PQ_EOTF)\\b", + "name": "invalid.deprecated.10.16.support.variable.quartz.c" + }, + { + "match": "\\bkMIDIProperty(?:FactoryPatchNameFile|UserPatchNameFile)\\b", + "name": "invalid.deprecated.10.2.support.variable.c" + }, + { + "match": "\\bkCFNetServiceFlagIsRegistrationDomain\\b", + "name": "invalid.deprecated.10.4.support.constant.c" + }, + { + "match": "\\bk(?:MDItemFS(?:Exists|Is(?:Readable|Writeable))|S(?:CPropUsersConsoleUser(?:GID|Name|UID)|KLanguageTypes))\\b", + "name": "invalid.deprecated.10.4.support.variable.c" + }, + { + "match": "\\bkMDItemSupportFileType\\b", + "name": "invalid.deprecated.10.5.support.variable.c" + }, + { + "match": "\\b(?:CM(?:2(?:Header|ProfileHandle)|4Header|A(?:daptationMatrixType|ppleProfileHeader)|B(?:itmap(?:C(?:allBack(?:ProcPtr|UPP)|olorSpace))?|ufferLocation)|C(?:MY(?:Color|KColor)|hromaticAdaptation|o(?:lor|ncat(?:CallBack(?:ProcPtr|UPP)|ProfileSet))|urveType)|D(?:at(?:aType|eTime(?:Type)?)|evice(?:I(?:D|nfoPtr)|Profile(?:ArrayPtr|I(?:D|nfo)|Scope)|State)|isplayIDType)|F(?:ixedXY(?:Color|ZColor)|loatBitmap)|GrayColor|H(?:LSColor|SVColor|andleLocation)|I(?:ntentCRDVMSize|terateDevice(?:InfoProcPtr|ProfileProcPtr))|L(?:ab(?:Color|ToLabProcPtr)|u(?:t(?:16Type|8Type)|vColor))|M(?:I(?:nfo|terate(?:ProcPtr|UPP))|akeAndModel(?:Type)?|easurementType|ulti(?:Funct(?:CLUTType|LutB2AType)|LocalizedUniCode(?:EntryRec|Type)|channel(?:5Color|6Color|7Color|8Color)))|Na(?:medColor(?:2(?:EntryType|Type)|Type)?|tiveDisplayInfo(?:Type)?)|P(?:S2CRDVMSizeType|a(?:rametricCurveType|thLocation)|rof(?:Loc|ile(?:Iterate(?:Data|ProcPtr|UPP)|Location|MD5(?:Ptr)?|Ref|SequenceDescType)))|RGBColor|S(?:15Fixed16ArrayType|creening(?:ChannelRec|Type)|ignatureType)|T(?:ag(?:ElemTable|Record)|ext(?:DescriptionType|Type))|U(?:16Fixed16ArrayType|Int(?:16ArrayType|32ArrayType|64ArrayType|8ArrayType)|crBgType|nicodeTextType)|Vi(?:deoCardGamma(?:Formula|T(?:able|ype))?|ewingConditionsType)|WorldRef|XYZType|YxyColor)|NCM(?:ConcatProfileS(?:et|pec)|DeviceProfileInfo))\\b", + "name": "invalid.deprecated.10.6.support.type.c" + }, + { + "match": "\\bkC(?:FStream(?:PropertySSLPeerCertificates|SSLAllows(?:AnyRoot|Expired(?:Certificates|Roots)))|VImageBufferTransferFunction_(?:EBU_3213|SMPTE_C))\\b", + "name": "invalid.deprecated.10.6.support.variable.c" + }, + { + "match": "\\b(?:AudioFileFDFTable(?:Extended)?|C(?:E_(?:A(?:ccessDescription|uthority(?:InfoAccess|KeyID))|BasicConstraints|C(?:RLDist(?:PointsSyntax|ributionPoint)|ertPolicies|rl(?:Dist(?:ReasonFlags|ributionPointNameType)|Reason))|D(?:ata(?:AndType)?|istributionPointName)|General(?:Name(?:s)?|Subtree(?:s)?)|I(?:nhibitAnyPolicy|ssuingDistributionPoint)|KeyUsage|N(?:ame(?:Constraints|RegistrationAuthorities)|etscapeCertType)|OtherName|Policy(?:Constraints|Information|Mapping(?:s)?|QualifierInfo)|QC_Statement(?:s)?|S(?:emanticsInformation|ubjectKeyID))|SSM_(?:A(?:C(?:CESS_CREDENTIALS(?:_PTR)?|L_(?:E(?:DIT(?:_PTR)?|NTRY_(?:IN(?:FO(?:_PTR)?|PUT(?:_PTR)?)|PROTOTYPE(?:_PTR)?))|OWNER_PROTOTYPE(?:_PTR)?|SUBJECT_CALLBACK|VALIDITY_PERIOD(?:_PTR)?))|PI_M(?:EMORY_FUNCS(?:_PTR)?|oduleEventHandler)|UTHORIZATIONGROUP(?:_PTR)?)|BASE_CERTS(?:_PTR)?|C(?:ALLBACK|ERT(?:GROUP(?:_PTR)?|_(?:BUNDLE(?:_(?:HEADER(?:_PTR)?|PTR))?|PAIR(?:_PTR)?))|HALLENGE_CALLBACK|ONTEXT(?:_(?:ATTRIBUTE(?:_PTR)?|PTR))?|R(?:L(?:GROUP(?:_PTR)?|_PAIR(?:_PTR)?)|YPTO_DATA(?:_PTR)?)|SP_OPERATIONAL_STATISTICS(?:_PTR)?)|D(?:AT(?:A_PTR|E(?:_PTR)?)|B(?:INFO(?:_PTR)?|_(?:ATTRIBUTE_(?:DATA(?:_PTR)?|INFO(?:_PTR)?)|INDEX_INFO(?:_PTR)?|PARSING_MODULE_INFO(?:_PTR)?|RECORD_(?:ATTRIBUTE_(?:DATA(?:_PTR)?|INFO(?:_PTR)?)|INDEX_INFO(?:_PTR)?)|SCHEMA_(?:ATTRIBUTE_INFO(?:_PTR)?|INDEX_INFO(?:_PTR)?)|UNIQUE_RECORD(?:_PTR)?))|L_DB_(?:HANDLE(?:_PTR)?|LIST(?:_PTR)?))|E(?:NCODED_C(?:ERT(?:_PTR)?|RL(?:_PTR)?)|VIDENCE(?:_PTR)?)|F(?:IELD(?:GROUP(?:_PTR)?|_PTR)?|UNC_NAME_ADDR(?:_PTR)?)|GUID(?:_PTR)?|K(?:E(?:A_DERIVE_PARAMS(?:_PTR)?|Y(?:HEADER(?:_PTR)?|_(?:PTR|SIZE(?:_PTR)?))?)|R(?:SUBSERVICE(?:_PTR)?|_(?:NAME|P(?:OLICY_(?:INFO(?:_PTR)?|LIST_ITEM(?:_PTR)?)|ROFILE(?:_PTR)?)|WRAPPEDPRODUCT_INFO(?:_PTR)?)))|LIST(?:_(?:ELEMENT|PTR))?|M(?:ANAGER_(?:EVENT_NOTIFICATION(?:_PTR)?|REGISTRATION_INFO(?:_PTR)?)|EMORY_FUNCS(?:_PTR)?|ODULE_FUNCS(?:_PTR)?)|N(?:AME_LIST(?:_PTR)?|ET_ADDRESS(?:_PTR)?)|OID_PTR|P(?:ARSED_C(?:ERT(?:_PTR)?|RL(?:_PTR)?)|KCS(?:1_OAEP_PARAMS(?:_PTR)?|5_PBKDF(?:1_PARAMS(?:_PTR)?|2_PARAMS(?:_PTR)?)))|QUERY(?:_(?:LIMITS(?:_PTR)?|PTR|SIZE_DATA(?:_PTR)?))?|R(?:ANGE(?:_PTR)?|ESOURCE_CONTROL_CONTEXT(?:_PTR)?)|S(?:AMPLE(?:GROUP(?:_PTR)?|_PTR)?|ELECTION_PREDICATE(?:_PTR)?|PI_(?:AC_FUNCS(?:_PTR)?|C(?:L_FUNCS(?:_PTR)?|SP_FUNCS(?:_PTR)?)|DL_FUNCS(?:_PTR)?|KR_FUNCS(?:_PTR)?|ModuleEventHandler|TP_FUNCS(?:_PTR)?)|TATE_FUNCS(?:_PTR)?|UBSERVICE_UID(?:_PTR)?)|T(?:P_(?:A(?:PPLE_EVIDENCE_INFO|UTHORITY_ID(?:_PTR)?)|C(?:ALLERAUTH_CONTEXT(?:_PTR)?|ERT(?:CHANGE_(?:INPUT(?:_PTR)?|OUTPUT(?:_PTR)?)|ISSUE_(?:INPUT(?:_PTR)?|OUTPUT(?:_PTR)?)|NOTARIZE_(?:INPUT(?:_PTR)?|OUTPUT(?:_PTR)?)|RECLAIM_(?:INPUT(?:_PTR)?|OUTPUT(?:_PTR)?)|VERIFY_(?:INPUT(?:_PTR)?|OUTPUT(?:_PTR)?))|ONFIRM_RESPONSE(?:_PTR)?|RLISSUE_(?:INPUT(?:_PTR)?|OUTPUT(?:_PTR)?))|POLICYINFO(?:_PTR)?|RE(?:QUEST_SET(?:_PTR)?|SULT_SET(?:_PTR)?)|VERIF(?:ICATION_RESULTS_CALLBACK|Y_CONTEXT(?:_(?:PTR|RESULT(?:_PTR)?))?))|UPLE(?:GROUP(?:_PTR)?|_PTR)?)|UPCALLS(?:_(?:CALLOC|FREE|MALLOC|PTR|REALLOC))?|VERSION(?:_PTR)?|WRAP_KEY(?:_PTR)?|X509(?:EXT_(?:BASICCONSTRAINTS(?:_PTR)?|P(?:AIR(?:_PTR)?|OLICY(?:INFO(?:_PTR)?|QUALIFIER(?:INFO(?:_PTR)?|S(?:_PTR)?)))|TAGandVALUE(?:_PTR)?)|_(?:ALGORITHM_IDENTIFIER_PTR|EXTENSION(?:S(?:_PTR)?|_PTR)?|NAME(?:_PTR)?|R(?:DN(?:_PTR)?|EVOKED_CERT_(?:ENTRY(?:_PTR)?|LIST(?:_PTR)?))|S(?:IGN(?:ATURE(?:_PTR)?|ED_C(?:ERTIFICATE(?:_PTR)?|RL(?:_PTR)?))|UBJECT_PUBLIC_KEY_INFO_PTR)|T(?:BS_CERT(?:IFICATE(?:_PTR)?|LIST(?:_PTR)?)|IME(?:_PTR)?|YPE_VALUE_PAIR(?:_PTR)?)|VALIDITY(?:_PTR)?))))|MDS_(?:DB_HANDLE|FUNCS(?:_PTR)?)|cssm_(?:ac(?:cess_credentials|l_(?:e(?:dit|ntry_(?:in(?:fo|put)|prototype))|owner_prototype|validity_period))|base_certs|c(?:ert(?:_(?:bundle(?:_header)?|pair)|group)|ontext(?:_attribute)?|r(?:l(?:_pair|group)|ypto_data))|d(?:b(?:_(?:attribute_(?:data|info)|index_info|parsing_module_info|record_(?:attribute_(?:data|info)|index_info)|schema_attribute_info|unique_record)|info)|l_db_list)|e(?:ncoded_c(?:ert|rl)|vidence)|field(?:group)?|k(?:e(?:a_derive_params|y(?:header)?)|r(?:_(?:p(?:olicy_(?:info|list_item)|rofile)|wrappedproductinfo)|subservice))|list_element|m(?:anager_(?:event_notification|registration_info)|odule_funcs)|net_address|pkcs(?:1_oaep_params|5_pbkdf(?:1_params|2_params))|query(?:_limits)?|resource_control_context|s(?:ample(?:group)?|election_predicate|pi_(?:ac_funcs|c(?:l_funcs|sp_funcs)|dl_funcs|kr_funcs|tp_funcs)|tate_funcs|ubservice_uid)|t(?:p_(?:authority_id|c(?:allerauth_context|ert(?:change_(?:input|output)|issue_(?:input|output)|notarize_(?:input|output)|reclaim_(?:input|output)|verify_(?:input|output))|onfirm_response|rlissue_(?:input|output))|policyinfo|request_set|verify_context(?:_result)?)|uplegroup)|upcalls|x509(?:_(?:extension(?:TagAndValue|s)?|name|r(?:dn|evoked_cert_(?:entry|list))|sign(?:ature|ed_c(?:ertificate|rl))|t(?:bs_cert(?:ificate|list)|ime|ype_value_pair))|ext_(?:basicConstraints|p(?:air|olicy(?:Info|Qualifier(?:Info|s))))))|mds_funcs|x509_validity)\\b", + "name": "invalid.deprecated.10.7.support.type.c" + }, + { + "match": "\\b(?:CSSMOID_(?:A(?:D(?:C_CERT_POLICY|_(?:CA_(?:ISSUERS|REPOSITORY)|OCSP|TIME_STAMPING))|NSI_(?:DH_(?:EPHEM(?:_SHA1)?|HYBRID(?:1(?:_SHA1)?|2(?:_SHA1)?|_ONEFLOW)|ONE_FLOW(?:_SHA1)?|PUB_NUMBER|STATIC(?:_SHA1)?)|MQV(?:1(?:_SHA1)?|2(?:_SHA1)?))|PPLE(?:ID_(?:CERT_POLICY|SHARING_CERT_POLICY)|_(?:ASC|CERT_POLICY|E(?:CDSA|KU_(?:CODE_SIGNING(?:_DEV)?|ICHAT_(?:ENCRYPTION|SIGNING)|P(?:ASSBOOK_SIGNING|ROFILE_SIGNING)|QA_PROFILE_SIGNING|RESOURCE_SIGNING|SYSTEM_IDENTITY)|XTENSION(?:_(?:A(?:AI_INTERMEDIATE|DC_(?:APPLE_SIGNING|DEV_SIGNING)|PPLE(?:ID_(?:INTERMEDIATE|SHARING)|_SIGNING))|CODE_SIGNING|DEVELOPER_AUTHENTICATION|ESCROW_SERVICE|I(?:NTERMEDIATE_MARKER|TMS_INTERMEDIATE)|MACAPPSTORE_RECEIPT|P(?:ASSBOOK_SIGNING|ROVISIONING_PROFILE_SIGNING)|S(?:ERVER_AUTHENTICATION|YSINT2_INTERMEDIATE)|WWDR_INTERMEDIATE))?)|FEE(?:D(?:EXP)?|_(?:MD5|SHA1))?|ISIGN|TP_(?:APPLEID_SHARING|C(?:ODE_SIGN(?:ING)?|SR_GEN)|E(?:AP|SCROW_SERVICE)|I(?:CHAT|P_SEC)|LOCAL_CERT_GEN|M(?:ACAPPSTORE_RECEIPT|OBILE_STORE)|P(?:A(?:CKAGE_SIGNING|SSBOOK_SIGNING)|CS_ESCROW_SERVICE|KINIT_(?:CLIENT|SERVER)|RO(?:FILE_SIGNING|VISIONING_PROFILE_SIGNING))|QA_PROFILE_SIGNING|RE(?:SOURCE_SIGN|VOCATION(?:_(?:CRL|OCSP))?)|S(?:MIME|SL|W_UPDATE_SIGNING)|T(?:EST_MOBILE_STORE|IMESTAMPING))|X509_BASIC))|liasedEntryName|uthority(?:InfoAccess|KeyIdentifier|RevocationList))|B(?:asicConstraints|iometricInfo|usinessCategory)|C(?:ACertificate|SSMKeyStruct|ert(?:Issuer|i(?:com(?:EllCurve)?|ficate(?:Policies|RevocationList)))|hallengePassword|lientAuth|o(?:llective(?:FacsimileTelephoneNumber|InternationalISDNNumber|Organization(?:Name|alUnitName)|P(?:hysicalDeliveryOfficeName|ost(?:OfficeBox|al(?:Address|Code)))|St(?:ateProvinceName|reetAddress)|Tele(?:phoneNumber|x(?:Number|TerminalIdentifier)))|mmonName|ntentType|unt(?:erSignature|ryName))|r(?:l(?:DistributionPoints|Number|Reason)|ossCertificatePair))|D(?:ES_CBC|H|NQualifier|OTMAC_CERT(?:_(?:E(?:MAIL_(?:ENCRYPT|SIGN)|XTENSION)|IDENTITY|POLICY|REQ(?:_(?:ARCHIVE_(?:FETCH|LIST|REMOVE|STORE)|EMAIL_(?:ENCRYPT|SIGN)|IDENTITY|SHARED_SERVICES|VALUE_(?:ASYNC|HOSTNAME|IS_PENDING|PASSWORD|RENEW|USERNAME)))?))?|SA(?:_(?:CMS|JDK))?|e(?:ltaCrlIndicator|s(?:cription|tinationIndicator))|istinguishedName|omainComponent)|E(?:CDSA_WithS(?:HA(?:1|2(?:24|56)|384|512)|pecified)|KU_IPSec|TSI_QCS_QC_(?:COMPLIANCE|LIMIT_VALUE|RETENTION|SSCD)|mail(?:Address|Protection)|nhancedSearchGuide|xtended(?:CertificateAttributes|KeyUsage(?:Any)?|UseCodeSigning))|FacsimileTelephoneNumber|G(?:enerationQualifier|ivenName)|Ho(?:ldInstructionCode|useIdentifier)|I(?:n(?:hibitAnyPolicy|itials|ternationalISDNNumber|validityDate)|ssu(?:erAltName|ingDistributionPoint(?:s)?))|K(?:ERBv5_PKINIT_(?:AUTH_DATA|DH_KEY_DATA|KP_(?:CLIENT_AUTH|KDC)|RKEY_DATA)|eyUsage|nowledgeInformation)|LocalityName|M(?:ACAPPSTORE_(?:CERT_POLICY|RECEIPT_CERT_POLICY)|D(?:2(?:WithRSA)?|4(?:WithRSA)?|5(?:WithRSA)?)|OBILE_STORE_SIGNING_POLICY|e(?:mber|ssageDigest)|icrosoftSGC)|N(?:ame(?:Constraints)?|etscape(?:Cert(?:Sequence|Type)|SGC))|O(?:AEP_(?:ID_PSPECIFIED|MGF1)|CSPSigning|ID_QCS_SYNTAX_V(?:1|2)|bjectClass|rganization(?:Name|alUnitName)|wner)|P(?:DA_(?:COUNTRY_(?:CITIZEN|RESIDENCE)|DATE_OF_BIRTH|GENDER|PLACE_OF_BIRTH)|K(?:CS(?:12_(?:c(?:ertBag|rlBag)|keyBag|pbe(?:WithSHAAnd(?:128BitRC(?:2CBC|4)|2Key3DESCBC|3Key3DESCBC|40BitRC4)|withSHAAnd40BitRC2CBC)|s(?:afeContentsBag|ecretBag|hroudedKeyBag))|3|5_(?:D(?:ES_EDE3_CBC|IGEST_ALG)|ENCRYPT_ALG|HMAC_SHA1|PB(?:ES2|KDF2|MAC1)|RC(?:2_CBC|5_CBC)|pbeWith(?:MD(?:2And(?:DES|RC2)|5And(?:DES|RC2))|SHA1And(?:DES|RC2)))|7_(?:D(?:ata(?:WithAttributes)?|igestedData)|En(?:crypted(?:Data|PrivateKeyInfo)|velopedData)|Signed(?:AndEnvelopedData|Data))|9_(?:C(?:ertTypes|rlTypes)|FriendlyName|Id_Ct_TSTInfo|LocalKeyId|SdsiCertificate|TimeStampToken|X509C(?:ertificate|rl)))|IX_OCSP(?:_(?:ARCHIVE_CUTOFF|BASIC|CRL|NO(?:CHECK|NCE)|RESPONSE|SERVICE_LOCATOR))?)|hysicalDeliveryOfficeName|o(?:licy(?:Constraints|Mappings)|st(?:OfficeBox|al(?:Address|Code)))|r(?:e(?:ferredDeliveryMethod|sentationAddress)|ivateKeyUsagePeriod|otocolInformation))|Q(?:C_Statements|T_(?:CPS|UNOTICE))|R(?:SA(?:WithOAEP)?|egisteredAddress|oleOccupant)|S(?:HA(?:1(?:With(?:DSA(?:_(?:CMS|JDK))?|RSA(?:_OIW)?))?|2(?:24(?:WithRSA)?|56(?:WithRSA)?)|384(?:WithRSA)?|512(?:WithRSA)?)|e(?:archGuide|eAlso|r(?:ialNumber|verAuth))|igningTime|t(?:ateProvinceName|reetAddress)|u(?:bject(?:AltName|DirectoryAttributes|EmailAddress|InfoAccess|KeyIdentifier|Picture|SignatureBitmap)|pportedApplicationContext|rname))|T(?:EST_MOBILE_STORE_SIGNING_POLICY|ele(?:phoneNumber|x(?:Number|TerminalIdentifier))|i(?:meStamping|tle))|U(?:n(?:ique(?:Identifier|Member)|structured(?:Address|Name))|se(?:Exemptions|r(?:Certificate|ID|Password)))|X(?:509V(?:1(?:C(?:RL(?:Issuer(?:Name(?:CStruct|LDAP)|Struct)|N(?:extUpdate|umberOfRevokedCertEntries)|Revoked(?:Certificates(?:CStruct|Struct)|Entry(?:CStruct|RevocationDate|S(?:erialNumber|truct)))|ThisUpdate)|ertificate(?:IssuerUniqueId|SubjectUniqueId))|IssuerName(?:CStruct|LDAP|Std)?|S(?:erialNumber|ignature(?:Algorithm(?:Parameters|TBS)?|CStruct|Struct)?|ubject(?:Name(?:CStruct|LDAP|Std)?|PublicKey(?:Algorithm(?:Parameters)?|CStruct)?))|V(?:alidityNot(?:After|Before)|ersion))|2CRL(?:AllExtensions(?:CStruct|Struct)|Extension(?:Critical|Id|Type)|NumberOfExtensions|RevokedEntry(?:AllExtensions(?:CStruct|Struct)|Extension(?:Critical|Id|Type|Value)|NumberOfExtensions|SingleExtension(?:CStruct|Struct))|Si(?:gnedCrl(?:CStruct|Struct)|ngleExtension(?:CStruct|Struct))|TbsCertList(?:CStruct|Struct)|Version)|3(?:Certificate(?:CStruct|Extension(?:C(?:Struct|ritical)|Id|Struct|Type|Value|s(?:CStruct|Struct))|NumberOfExtensions)?|SignedCertificate(?:CStruct)?))|9_62(?:_(?:C_TwoCurve|EllCurve|FieldType|P(?:rimeCurve|ubKeyType)|SigType))?|_121Address)|ecPublicKey|sec(?:p(?:1(?:12r(?:1|2)|28r(?:1|2)|60(?:k1|r(?:1|2))|92(?:k1|r1))|2(?:24(?:k1|r1)|56(?:k1|r1))|384r1|521r1)|t(?:1(?:13r(?:1|2)|31r(?:1|2)|63(?:k1|r(?:1|2))|93r(?:1|2))|2(?:3(?:3(?:k1|r1)|9k1)|83(?:k1|r1))|409(?:k1|r1)|571(?:k1|r1))))|k(?:MDItemLabel(?:I(?:D|con)|Kind|UUID)|SCPropNetSMBNetBIOSScope))\\b", + "name": "invalid.deprecated.10.7.support.variable.c" + }, + { + "match": "\\b(?:false32b|gestaltSystemVersion(?:BugFix|M(?:ajor|inor))?|kCT(?:FontTableOptionExcludeSynthetic|ParagraphStyleSpecifierLineSpacing)|true32b)\\b", + "name": "invalid.deprecated.10.8.support.constant.c" + }, + { + "match": "\\bWSMethodInvocation(?:CallBackProcPtr|DeserializationProcPtr|SerializationProcPtr)\\b", + "name": "invalid.deprecated.10.8.support.type.c" + }, + { + "match": "\\b(?:k(?:CTTypesetterOptionDisableBidiProcessing|FSOperation(?:Bytes(?:CompleteKey|RemainingKey)|Objects(?:CompleteKey|RemainingKey)|T(?:hroughputKey|otal(?:BytesKey|ObjectsKey|UserVisibleObjectsKey))|UserVisibleObjects(?:CompleteKey|RemainingKey))|LSSharedFileListVolumesIDiskVisible|WS(?:Debug(?:Incoming(?:Body|Headers)|Outgoing(?:Body|Headers))|Fault(?:Code|Extra|String)|HTTP(?:ExtraHeaders|FollowsRedirects|Message|Proxy|ResponseMessage|Version)|MethodInvocation(?:Result(?:ParameterName)?|TimeoutValue)|NetworkStreamFaultString|Record(?:NamespaceURI|ParameterOrder|Type)|S(?:OAP(?:1999Protocol|2001Protocol|BodyEncodingStyle|Me(?:ssageHeaders|thodNamespaceURI)|Style(?:Doc|RPC))|treamError(?:Domain|Error|Message))|XMLRPCProtocol))|pi)\\b", + "name": "invalid.deprecated.10.8.support.variable.c" + }, { "match": "\\bkCFURLUbiquitousItemPercent(?:DownloadedKey|UploadedKey)\\b", "name": "invalid.deprecated.10.8.support.variable.cf.c" @@ -29,6 +137,10 @@ "match": "\\bkCGWindowWorkspace\\b", "name": "invalid.deprecated.10.8.support.variable.quartz.c" }, + { + "match": "\\bk(?:AUVoiceIOProperty_VoiceProcessingQuality|Sec(?:AppleSharePasswordItemClass|TrustResultConfirm))\\b", + "name": "invalid.deprecated.10.9.support.constant.c" + }, { "match": "\\bkCFURL(?:BookmarkCreationPreferFileIDResolutionMask|HFSPathStyle|ImproperArgumentsError|PropertyKeyUnavailableError|Re(?:moteHostUnavailableError|source(?:AccessViolationError|NotFoundError))|TimeoutError|Unknown(?:Error|PropertyKeyError|SchemeError))\\b", "name": "invalid.deprecated.10.9.support.constant.cf.c" @@ -38,17 +150,57 @@ "name": "invalid.deprecated.10.9.support.constant.quartz.c" }, { - "match": "\\bCFURLError\\b", - "name": "invalid.deprecated.10.9.support.type.cf.c" + "match": "\\bSecTrustUserSetting\\b", + "name": "invalid.deprecated.10.9.support.type.c" }, { - "match": "\\bCGTextEncoding\\b", - "name": "invalid.deprecated.10.9.support.type.quartz.c" + "match": "\\b(?:XPC_ACTIVITY_REQUIRE_(?:BATTERY_LEVEL|HDD_SPINNING)|k(?:LSSharedFileListGlobalLoginItems|S(?:C(?:PropNetAirPort(?:A(?:llowNetCreation|uthPassword(?:Encryption)?)|JoinMode|P(?:owerEnabled|referredNetwork)|SavePasswords)|ValNetAirPort(?:AuthPasswordEncryptionKeychain|JoinMode(?:Automatic|Preferred|R(?:anked|ecent)|Strongest)))|ecPolicyAppleiChat)))\\b", + "name": "invalid.deprecated.10.9.support.variable.c" }, { "match": "\\bkCFURL(?:File(?:DirectoryContents|Exists|L(?:astModificationTime|ength)|OwnerID|POSIXMode)|HTTPStatus(?:Code|Line)|UbiquitousItemIsDownloadedKey)\\b", "name": "invalid.deprecated.10.9.support.variable.cf.c" }, + { + "match": "\\bk3DMixerParam_(?:GlobalReverbGain|M(?:axGain|inGain)|O(?:bstructionAttenuation|cclusionAttenuation)|ReverbBlend)\\b", + "name": "invalid.deprecated.tba.support.constant.c" + }, + { + "match": "\\bkQL(?:Preview(?:ContentIDScheme|OptionCursorKey|Property(?:Attachment(?:DataKey|sKey)|BaseBundlePathKey|CursorKey|DisplayNameKey|HeightKey|MIMETypeKey|PDFStyleKey|StringEncodingKey|WidthKey))|ThumbnailProperty(?:Ba(?:dgeImageKey|seBundlePathKey)|ExtensionKey))\\b", + "name": "invalid.deprecated.tba.support.variable.c" + }, + { + "match": "\\b(?:QOS_CLASS_(?:BACKGROUND|DEFAULT|U(?:NSPECIFIED|SER_IN(?:ITIATED|TERACTIVE)|TILITY))|k(?:C(?:GLCP(?:AbortOnGPURestartStatusBlacklisted|ContextPriorityRequest|GPURestartStatus|Support(?:GPURestart|SeparateAddressSpace))|TRuby(?:Alignment(?:Auto|Center|Distribute(?:Letter|Space)|End|Invalid|LineEdge|Start)|Overhang(?:Auto|End|Invalid|None|Start)|Position(?:After|Before|Count|In(?:line|terCharacter))))|FSEventStreamEventFlagItemIs(?:Hardlink|LastHardlink)|SecAccessControlUserPresence))\\b", + "name": "support.constant.10.10.c" + }, + { + "match": "\\bk(?:A(?:XValueType(?:AXError|C(?:FRange|G(?:Point|Rect|Size))|Illegal)|udioComponent(?:Flag_(?:CanLoadInProcess|IsV3AudioUnit|RequiresAsyncInstantiation)|Instantiation_Load(?:InProcess|OutOfProcess)))|SecAccessControlDevicePasscode)\\b", + "name": "support.constant.10.11.c" + }, + { + "match": "\\bkSec(?:AccessControl(?:A(?:nd|pplicationPassword)|Or|PrivateKeyUsage)|KeyOperationType(?:Decrypt|Encrypt|KeyExchange|Sign|Verify))\\b", + "name": "support.constant.10.12.c" + }, + { + "match": "\\bk(?:CGLRPRe(?:gistryID(?:High|Low)|movable)|FSEventStream(?:CreateFlagUseExtendedData|EventFlagItemCloned)|SecAccessControlBiometry(?:Any|CurrentSet))\\b", + "name": "support.constant.10.13.c" + }, + { + "match": "\\bk(?:3DMixerParam_(?:BusEnable|DryWetReverbBlend|GlobalReverbGainInDecibels|M(?:axGainInDecibels|inGainInDecibels)|O(?:bstructionAttenuationInDecibels|cclusionAttenuationInDecibels))|AudioQueueProperty_ChannelAssignments|JSTypeSymbol|SecAccessControlWatch)\\b", + "name": "support.constant.10.15.c" + }, + { + "match": "\\bk(?:AudioComponentFlag_SandboxSafe|CGL(?:PFASupportsAutomaticGraphicsSwitching|Renderer(?:ATIRadeonX4000ID|IntelHD5000ID)))\\b", + "name": "support.constant.10.8.c" + }, + { + "match": "\\bk(?:AXPriority(?:High|Low|Medium)|CGL(?:OGLPVersion_GL4_Core|R(?:PMajorGLVersion|endererGeForceID))|FSEventStream(?:CreateFlagMarkSelf|EventFlagOwnEvent))\\b", + "name": "support.constant.10.9.c" + }, + { + "match": "\\b(?:A(?:APNot(?:CreatedErr|FoundErr)|C(?:E(?:2Type|8Type)|L_(?:A(?:DD_(?:FILE|SUBDIRECTORY)|PPEND_DATA)|CHANGE_OWNER|DELETE(?:_CHILD)?|E(?:NTRY_(?:DIRECTORY_INHERIT|FILE_INHERIT|INHERITED|LIMIT_INHERIT|ONLY_INHERIT)|X(?:ECUTE|TENDED_(?:ALLOW|DENY)))|F(?:IRST_ENTRY|LAG_(?:DEFER_INHERIT|NO_INHERIT))|L(?:AST_ENTRY|IST_DIRECTORY)|NEXT_ENTRY|READ_(?:ATTRIBUTES|DATA|EXTATTRIBUTES|SECURITY)|S(?:EARCH|YNCHRONIZE)|TYPE_(?:A(?:CCESS|FS)|CODA|DEFAULT|EXTENDED|N(?:TFS|WFS))|UNDEFINED_TAG|WRITE_(?:ATTRIBUTES|DATA|EXTATTRIBUTES|SECURITY)))|IF(?:C(?:ID|Version1)|FID)|SD(?:Bad(?:ForkErr|HeaderErr)|EntryNotFoundErr)|VAudioSessionError(?:Code(?:BadParam|Cannot(?:InterruptOthers|Start(?:Playing|Recording))|ExpiredSession|I(?:n(?:compatibleCategory|sufficientPriority)|sBusy)|M(?:ediaServicesFailed|issingEntitlement)|None|ResourceNotAvailable|S(?:essionNotActive|iriIsRecording)|Unspecified)|InsufficientPriority)|nnotationID|ppl(?:eShareMediaType|icationSpecificID)|u(?:dioRecordingID|thorID))|C(?:DEFNFnd|E_CDNT_(?:FullName|NameRelativeToCrlIssuer)|S(?:SM(?:ERR_(?:A(?:C_(?:DEVICE_(?:FAILED|RESET)|FUNCTION_(?:FAILED|NOT_IMPLEMENTED)|IN(?:SUFFICIENT_CLIENT_IDENTIFICATION|TERNAL_ERROR|VALID_(?:BASE_ACLS|C(?:L_HANDLE|ONTEXT_HANDLE)|D(?:ATA|B_(?:HANDLE|LIST(?:_POINTER)?)|L_HANDLE)|ENCODING|INPUT_POINTER|OUTPUT_POINTER|P(?:ASSTHROUGH_ID|OINTER)|REQUEST(?:OR|_DESCRIPTOR)|T(?:P_HANDLE|UPLE_CREDENTIALS)|VALIDITY_PERIOD)|_DARK_WAKE)|M(?:DS_ERROR|EMORY_ERROR)|NO_USER_INTERACTION|OS_ACCESS_DENIED|SE(?:LF_CHECK_FAILED|RVICE_NOT_AVAILABLE)|USER_CANCELED)|PPLE(?:DL_(?:DISK_FULL|FILE_TOO_BIG|IN(?:COMPATIBLE_(?:DATABASE_BLOB|KEY_BLOB)|VALID_(?:DATABASE_BLOB|KEY_BLOB|OPEN_PARAMETERS))|QUOTA_EXCEEDED)|TP_(?:BAD_CERT_FROM_ISSUER|C(?:A_PIN_MISMATCH|ERT_NOT_FOUND_FROM_ISSUER|ODE_SIGN_DEVELOPMENT|RL_(?:BAD_URI|EXPIRED|INVALID_ANCHOR_CERT|NOT_(?:FOUND|TRUSTED|VALID_YET)|POLICY_FAIL|SERVER_DOWN)|S_(?:BAD_(?:CERT_CHAIN_LENGTH|PATH_LENGTH)|NO_(?:BASIC_CONSTRAINTS|EXTENDED_KEY_USAGE)))|EXT_KEYUSAGE_NOT_CRITICAL|HOSTNAME_MISMATCH|I(?:D(?:ENTIFIER_MISSING|P_FAIL)|N(?:COMPLETE_REVOCATION_CHECK|VALID_(?:AUTHORITY_ID|CA|E(?:MPTY_SUBJECT|XTENDED_KEY_USAGE)|ID_LINKAGE|KEY_USAGE|ROOT|SUBJECT_ID)))|MISSING_REQUIRED_EXTENSION|N(?:ETWORK_FAILURE|O_BASIC_CONSTRAINTS)|OCSP_(?:BAD_RE(?:QUEST|SPONSE)|INVALID_ANCHOR_CERT|NO(?:NCE_MISMATCH|T_TRUSTED|_SIGNER)|RESP_(?:INTERNAL_ERR|MALFORMED_REQ|SIG_REQUIRED|TRY_LATER|UNAUTHORIZED)|S(?:IG_ERROR|TATUS_UNRECOGNIZED)|UNAVAILABLE)|PATH_LEN_CONSTRAINT|RS_BAD_(?:CERT_CHAIN_LENGTH|EXTENDED_KEY_USAGE)|S(?:MIME_(?:BAD_(?:EXT_KEY_USE|KEY_USE)|EMAIL_ADDRS_NOT_FOUND|KEYUSAGE_NOT_CRITICAL|NO_EMAIL_ADDRS|SUBJ_ALT_NAME_NOT_CRIT)|SL_BAD_EXT_KEY_USE)|TRUST_SETTING_DENY|UNKNOWN_(?:C(?:ERT_EXTEN|R(?:ITICAL_EXTEN|L_EXTEN))|QUAL_CERT_STATEMENT))|_DOTMAC_(?:CSR_VERIFY_FAIL|FAILED_CONSISTENCY_CHECK|NO_REQ_PENDING|REQ_(?:IS_PENDING|QUEUED|REDIRECT|SERVER_(?:A(?:LREADY_EXIST|UTH)|ERR|NOT_AVAIL|PARAM|SERVICE_ERROR|UNIMPL)))))|C(?:L_(?:CRL_ALREADY_SIGNED|DEVICE_(?:FAILED|RESET)|FUNCTION_(?:FAILED|NOT_IMPLEMENTED)|IN(?:SUFFICIENT_CLIENT_IDENTIFICATION|TERNAL_ERROR|VALID_(?:BUNDLE_(?:INFO|POINTER)|C(?:ACHE_HANDLE|ERT(?:GROUP_POINTER|_POINTER)|ONTEXT_HANDLE|RL_(?:INDEX|POINTER))|DATA|FIELD_POINTER|INPUT_POINTER|NUMBER_OF_FIELDS|OUTPUT_POINTER|P(?:ASSTHROUGH_ID|OINTER)|RESULTS_HANDLE|SCOPE)|_DARK_WAKE)|M(?:DS_ERROR|EMORY_ERROR)|NO_(?:FIELD_VALUES|USER_INTERACTION)|OS_ACCESS_DENIED|S(?:COPE_NOT_SUPPORTED|E(?:LF_CHECK_FAILED|RVICE_NOT_AVAILABLE))|U(?:NKNOWN_(?:FORMAT|TAG)|SER_CANCELED)|VERIFICATION_FAILURE)|S(?:P(?:DL_APPLE_DL_CONVERSION_ERROR|_(?:A(?:CL_(?:ADD_FAILED|BASE_CERTS_NOT_SUPPORTED|CHA(?:LLENGE_CALLBACK_FAILED|NGE_FAILED)|DELETE_FAILED|ENTRY_TAG_NOT_FOUND|REPLACE_FAILED|SUBJECT_TYPE_NOT_SUPPORTED)|L(?:GID_MISMATCH|READY_LOGGED_IN)|PPLE_(?:ADD_APPLICATION_ACL_SUBJECT|INVALID_KEY_(?:END_DATE|START_DATE)|PUBLIC_KEY_INCOMPLETE|S(?:IGNATURE_MISMATCH|SLv2_ROLLBACK))|TTACH_HANDLE_BUSY)|BLOCK_SIZE_MISMATCH|CRYPTO_DATA_CALLBACK_FAILED|DEVICE_(?:ERROR|FAILED|MEMORY_ERROR|RESET|VERIFY_FAILED)|FUNCTION_(?:FAILED|NOT_IMPLEMENTED)|IN(?:PUT_LENGTH_ERROR|SUFFICIENT_CLIENT_IDENTIFICATION|TERNAL_ERROR|VALID_(?:A(?:C(?:CESS_CREDENTIALS|L_(?:BASE_CERTS|CHALLENGE_CALLBACK|E(?:DIT_MODE|NTRY_TAG)|SUBJECT_VALUE))|LGORITHM|TTR_(?:A(?:CCESS_CREDENTIALS|LG_PARAMS)|B(?:ASE|LOCK_SIZE)|DL_DB_HANDLE|E(?:FFECTIVE_BITS|ND_DATE)|I(?:NIT_VECTOR|TERATION_COUNT)|KEY(?:_(?:LENGTH|TYPE))?|LABEL|MODE|OUTPUT_SIZE|P(?:A(?:DDING|SSPHRASE)|RI(?:ME|VATE_KEY_FORMAT)|UBLIC_KEY_FORMAT)|R(?:ANDOM|OUNDS)|S(?:ALT|EED|TART_DATE|UBPRIME|YMMETRIC_KEY_FORMAT)|VERSION|WRAPPED_KEY_FORMAT))|C(?:ONTEXT(?:_HANDLE)?|RYPTO_DATA)|D(?:ATA(?:_COUNT)?|IGEST_ALGORITHM)|INPUT_(?:POINTER|VECTOR)|KEY(?:ATTR_MASK|USAGE_MASK|_(?:CLASS|FORMAT|LABEL|POINTER|REFERENCE))?|LOGIN_NAME|NEW_ACL_(?:ENTRY|OWNER)|OUTPUT_(?:POINTER|VECTOR)|P(?:ASSTHROUGH_ID|OINTER)|S(?:AMPLE_VALUE|IGNATURE))|_DARK_WAKE)|KEY_(?:BLOB_TYPE_INCORRECT|HEADER_INCONSISTENT|LABEL_ALREADY_EXISTS|USAGE_INCORRECT)|M(?:DS_ERROR|EMORY_ERROR|ISSING_ATTR_(?:A(?:CCESS_CREDENTIALS|LG_PARAMS)|B(?:ASE|LOCK_SIZE)|DL_DB_HANDLE|E(?:FFECTIVE_BITS|ND_DATE)|I(?:NIT_VECTOR|TERATION_COUNT)|KEY(?:_(?:LENGTH|TYPE))?|LABEL|MODE|OUTPUT_SIZE|P(?:A(?:DDING|SSPHRASE)|RI(?:ME|VATE_KEY_FORMAT)|UBLIC_KEY_FORMAT)|R(?:ANDOM|OUNDS)|S(?:ALT|EED|TART_DATE|UBPRIME|YMMETRIC_KEY_FORMAT)|VERSION|WRAPPED_KEY_FORMAT))|NO(?:T_LOGGED_IN|_USER_INTERACTION)|O(?:BJECT_(?:ACL_(?:NOT_SUPPORTED|REQUIRED)|MANIP_AUTH_DENIED|USE_AUTH_DENIED)|PERATION_AUTH_DENIED|S_ACCESS_DENIED|UTPUT_LENGTH_ERROR)|P(?:RIV(?:ATE_KEY_(?:ALREADY_EXISTS|NOT_FOUND)|ILEGE_NOT_(?:GRANTED|SUPPORTED))|UBLIC_KEY_INCONSISTENT)|QUERY_SIZE_UNKNOWN|S(?:AMPLE_VALUE_NOT_SUPPORTED|E(?:LF_CHECK_FAILED|RVICE_NOT_AVAILABLE)|TAGED_OPERATION_(?:IN_PROGRESS|NOT_STARTED))|U(?:NSUPPORTED_KEY(?:ATTR_MASK|USAGE_MASK|_(?:FORMAT|LABEL|SIZE))|SER_CANCELED)|VE(?:CTOR_OF_BUFS_UNSUPPORTED|RIFY_FAILED)))|SM_(?:A(?:DDIN_(?:AUTHENTICATE_FAILED|LOAD_FAILED|UNLOAD_FAILED)|TTRIBUTE_NOT_IN_CONTEXT)|BUFFER_TOO_SMALL|DEVICE_(?:FAILED|RESET)|E(?:MM_(?:AUTHENTICATE_FAILED|LOAD_FAILED|UNLOAD_FAILED)|VENT_NOTIFICATION_CALLBACK_NOT_FOUND)|FUNCTION_(?:FAILED|INTEGRITY_FAIL|NOT_IMPLEMENTED)|IN(?:COMPATIBLE_VERSION|SUFFICIENT_CLIENT_IDENTIFICATION|TERNAL_ERROR|VALID_(?:A(?:DDIN_(?:FUNCTION_TABLE|HANDLE)|TTRIBUTE)|CONTEXT_HANDLE|GUID|HANDLE_USAGE|INPUT_POINTER|KEY_HIERARCHY|OUTPUT_POINTER|P(?:OINTER|VC)|S(?:ERVICE_MASK|UBSERVICEID))|_DARK_WAKE)|LIB_REF_NOT_FOUND|M(?:DS_ERROR|EMORY_ERROR|ODULE_(?:MAN(?:AGER_(?:INITIALIZE_FAIL|NOT_FOUND)|IFEST_VERIFY_FAILED)|NOT_LOADED))|NO(?:T_INITIALIZED|_USER_INTERACTION)|OS_ACCESS_DENIED|P(?:RIVILEGE_NOT_GRANTED|VC_(?:ALREADY_CONFIGURED|REFERENT_NOT_FOUND))|S(?:COPE_NOT_SUPPORTED|E(?:LF_CHECK_FAILED|RVICE_NOT_AVAILABLE))|USER_CANCELED)))|DL_(?:ACL_(?:ADD_FAILED|BASE_CERTS_NOT_SUPPORTED|CHA(?:LLENGE_CALLBACK_FAILED|NGE_FAILED)|DELETE_FAILED|ENTRY_TAG_NOT_FOUND|REPLACE_FAILED|SUBJECT_TYPE_NOT_SUPPORTED)|D(?:ATA(?:BASE_CORRUPT|STORE_(?:ALREADY_EXISTS|DOESNOT_EXIST|IS_OPEN))|B_LOCKED|EVICE_(?:FAILED|RESET))|ENDOFDATA|F(?:IELD_SPECIFIED_MULTIPLE|UNCTION_(?:FAILED|NOT_IMPLEMENTED))|IN(?:COMPATIBLE_FIELD_FORMAT|SUFFICIENT_CLIENT_IDENTIFICATION|TERNAL_ERROR|VALID_(?:AC(?:CESS_(?:CREDENTIALS|REQUEST)|L_(?:BASE_CERTS|CHALLENGE_CALLBACK|E(?:DIT_MODE|NTRY_TAG)|SUBJECT_VALUE))|C(?:L_HANDLE|SP_HANDLE)|D(?:B_(?:HANDLE|L(?:IST_POINTER|OCATION)|NAME)|L_HANDLE)|FIELD_NAME|IN(?:DEX_INFO|PUT_POINTER)|MODIFY_MODE|NE(?:TWORK_ADDR|W_(?:ACL_(?:ENTRY|OWNER)|OWNER))|O(?:PEN_PARAMETERS|UTPUT_POINTER)|P(?:A(?:RSING_MODULE|SSTHROUGH_ID)|OINTER)|QUERY|RE(?:CORD(?:TYPE|_(?:INDEX|UID))|SULTS_HANDLE)|S(?:AMPLE_VALUE|ELECTION_TAG)|UNIQUE_INDEX_DATA|VALUE)|_DARK_WAKE)|M(?:DS_ERROR|EMORY_ERROR|ISSING_VALUE|ULTIPLE_VALUES_UNSUPPORTED)|NO_USER_INTERACTION|O(?:BJECT_(?:ACL_(?:NOT_SUPPORTED|REQUIRED)|MANIP_AUTH_DENIED|USE_AUTH_DENIED)|PERATION_AUTH_DENIED|S_ACCESS_DENIED)|RECORD_(?:MODIFIED|NOT_FOUND)|S(?:AMPLE_VALUE_NOT_SUPPORTED|E(?:LF_CHECK_FAILED|RVICE_NOT_AVAILABLE)|TALE_UNIQUE_RECORD)|U(?:NSUPPORTED_(?:FIELD_FORMAT|INDEX_INFO|LOCALITY|NUM_(?:ATTRIBUTES|INDEXES|RECORDTYPES|SELECTION_PREDS)|OPERATOR|QUERY(?:_LIMITS)?|RECORDTYPE)|SER_CANCELED))|TP_(?:AUTHENTICATION_FAILED|C(?:ERT(?:GROUP_INCOMPLETE|IFICATE_CANT_OPERATE|_(?:EXPIRED|NOT_VALID_YET|REVOKED|SUSPENDED))|RL_ALREADY_SIGNED)|DEVICE_(?:FAILED|RESET)|FUNCTION_(?:FAILED|NOT_IMPLEMENTED)|IN(?:SUFFICIENT_C(?:LIENT_IDENTIFICATION|REDENTIALS)|TERNAL_ERROR|VALID_(?:A(?:CTION(?:_DATA)?|NCHOR_CERT|UTHORITY)|C(?:ALL(?:BACK|ERAUTH_CONTEXT_POINTER)|ERT(?:GROUP(?:_POINTER)?|IFICATE|_(?:AUTHORITY|POINTER))|L_HANDLE|ONTEXT_HANDLE|RL(?:GROUP(?:_POINTER)?|_(?:AUTHORITY|ENCODING|POINTER|TYPE))?|SP_HANDLE)|D(?:ATA|B_(?:HANDLE|LIST(?:_POINTER)?)|L_HANDLE)|F(?:IELD_POINTER|ORM_TYPE)|I(?:D(?:ENTIFIER(?:_POINTER)?)?|N(?:DEX|PUT_POINTER))|KEYCACHE_HANDLE|N(?:AME|ETWORK_ADDR|UMBER_OF_FIELDS)|OUTPUT_POINTER|P(?:ASSTHROUGH_ID|O(?:INTER|LICY_IDENTIFIERS))|RE(?:ASON|QUEST_INPUTS|SPONSE_VECTOR)|S(?:IGNATURE|TOP_ON_POLICY)|T(?:IMESTRING|UPLE(?:GROUP(?:_POINTER)?)?))|_DARK_WAKE)|M(?:DS_ERROR|EMORY_ERROR)|NO(?:T_(?:SIGNER|TRUSTED)|_(?:DEFAULT_AUTHORITY|USER_INTERACTION))|OS_ACCESS_DENIED|RE(?:JECTED_FORM|QUEST_(?:LOST|REJECTED))|SE(?:LF_CHECK_FAILED|RVICE_NOT_AVAILABLE)|U(?:N(?:KNOWN_(?:FORMAT|TAG)|SUPPORTED_(?:ADDR_TYPE|SERVICE))|SER_CANCELED)|VERIF(?:ICATION_FAILURE|Y_ACTION_FAILED)))|_(?:A(?:C(?:L_(?:AUTHORIZATION_(?:ANY|CHANGE_(?:ACL|OWNER)|D(?:B(?:S_(?:CREATE|DELETE)|_(?:DELETE|INSERT|MODIFY|READ))|E(?:CRYPT|LETE|RIVE))|E(?:NCRYPT|XPORT_(?:CLEAR|WRAPPED))|GENKEY|I(?:MPORT_(?:CLEAR|WRAPPED)|NTEGRITY)|LOGIN|MAC|P(?:ARTITION_ID|REAUTH_(?:BASE|END))|SIGN|TAG_VENDOR_DEFINED_START)|CODE_SIGNATURE_(?:INVALID|OSX)|EDIT_MODE_(?:ADD|DELETE|REPLACE)|KEYCHAIN_PROMPT_(?:CURRENT_VERSION|INVALID(?:_ACT)?|REQUIRE_PASSPHRASE|UNSIGNED(?:_ACT)?)|MATCH_(?:BITS|GID|HONOR_ROOT|UID)|PR(?:EAUTH_TRACKING_(?:AUTHORIZED|BLOCKED|COUNT_MASK|UNKNOWN)|OCESS_SELECTOR_CURRENT_VERSION)|SUBJECT_TYPE_(?:A(?:NY|SYMMETRIC_KEY)|BIOMETRIC|CO(?:DE_SIGNATURE|MMENT)|EXT_PAM_NAME|HASHED_SUBJECT|KEYCHAIN_PROMPT|LOGIN_NAME|P(?:A(?:RTITION|SSWORD)|R(?:EAUTH(?:_SOURCE)?|O(?:CESS|MPTED_(?:BIOMETRIC|PASSWORD)|TECTED_(?:BIOMETRIC|PASSWORD)))|UBLIC_KEY)|SYMMETRIC_KEY|THRESHOLD))|_(?:BASE_(?:AC_ERROR|ERROR)|PRIVATE_ERROR))|DDR_(?:CUSTOM|N(?:AME|ONE)|SOCKADDR|URL)|LG(?:CLASS_(?:ASYMMETRIC|CUSTOM|D(?:ERIVEKEY|IGEST)|KEYGEN|MAC|NONE|RANDOMGEN|S(?:IGNATURE|YMMETRIC)|UNIQUEGEN)|ID_(?:3DES(?:_(?:1KEY(?:_EEE)?|2KEY(?:_E(?:DE|EE))?|3KEY(?:_E(?:DE|EE))?))?|A(?:ES|PPLE_YARROW|SC)|B(?:ATON|LOWFISH)|C(?:AST(?:3|5)?|DMF|RAB|USTOM|oncat(?:BaseAnd(?:Data|Key)|DataAndBase|KeyAndBase))|D(?:ES(?:Random|X)?|H|SA(?:_BSAFE)?)|E(?:C(?:AES|C|D(?:H(?:_X963_KDF)?|SA(?:_SPECIFIED)?)|ES|MQV|NRA)|NTROPY_DEFAULT|lGamal|xtractFromKey)|F(?:ASTHASH|E(?:AL|E(?:D(?:EXP)?|_(?:MD5|SHA1))?)|IPS186Random|ortezzaTimestamp)|G(?:OST|enericSecret)|HAVAL(?:3|4|5)?|I(?:BCHASH|DEA|ntelPlatformRandom)|JUNIPER|K(?:E(?:A|YCHAIN_KEY)|H(?:AFRE|UFU))|L(?:AST|OKI|UCIFER)|M(?:A(?:DRYGA|YFLY)|D(?:2(?:Random|WithRSA)?|4|5(?:HMAC|Random|WithRSA)?)|MB|QV)|N(?:HASH|ONE|RA)|OPENSSH1|P(?:BE_OPENSSL_MD5|H|KCS(?:12_(?:PBE_(?:ENCR|MAC)|SHA1_PBE)|5_PBKDF(?:1_(?:MD(?:2|5)|SHA1)|2)))|R(?:C(?:2|4|5)|DES|EDOC(?:3)?|IPEM(?:AC|D)|SA|UNNING_COUNTER)|S(?:AFER|E(?:AL|CURE_PASSPHRASE)|HA(?:1(?:HMAC(?:_LEGACY)?|With(?:DSA|EC(?:DSA|NRA)|RSA))?|2(?:24(?:With(?:ECDSA|RSA))?|56(?:With(?:ECDSA|RSA))?)|384(?:With(?:ECDSA|RSA))?|512(?:With(?:ECDSA|RSA))?|Random)|KIPJACK|SL3(?:KeyAndMacDerive|M(?:D5(?:_MAC)?|asterDerive)|PreMasterGen|SHA1(?:_MAC)?))|TIGER|UTC|VENDOR_DEFINED|Wrap(?:Lynks|SET_OAEP)|XORBaseAndData|_FIRST_UNUSED)|MODE_(?:BC|C(?:BC(?:128|64|C|P(?:D|adIV8)|_IV8)?|FB(?:16|32|8|PadIV8|_IV8)?|OUNTER|USTOM)|ECB(?:128|64|96|Pad)?|ISO_9796|LAST|NONE|O(?:AEP_HASH|FB(?:64|NLF|PadIV8|_IV8)?)|P(?:BC|CBC|FB|KCS1_EM(?:E_(?:OAEP|V15)|SA_V15)|RIVATE_(?:KEY|WRAP)|UBLIC_KEY)|RELAYX|SHUFFLE|VENDOR_DEFINED|WRAP|X9_31))|PPLE(?:CSP(?:DL_DB_(?:CHANGE_PASSWORD|GET_(?:HANDLE|SETTINGS)|IS_LOCKED|LOCK|SET_SETTINGS|UNLOCK)|_KEYDIGEST)|DL_OPEN_PARAMETERS_VERSION|FILEDL_(?:COMMIT|DELETE_FILE|MAKE_(?:BACKUP|COPY)|ROLLBACK|T(?:AKE_FILE_LOCK|OGGLE_AUTOCOMMIT))|SCPDL_CSP_GET_KEYHANDLE|X509CL_(?:OBTAIN_CSR|VERIFY_CSR)|_(?:PRIVATE_CSPDL_CODE_(?:1(?:0|1|2|3|4|5|6|7|8|9)|2(?:0|1|2|3|4|5|6|7)|8|9)|UNLOCK_TYPE_(?:KEY(?:BAG|_DIRECT)|WRAPPED_PRIVATE)))|SC_OPTIMIZE_(?:ASCII|DEFAULT|S(?:ECURITY|IZE)|TIME(?:_SIZE)?)|TT(?:ACH_READ_ONLY|RIBUTE_(?:A(?:CCESS_CREDENTIALS|L(?:ERT_TITLE|G_(?:ID|PARAMS))|SC_OPTIMIZATION)|B(?:ASE|LOCK_SIZE)|C(?:SP_HANDLE|USTOM)|D(?:ATA_(?:ACCESS_CREDENTIALS|C(?:RYPTO_DATA|SSM_DATA)|D(?:ATE|L_DB_HANDLE)|K(?:EY|R_PROFILE)|NONE|RANGE|STRING|UINT32|VERSION)|ESCRIPTION|L_DB_HANDLE)|E(?:FFECTIVE_BITS|ND_DATE)|FEE_(?:CURVE_TYPE|PRIME_TYPE)|I(?:NIT_VECTOR|TERATION_COUNT|V_SIZE)|K(?:EY(?:ATTR|USAGE|_(?:LENGTH(?:_RANGE)?|TYPE))?|RPROFILE_(?:LOCAL|REMOTE))|LABEL|MODE|NONE|OUTPUT_SIZE|P(?:A(?:DDING|RAM_KEY|SSPHRASE)|R(?:I(?:ME|VATE_KEY_FORMAT)|OMPT)|UBLIC_KEY(?:_FORMAT)?)|R(?:ANDOM|OUNDS(?:_RANGE)?|SA_BLINDING)|S(?:ALT|EED|TART_DATE|UBPRIME|YMMETRIC_KEY_FORMAT)|TYPE_MASK|VE(?:NDOR_DEFINED|R(?:IFY_PASSPHRASE|SION))|WRAPPED_KEY_FORMAT)))|BASE_ERROR|C(?:ERT(?:GROUP_(?:CERT_PAIR|DATA|ENCODED_CERT|PARSED_CERT)|_(?:ACL_ENTRY|BUNDLE_(?:CUSTOM|ENCODING_(?:BER|CUSTOM|DER|PGP|SEXPR|UNKNOWN)|LAST|P(?:FX|GP_KEYRING|KCS(?:12|7_SIGNED_(?:DATA|ENVELOPED_DATA)))|SPKI_SEQUENCE|UNKNOWN)|ENCODING_(?:BER|CUSTOM|DER|LAST|MULTIPLE|NDR|PGP|SEXPR|UNKNOWN)|Intel|LAST|MULTIPLE|P(?:ARSE_FORMAT_(?:C(?:OMPLEX|USTOM)|LAST|MULTIPLE|NONE|OID_NAMED|SEXPR|TUPLE)|GP)|S(?:DSIv1|PKI|TATUS_(?:EXPIRED|IS_(?:FROM_NET|IN_(?:ANCHORS|INPUT_CERTS)|ROOT)|NOT_VALID_YET|TRUST_SETTINGS_(?:DENY|FOUND_(?:ADMIN|SYSTEM|USER)|IGNORED_ERROR|TRUST)))|TUPLE|UNKNOWN|X(?:9_ATTRIBUTE|_509(?:_ATTRIBUTE|v(?:1|2|3)))))|L_(?:BASE_(?:CL_ERROR|ERROR)|CUSTOM_C(?:ERT_(?:BUNDLE_TYPE|ENCODING|PARSE_FORMAT|TYPE)|RL_PARSE_FORMAT)|PRIVATE_ERROR|TEMPLATE_(?:INTERMEDIATE_CERT|PKIX_CERTTEMPLATE))|ONTEXT_EVENT_(?:CREATE|DELETE|UPDATE)|RL(?:GROUP_(?:CRL_PAIR|DATA|ENCODED_CRL|PARSED_CRL)|_(?:ENCODING_(?:B(?:ER|LOOM)|CUSTOM|DER|MULTIPLE|SEXPR|UNKNOWN)|PARSE_FORMAT_(?:C(?:OMPLEX|USTOM)|LAST|MULTIPLE|NONE|OID_NAMED|SEXPR|TUPLE)|TYPE_(?:MULTIPLE|SPKI|UNKNOWN|X_509v(?:1|2))))|S(?:P_(?:BASE_(?:CSP_ERROR|ERROR)|H(?:ARDWARE|YBRID)|PRIVATE_ERROR|RDR_(?:EXISTS|HW|TOKENPRESENT)|S(?:OFTWARE|TORES_(?:CERTIFICATES|GENERIC|P(?:RIVATE_KEYS|UBLIC_KEYS)|SESSION_KEYS))|TOK_(?:CLOCK_EXISTS|LOGIN_REQUIRED|PR(?:IVATE_KEY_PASSWORD|OT_AUTHENTICATION)|RNG|SESSION_KEY_PASSWORD|USER_PIN_(?:EXPIRED|INITIALIZED)|WRITE_PROTECTED))|SM_(?:BASE_(?:CSSM_ERROR|ERROR)|PRIVATE_ERROR))|USTOM_COMMON_ERROR_EXTENT)|D(?:B_(?:A(?:CCESS_(?:PRIVILEGED|RE(?:AD|SET)|WRITE)|ND|TTRIBUTE_(?:FORMAT_(?:B(?:IG_NUM|LOB)|COMPLEX|MULTI_UINT32|REAL|S(?:INT32|TRING)|TIME_DATE|UINT32)|NAME_AS_(?:INTEGER|OID|STRING)))|C(?:ERT_USE_(?:OWNER|PRIVACY|REVOKED|S(?:IGNING|YSTEM)|TRUSTED)|ONTAINS(?:_(?:FINAL_SUBSTRING|INITIAL_SUBSTRING))?)|DATASTORES_UNKNOWN|EQUAL|FILESYSTEMSCAN_MODE|GREATER_THAN|INDEX_(?:NONUNIQUE|ON_(?:ATTRIBUTE|RECORD|UNKNOWN)|UNIQUE)|LESS_THAN|MODIFY_ATTRIBUTE_(?:ADD|DELETE|NONE|REPLACE)|NO(?:NE|T_EQUAL)|OR|RECORDTYPE_(?:APP_DEFINED_(?:END|START)|OPEN_GROUP_(?:END|START)|SCHEMA_(?:END|START))|TRANSACTIONAL_MODE)|L_(?:BASE_(?:DL_ERROR|ERROR)|CUSTOM|DB_(?:RECORD_(?:A(?:LL_KEYS|NY|PPLESHARE_PASSWORD)|C(?:ERT|RL)|EXTENDED_ATTRIBUTE|GENERIC(?:_PASSWORD)?|INTERNET_PASSWORD|METADATA|P(?:OLICY|RIVATE_KEY|UBLIC_KEY)|SYMMETRIC_KEY|U(?:NLOCK_REFERRAL|SER_TRUST)|X509_C(?:ERTIFICATE|RL))|SCHEMA_(?:ATTRIBUTES|IN(?:DEXES|FO)|PARSING_MODULE))|FFS|LDAP|MEMORY|ODBC|P(?:KCS11|RIVATE_ERROR)|REMOTEDIR|UNKNOWN))|E(?:LAPSED_TIME_(?:COMPLETE|UNKNOWN)|RR(?:CODE_(?:ACL_(?:ADD_FAILED|BASE_CERTS_NOT_SUPPORTED|CHA(?:LLENGE_CALLBACK_FAILED|NGE_FAILED)|DELETE_FAILED|ENTRY_TAG_NOT_FOUND|REPLACE_FAILED|SUBJECT_TYPE_NOT_SUPPORTED)|CRL_ALREADY_SIGNED|DEVICE_(?:FAILED|RESET)|FUNCTION_(?:FAILED|NOT_IMPLEMENTED)|IN(?:COMPATIBLE_VERSION|SUFFICIENT_CLIENT_IDENTIFICATION|TERNAL_ERROR|VALID_(?:AC(?:CESS_CREDENTIALS|L_(?:BASE_CERTS|CHALLENGE_CALLBACK|E(?:DIT_MODE|NTRY_TAG)|SUBJECT_VALUE)|_HANDLE)|C(?:ERT(?:GROUP_POINTER|_POINTER)|L_HANDLE|ONTEXT_HANDLE|R(?:L_POINTER|YPTO_DATA)|SP_HANDLE)|D(?:ATA|B_(?:HANDLE|LIST(?:_POINTER)?)|L_HANDLE)|FIELD_POINTER|GUID|INPUT_POINTER|KR_HANDLE|N(?:E(?:TWORK_ADDR|W_ACL_(?:ENTRY|OWNER))|UMBER_OF_FIELDS)|OUTPUT_POINTER|P(?:ASSTHROUGH_ID|OINTER)|SAMPLE_VALUE|TP_HANDLE)|_DARK_WAKE)|M(?:DS_ERROR|EMORY_ERROR|ODULE_MANIFEST_VERIFY_FAILED)|NO_USER_INTERACTION|O(?:BJECT_(?:ACL_(?:NOT_SUPPORTED|REQUIRED)|MANIP_AUTH_DENIED|USE_AUTH_DENIED)|PERATION_AUTH_DENIED|S_ACCESS_DENIED)|PRIVILEGE_NOT_GRANTED|S(?:AMPLE_VALUE_NOT_SUPPORTED|E(?:LF_CHECK_FAILED|RVICE_NOT_AVAILABLE))|U(?:NKNOWN_(?:FORMAT|TAG)|SER_CANCELED)|VERIFICATION_FAILURE)|ORCODE_(?:C(?:OMMON_EXTENT|USTOM_OFFSET)|MODULE_EXTENT))|STIMATED_TIME_UNKNOWN|VIDENCE_FORM_(?:APPLE_(?:CERT(?:GROUP|_INFO)|HEADER)|C(?:ERT(?:_ID)?|RL(?:_(?:ID|NEXTTIME|THISTIME))?)|POLICYINFO|TUPLEGROUP|UNSPECIFIC|VERIFIER_TIME))|F(?:ALSE|EE_(?:CURVE_TYPE_(?:ANSI_X9_62|DEFAULT|MONTGOMERY|WEIERSTRASS)|PRIME_TYPE_(?:DEFAULT|FEE|GENERAL|MERSENNE))|IELDVALUE_COMPLEX_DATA_TYPE)|HINT_(?:ADDRESS_(?:APP|SP)|NONE)|INVALID_HANDLE|K(?:EY(?:ATTR_(?:ALWAYS_SENSITIVE|EXTRACTABLE|MODIFIABLE|NEVER_EXTRACTABLE|P(?:ARTIAL|ERMANENT|RIVATE|UBLIC_KEY_ENCRYPT)|RETURN_(?:D(?:ATA|EFAULT)|NONE|REF)|SENSITIVE)|BLOB_(?:OTHER|R(?:AW(?:_FORMAT_(?:BSAFE|CCA|FIPS186|MSCAPI|NONE|O(?:CTET_STRING|PENSS(?:H(?:2)?|L)|THER)|P(?:GP|KCS(?:1|3|8))|SPKI|VENDOR_DEFINED|X509))?|EF(?:ERENCE|_FORMAT_(?:INTEGER|OTHER|S(?:PKI|TRING))))|WRAPPED(?:_FORMAT_(?:APPLE_CUSTOM|MSCAPI|NONE|O(?:PENSS(?:H1|L)|THER)|PKCS(?:7|8)))?)|CLASS_(?:OTHER|P(?:RIVATE_KEY|UBLIC_KEY)|SE(?:CRET_PART|SSION_KEY))|HEADER_VERSION|USE_(?:ANY|DE(?:CRYPT|RIVE)|ENCRYPT|SIGN(?:_RECOVER)?|UNWRAP|VERIFY(?:_RECOVER)?|WRAP)|_HIERARCHY_(?:EXPORT|INTEG|NONE))|R_(?:BASE_ERROR|PRIVATE_ERROR))|LIST_(?:ELEMENT_(?:DATUM|SUBLIST|WORDID)|TYPE_(?:CUSTOM|SEXPR|UNKNOWN))|M(?:DS_(?:BASE_ERROR|PRIVATE_ERROR)|ODULE_STRING_SIZE)|N(?:ET_PROTO_(?:C(?:MP(?:S)?|USTOM)|FTP(?:S)?|LDAP(?:NS|S)?|NONE|OCSP|UNSPECIFIED|X500DAP)|OTIFY_(?:FAULT|INSERT|REMOVE))|OK|P(?:ADDING_(?:A(?:LTERNATE|PPLE_SSLv2)|C(?:IPHERSTEALING|USTOM)|FF|NONE|ONE|PKCS(?:1|5|7)|RANDOM|SIGRAW|VENDOR_DEFINED|ZERO)|KCS(?:5_PBKDF2_PRF_HMAC_SHA1|_OAEP_(?:MGF(?:1_(?:MD5|SHA1)|_NONE)|PSOURCE_(?:NONE|Pspecified)))|RIVILEGE_SCOPE_(?:NONE|PROCESS|THREAD)|VC_(?:APP|NONE|SP))|QUERY_(?:RETURN_DATA|SIZELIMIT_NONE|TIMELIMIT_NONE)|S(?:AMPLE_TYPE_(?:ASYMMETRIC_KEY|BIOMETRIC|COMMENT|HASHED_PASSWORD|KEY(?:BAG_KEY|CHAIN_(?:CHANGE_LOCK|LOCK|PROMPT))|P(?:ASSWORD|R(?:EAUTH|O(?:CESS|MPTED_(?:BIOMETRIC|PASSWORD)|TECTED_(?:BIOMETRIC|PASSWORD))))|RETRY_ID|S(?:IGNED_(?:NONCE|SECRET)|YMMETRIC_KEY)|THRESHOLD)|ERVICE_(?:AC|C(?:L|S(?:P|SM))|DL|KR|TP))|T(?:P_(?:A(?:CTION_(?:ALLOW_EXPIRED(?:_ROOT)?|CRL_SUFFICIENT|DEFAULT|FETCH_C(?:ERT_FROM_NET|RL_FROM_NET)|IMPLICIT_ANCHORS|LEAF_IS_CA|REQUIRE_(?:CRL_(?:IF_PRESENT|PER_CERT)|REV_PER_CERT)|TRUST_SETTINGS)|UTHORITY_REQUEST_C(?:ERT(?:ISSUE|NOTARIZE|RE(?:SUME|VOKE)|SUSPEND|USERECOVER|VERIFY)|RLISSUE))|BASE_(?:ERROR|TP_ERROR)|C(?:ERT(?:CHANGE_(?:HOLD|NO(?:NE|T_AUTHORIZED)|OK(?:WITHNEWTIME)?|RE(?:ASON_(?:AFFILIATIONCHANGE|C(?:ACOMPROMISE|EASEOPERATION)|HOLDRELEASE|KEYCOMPROMISE|SU(?:PERCEDED|SPECTEDCOMPROMISE)|UNKNOWN)|JECTED|LEASE|VOKE)|STATUS_UNKNOWN|WRONGCA)|ISSUE_(?:NOT_AUTHORIZED|OK(?:WITH(?:CERTMODS|SERVICEMODS))?|REJECTED|STATUS_UNKNOWN|WILL_BE_REVOKED)|NOTARIZE_(?:NOT_AUTHORIZED|OK(?:WITH(?:OUTFIELDS|SERVICEMODS))?|REJECTED|STATUS_UNKNOWN)|RECLAIM_(?:NO(?:MATCH|T_AUTHORIZED)|OK|REJECTED|STATUS_UNKNOWN)|VERIFY_(?:EXPIRED|INVALID(?:_(?:AUTHORITY|BASIC_CONSTRAINTS|C(?:ERT(?:GROUP|_VALUE)|RL_DIST_PT)|NAME_TREE|POLICY(?:_IDS)?|SIGNATURE))?|NOT_VALID_YET|REVOKED|SUSPENDED|UNKNOWN(?:_CRITICAL_EXT)?|VALID)|_(?:DIR_UPDATE|NOTIFY_RENEW|PUBLISH))|ONFIRM_(?:ACCEPT|REJECT|STATUS_UNKNOWN)|RL(?:ISSUE_(?:INVALID_DOMAIN|NOT_(?:AUTHORIZED|CURRENT)|OK|REJECTED|STATUS_UNKNOWN|UNKNOWN_IDENTIFIER)|_DISTRIBUTE))|FORM_TYPE_(?:GENERIC|REGISTRATION)|KEY_ARCHIVE|PRIVATE_ERROR|STOP_ON_(?:FIRST_(?:FAIL|PASS)|NONE|POLICY))|RUE)|USEE_(?:AUTHENTICATION|DOMESTIC|FINANCIAL|INSURANCE|K(?:EYEXCH|R(?:ENT|LE))|LAST|MEDICAL|NONE|SSL|WEAK)|VALUE_NOT_AVAILABLE|WORDID_(?:A(?:CL|LPHA|SYMMETRIC_KEY)?|B(?:ER|I(?:NARY|OMETRIC))?|C(?:ANCELED|ERT|OMMENT|RL|USTOM)?|D(?:ATE|B(?:S_(?:CREATE|DELETE)|_(?:DELETE|EXEC_STORED_QUERY|INSERT|MODIFY|READ))|E(?:CRYPT|L(?:ETE|TA_CRL)|R(?:IVE)?)|ISPLAY|O|SA(?:_SHA1)?)?|E(?:LGAMAL|N(?:CRYPT|TRY)|XPORT_(?:CLEAR|WRAPPED))?|G(?:E(?:NKEY)?)?|HA(?:SH(?:ED_(?:PASSWORD|SUBJECT))?|VAL)|I(?:BCHASH|MPORT_(?:CLEAR|WRAPPED)|NTEL|SSUER(?:_INFO)?)|K(?:E(?:A|Y(?:BAG_KEY|CHAIN_(?:CHANGE_LOCK|LOCK|PROMPT)|HOLDER)?)|_OF_N)|L(?:E|OGIN(?:_NAME)?)?|M(?:AC|D(?:2(?:WITHRSA)?|4|5(?:WITHRSA)?))|N(?:AME|DR|HASH|OT_(?:AFTER|BEFORE)|U(?:LL|MERIC))?|O(?:BJECT_HASH|N(?:E_TIME|LINE)|WNER)|P(?:A(?:M_NAME|RTITION|SSWORD)|GP|IN|R(?:E(?:AUTH(?:_SOURCE)?|FIX)|IVATE_KEY|O(?:CESS|MPTED_(?:BIOMETRIC|PASSWORD)|PAGATE|TECTED_(?:BIOMETRIC|P(?:ASSWORD|IN))))|UBLIC_KEY(?:_FROM_CERT)?)?|Q|R(?:ANGE|EVAL|IPEM(?:AC|D(?:160)?)|SA(?:_(?:ISO9796|PKCS(?:1(?:_(?:MD5|S(?:HA1|IG)))?|_(?:MD5|SHA1))?|RAW))?)|S(?:DSIV1|E(?:QUENCE|T|XPR)|HA1(?:WITH(?:DSA|ECDSA|RSA))?|IGN(?:ATURE|ED_(?:NONCE|SECRET))?|PKI|UBJECT(?:_INFO)?|Y(?:MMETRIC_KEY|STEM))|T(?:AG|HRESHOLD|IME)|URI|VE(?:NDOR_(?:END|START)|RSION)|X(?:509(?:V(?:1|2|3)|_ATTRIBUTE)|9_ATTRIBUTE)|_(?:FIRST_UNUSED|NLU_|RESERVED_1|STAR_|UNK_))|X509_DATAFORMAT_(?:ENCODED|PA(?:IR|RSED))))|_MAX_PATH)|antDecompress|o(?:mm(?:entID|onID)|pyrightID))|D(?:RAWHook|T_(?:Authority(?:InfoAccess|KeyID)|BasicConstraints|C(?:ertPolicies|rl(?:DistributionPoints|Number|Reason))|DeltaCrl|ExtendedKeyUsage|I(?:nhibitAnyPolicy|ssu(?:erAltName|ingDistributionPoint))|KeyUsage|N(?:ameConstraints|etscapeCertType)|Other|Policy(?:Constraints|Mappings)|QC_Statements|Subject(?:AltName|KeyID)))|E(?:OLHook|QUALTO|V(?:HIDE|LEVEL|MOVE|NOP|SHOW))|F(?:ORMID|or(?:matVersionID|ward(?:BackwardLooping|Looping)))|G(?:NT_(?:D(?:NSName|irectoryName)|EdiPartyName|IPAddress|OtherName|R(?:FC822Name|egisteredID)|URI|X400Address)|REATERTHAN)|H(?:DActivity|ITTESTHook)|I(?:dleActivity|nstrumentID)|KAEISHandleCGI|L(?:A(?:TENCY_QOS_TIER_(?:0|1|2|3|4|5|UNSPECIFIED)|UNCH_DATA_(?:ARRAY|BOOL|DICTIONARY|ERRNO|FD|INTEGER|MACHPORT|OPAQUE|REAL|STRING))|ESSTHAN)|M(?:ACE(?:3Type|6Type)|IDIDataID|PLibrary_(?:DevelopmentRevision|M(?:ajorVersion|inorVersion)|Release)|arkerID)|N(?:X_(?:BigEndian|L(?:eftButton|ittleEndian)|OneButton|RightButton|UnknownByteOrder)|ameID|etActivity|o(?:Looping|neType))|O(?:S(?:A(?:ControlFlowError|Duplicate(?:Handler|P(?:arameter|roperty))|I(?:llegal(?:A(?:ccess|ssign)|Index|Range)|nconsistentDeclarations)|M(?:essageNotUnderstood|issingParameter)|ParameterMismatch|Syntax(?:Error|TypeError)|TokenTooLong|Undefined(?:Handler|Variable))|_LOG_TYPE_(?:DE(?:BUG|FAULT)|ERROR|FAULT|INFO))|verallAct)|S(?:SL_(?:DH(?:E_(?:DSS_(?:EXPORT_WITH_DES40_CBC_SHA|WITH_(?:3DES_EDE_CBC_SHA|DES_CBC_SHA))|RSA_(?:EXPORT_WITH_DES40_CBC_SHA|WITH_(?:3DES_EDE_CBC_SHA|DES_CBC_SHA)))|_(?:DSS_(?:EXPORT_WITH_DES40_CBC_SHA|WITH_(?:3DES_EDE_CBC_SHA|DES_CBC_SHA))|RSA_(?:EXPORT_WITH_DES40_CBC_SHA|WITH_(?:3DES_EDE_CBC_SHA|DES_CBC_SHA))|anon_(?:EXPORT_WITH_(?:DES40_CBC_SHA|RC4_40_MD5)|WITH_(?:3DES_EDE_CBC_SHA|DES_CBC_SHA|RC4_128_MD5))))|FORTEZZA_DMS_WITH_(?:FORTEZZA_CBC_SHA|NULL_SHA)|N(?:O_SUCH_CIPHERSUITE|ULL_WITH_NULL_NULL)|RSA_(?:EXPORT_WITH_(?:DES40_CBC_SHA|RC(?:2_CBC_40_MD5|4_40_MD5))|WITH_(?:3DES_EDE_CBC_(?:MD5|SHA)|DES_CBC_(?:MD5|SHA)|IDEA_CBC_(?:MD5|SHA)|NULL_(?:MD5|SHA)|RC(?:2_CBC_MD5|4_128_(?:MD5|SHA)))))|lpTypeErr|oundDataID)|T(?:ASK_(?:BACKGROUND_APPLICATION|CONTROL_APPLICATION|D(?:ARWINBG_APPLICATION|EFAULT_APPLICATION)|FOREGROUND_APPLICATION|GRAPHICS_SERVER|INSPECT_BASIC_COUNTS|NONUI_APPLICATION|RENICED|THROTTLE_APPLICATION|UNSPECIFIED)|HROUGHPUT_QOS_TIER_(?:0|1|2|3|4|5|UNSPECIFIED)|LS_(?:AES_(?:128_(?:CCM_(?:8_SHA256|SHA256)|GCM_SHA256)|256_GCM_SHA384)|CHACHA20_POLY1305_SHA256|DH(?:E_(?:DSS_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:256)?|GCM_SHA384)))|PSK_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|NULL_SHA(?:256|384)?|RC4_128_SHA)|RSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:256)?|GCM_SHA384))))|_(?:DSS_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:256)?|GCM_SHA384)))|RSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:256)?|GCM_SHA384)))|anon_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:256)?|GCM_SHA384))|RC4_128_MD5)))|E(?:CDH(?:E_(?:ECDSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|CHACHA20_POLY1305_SHA256|NULL_SHA|RC4_128_SHA)|PSK_WITH_AES_(?:128_CBC_SHA|256_CBC_SHA)|RSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|CHACHA20_POLY1305_SHA256|NULL_SHA|RC4_128_SHA))|_(?:ECDSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|NULL_SHA|RC4_128_SHA)|RSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|NULL_SHA|RC4_128_SHA)|anon_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_CBC_SHA|256_CBC_SHA)|NULL_SHA|RC4_128_SHA)))|MPTY_RENEGOTIATION_INFO_SCSV)|NULL_WITH_NULL_NULL|PSK_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|CHACHA20_POLY1305_SHA256|NULL_SHA(?:256|384)?|RC4_128_SHA)|RSA_(?:PSK_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|NULL_SHA(?:256|384)?|RC4_128_SHA)|WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:256)?|GCM_SHA384))|NULL_(?:MD5|SHA(?:256)?)|RC4_128_(?:MD5|SHA))))|extWidthHook)|U(?:NORDERED|srActivity)|W(?:DEFNFnd|IDTHHook)|XPC_ACTIVITY_STATE_(?:C(?:HECK_IN|ONTINUE)|D(?:EFER|ONE)|RUN|WAIT)|a(?:b(?:brevDate|ortErr)|c(?:tiv(?:Dev|Mask|ateEvt|eFlag(?:Bit)?)|uteUpr(?:A|I|O|U))|d(?:bAddrMask|d(?:Re(?:fFailed|sFailed)|Size(?:Bit)?))|eBuildSyntax(?:Bad(?:D(?:ata|esc)|EOF|Hex|Negative|Token)|CoercedList|MissingQuote|No(?:C(?:lose(?:Brac(?:e|ket)|Hex|Paren|String)|olon)|E(?:OF|rr)|Key)|OddHex|Uncoerced(?:DoubleAt|Hex))|fp(?:A(?:ccessDenied|lready(?:LoggedInErr|Mounted)|uthContinue)|B(?:ad(?:DirIDType|IDErr|UAM|VersNum)|itmapErr)|C(?:a(?:llNot(?:Allowed|Supported)|nt(?:Mo(?:untMoreSrvre|ve)|Rename)|talogChanged)|ontainsSharedErr)|D(?:enyConflict|i(?:ffVolErr|rNot(?:Empty|Found)|skFull))|EofError|F(?:ileBusy|latVol)|I(?:D(?:Exists|NotFound)|conTypeError|nside(?:SharedErr|TrashErr)|temNotFound)|LockErr|MiscErr|No(?:MoreLocks|Server)|Object(?:Exists|Locked|NotFound|TypeErr)|P(?:armErr|wd(?:ExpiredErr|NeedsChangeErr|PolicyErr|SameErr|TooShortErr))|Range(?:NotLocked|Overlap)|S(?:ame(?:NodeErr|ObjectErr)|e(?:rverGoingDown|ssClosed))|TooManyFilesOpen|UserNotAuth|VolLocked)|l(?:phaLock(?:Bit)?|tDBoxProc)|pp(?:1(?:Evt|Mask)|2(?:Evt|Mask)|3(?:Evt|Mask)|4(?:Evt|Mask)|IsDaemon|M(?:emFullErr|odeErr)|VersionTooOld|e(?:arance(?:Bad(?:BrushIndexErr|CursorIndexErr|TextColorIndexErr)|Process(?:NotRegisteredErr|RegisteredErr)|ThemeHasNoAccents)|ndDITL(?:Bottom|Right))|le(?:Logo|MenuFolderIconResource))|s(?:i(?:AliasName|ParentName|ServerName|VolumeName|ZoneName)|p(?:B(?:adVersNum|ufTooSmall)|No(?:Ack|MoreSess|Servers)|ParamErr|S(?:e(?:rverBusy|ssClosed)|izeErr)|TooMany))|t(?:AbsoluteCenter|Bottom(?:Left|Right)?|Center(?:Bottom|Left|Right|Top)|HorizontalCenter|Left|None|Right|Top(?:Left|Right)?|VerticalCenter|om(?:IndexInvalidErr|sNotOfSameTypeErr)|p(?:BadRsp|LenErr))|u(?:t(?:hFailErr|oKey(?:Mask)?)|xiliaryExportDataUnavailable))|b(?:A(?:ccessCntl|llowCDiDataHandler|ncestorModDateChanges)|DoNotDisplay|Ha(?:ndleAERecording|s(?:B(?:TreeMgr|lankAccessPrivileges)|C(?:atSearch|opyFile)|D(?:esktopMgr|irectIO)|ExtFSVol|F(?:ileIDs|olderLock)|MoveRename|OpenDeny|PersonalAccessPrivileges|ShortName|UserGroupList))|Is(?:AutoMounted|Case(?:Preserving|Sensitive)|Ejectable|On(?:ExternalBus|InternalBus)|Removable)|L(?:2PCanMapFileBlocks|anguageMask|imitFCBs|ocalWList)|No(?:BootBlks|DeskItems|LclSync|MiniFndr|RootTimes|S(?:witchTo|ysDir)|V(?:NEdit|olumeSizes))|ParentModDateChanges|S(?:cript(?:LanguageMask|Mask)|upports(?:2TBFiles|AsyncRequests|Ex(?:clusiveLocks|tendedFileSecurity)|FS(?:CatalogSearch|ExchangeObjects)|HFSPlusAPIs|Journaling|LongNames|MultiScriptNames|NamedForks|S(?:ubtreeIterators|ymbolicLinks)|TrashVolumeCache))|T(?:akeActiveEvent|rshOffLine)|a(?:d(?:ATPSkt|B(?:tSlpErr|uffNum)|C(?:allOrderErr|hannel|ksmErr|o(?:decCharacterizationErr|mponent(?:Instance|Selector|Type)|ntrollerHeight))|D(?:BtSlp|Cksum|ataRefIndex|e(?:lim|pthErr)|ictFormat|rag(?:FlavorErr|ItemErr|RefErr))|E(?:dit(?:Index|List|ionFileErr)|nding|xtResource)|F(?:CBErr|i(?:dErr|leFormat)|o(?:lderDescErr|rmat))|I(?:mage(?:Description|Err|RgnErr)|nputText)|LocNameErr|M(?:DBErr|ovErr)|P(?:asteboard(?:FlavorErr|I(?:ndexErr|temErr)|SyncErr)|ortNameErr|rofileError|ublicMovieAtom)|R(?:eqErr|outingSizeErr)|S(?:GChannel|crapRefErr|e(?:ctionErr|rviceMethodErr)|ubPartErr)|Tra(?:ckIndex|nslation(?:RefErr|SpecErr))|UnitErr)|se(?:DblQuote|SingQuote))|dNamErr|re(?:akRecd|veMark)|t(?:DupRecErr|Key(?:AttrErr|LenErr)|NoSpace|RecNotFnd|n(?:Ctrl|State(?:Bit)?))|uf(?:2SmallErr|TooSmall|fer(?:IsSmall|sTooSmall)))|c(?:A(?:DBAddress|EList|ccessory(?:Process|Suitcase)|ddress(?:Spec)?|lias(?:File|List|OrString)|p(?:pl(?:eTalkAddress|ication(?:File|Process)?)|ril)|rc|ugust)|B(?:o(?:dyColor|olean)|usAddress)|C(?:ell|har|l(?:assIdentifier|ipping(?:File|Window)|osure)|o(?:erc(?:e(?:KataHiragana|LowerCase|OneByteToTwoByte|Remove(?:Diacriticals|Hyphens|Punctuation|WhiteSpace)|SmallKana|UpperCase|Zenkakuhankaku)|ion)|l(?:orTable|umn)|n(?:stant|t(?:ainer(?:Window)?|entSpace|rolPanelFile))))|D(?:TPWindow|e(?:cember|pthErr|sk(?:AccessoryFile|top(?:Printer)?)|v(?:Err|Spec))|isk|ocument(?:File)?|rawingArea|ynamicLibrary)|E(?:n(?:tireContents|umeration)|thernetAddress|ventIdentifier)|F(?:TPItem|ebruary|i(?:le|reWireAddress|xed(?:Point|Rectangle)?)|o(?:lder|nt(?:File|Suitcase))|r(?:ame(?:Color|work)|iday))|Gr(?:aphic(?:Line|Object|Shape|Text)|oup(?:edGraphic)?)|H(?:TML|andle(?:Breakpoint|r))|I(?:PAddress|conFamily|n(?:foWindow|sertion(?:Loc|Point)|t(?:ern(?:alFinderObject|etAddress)|l(?:Text|WritingCode)))|tem)|J(?:anuary|u(?:ly|ne))|Key(?:Form|Identifier|stroke)|L(?:abel|i(?:n(?:e|kedList)|st(?:Element|Or(?:Record|String)|RecordOrString)?)|o(?:calTalkAddress|ng(?:DateTime|Fixed(?:Point|Rectangle)?|Integer|Point|Rectangle)))|M(?:a(?:chine(?:Loc)?|rch|tchErr|y)|enu(?:Item)?|issingValue|on(?:day|th))|N(?:o(?:MemErr|vember)|umber(?:DateTimeOrString|Or(?:DateTime|String))?)|O(?:bject(?:BeingExamined|Specifier)?|ctober|nline(?:Disk|LocalDisk|RemoteDisk)|penableObject|val)|P(?:ICT|a(?:ckage|ragraph)|ixel(?:Map)?|olygon|r(?:e(?:ferences(?:Window)?|position)|o(?:ce(?:dure|ss)|perty|tectErr)))|QD(?:Point|Rectangle)|R(?:GBColor|a(?:ngeErr|wData)|e(?:al|c(?:ord|tangle)|ference|sErr)|o(?:tation|undedRectangle|w)|unningAddress)|S(?:CSIAddress|aturday|cript(?:ingAddition)?|e(?:conds|lection|ptember)|h(?:ar(?:ableContainer|ing(?:Privileges|Window))|ortInteger)|mallReal|ound(?:File)?|pecialFolders|t(?:atusWindow|orage|ring(?:Class)?)|u(?:itcase|nday)|ymbol)|T(?:able|e(?:mpMemErr|xt(?:Color|Flow|Styles)?)|hu(?:mbColor|rsday)|okenRingAddress|rash|uesday|ype)|U(?:RL|SBAddress|ndefined|ser(?:Identifier)?)|Ve(?:ctor|rsion)|W(?:e(?:dnesday|ekday)|indow|ord|ritingCodeInfo)|Zone|a(?:l(?:Arabic(?:Civil|Lunar)|Coptic|Gregorian|J(?:apanese|ewish)|Persian|l(?:NotSupportedByNodeErr|erSecuritySession))|n(?:cel|not(?:BeLeafAtomErr|DeferErr|FindAtomErr|M(?:akeContiguousErr|oveAttachedController)|SetWidthOfAttachedController)|t(?:Create(?:PickerWindow|SingleForkFile)|DoThatInCurrentMode|EnableTrack|FindHandler|GetFlavorErr|LoadP(?:ackage|ick(?:MethodErr|er))|OpenHandler|PutPublicMovieAtom|Re(?:adUtilities|ceiveFromSynthesizerOSErr)|S(?:endToSynthesizerOSErr|tepErr)))|tChangedErr|utionIcon)|bNotFound|dev(?:GenErr|MemErr|ResErr|Unset)|e(?:dilla|nt(?:eredDot|ury))|frag(?:A(?:bortClosureErr|rchitectureErr)|C(?:F(?:M(?:InternalErr|StartupErr)|ragRsrcErr)|losureIDErr|on(?:nectionIDErr|t(?:ainerIDErr|extIDErr)))|DupRegistrationErr|ExecFileRefErr|F(?:i(?:leSizeErr|rst(?:ErrCode|ReservedCode))|ragment(?:CorruptErr|FormatErr|UsageErr))|I(?:mportToo(?:NewErr|OldErr)|nit(?:AtBootErr|FunctionErr|LoopErr|OrderErr))|L(?:astErrCode|ibConnErr)|MapFileErr|No(?:ApplicationErr|ClientMemErr|IDsErr|LibraryErr|P(?:ositionErr|rivateMemErr)|RegistrationErr|S(?:ectionErr|ymbolErr)|tClosureErr)|OutputLengthErr|R(?:eservedCode_(?:1|2|3)|srcForkErr)|StdFolderErr|UnresolvedErr)|h(?:a(?:nnel(?:Busy|NotBusy)|rCodeMask)|eckBoxProc|kCtrl)|ircumflex(?:Upr(?:A|E|I|O|U))?|kSumErr|l(?:earDev|k(?:RdErr|WrErr)|os(?:Err|eDev)|rBit)|m(?:1(?:0CLRData|1CLRData|2CLRData|3CLRData|4CLRData|5CLRData|6_8ColorPacking)|24_8ColorPacking|3(?:2_(?:16ColorPacking|32ColorPacking|8ColorPacking)|CLRData)|4(?:0_8ColorPacking|8_(?:16ColorPacking|8ColorPacking)|CLRData)|5(?:6_8ColorPacking|CLRData)|6(?:4_(?:16ColorPacking|8ColorPacking)|CLRData)|7CLRData|8(?:CLRData|_8ColorPacking)|9CLRData|A(?:RGB(?:32(?:PmulSpace|Space)|64(?:L(?:PmulSpace|Space)|PmulSpace|Space))|ToB(?:0Tag|1Tag|2Tag)|b(?:ortWriteAccess|s(?:oluteColorimetric|tractClass))|lpha(?:FirstPacking|LastPacking|PmulSpace|Space)|sciiData)|B(?:ToA(?:0Tag|1Tag|2Tag)|e(?:ginAccess|stMode)|inaryData|l(?:ackPointCompensation(?:Mask)?|ue(?:ColorantTag|TRCTag))|radfordChromaticAdaptation|ufferBasedProfile)|C(?:M(?:SReservedFlagsMask|Y(?:Data|K(?:32Space|64(?:LSpace|Space)|Data|Space)))|S(?:1(?:C(?:hromTag|ustTag)|NameTag|ProfileVersion|TRCTag)|2ProfileVersion)|a(?:librationDateTimeTag|meraDeviceClass|nt(?:Co(?:ncatenateError|pyModifiedV1Profile)|Delete(?:Element|Profile)|GamutCheckError|XYZ))|h(?:arTargetTag|romaticAdaptationTag)|lose(?:Access|Spool)|o(?:lorSpace(?:AlphaMask|Class|EncodingMask|P(?:ackingMask|remulAlphaMask)|ReservedMask|Space(?:AndAlphaMask|Mask))|pyrightTag)|reateNewAccess|urrent(?:DeviceInfoVersion|Profile(?:InfoVersion|LocationSize|MajorVersion)))|D(?:e(?:fault(?:DeviceID|ProfileID)|vice(?:AlreadyRegistered|DBNotFoundErr|InfoVersion1|M(?:fgDescTag|odelDescTag)|NotRegistered|Profile(?:InfoVersion(?:1|2)|sNotFound)|State(?:AppleRsvdBits|Busy|De(?:fault|viceRsvdBits)|ForceNotify|Offline)))|isplay(?:Class|DeviceClass|Use)|raftMode)|E(?:lementTagNotFound|mbedded(?:Mask|Profile|Use(?:Mask)?)|ndAccess|rrIncompatibleProfile)|F(?:atalProfileErr|lare(?:0|100))|G(?:amut(?:CheckingMask|Result(?:1Space|Space)|Tag)|eometry(?:0(?:45or450|dord0)|Unknown)|lossy(?:MatteMask)?|r(?:ay(?:16(?:LSpace|Space)|8Space|A(?:16(?:PmulSpace|Space)|32(?:L(?:PmulSpace|Space)|PmulSpace|Space)|PmulSpace|Space)|Data|Space|TRCTag)|een(?:ColorantTag|TRCTag)))|H(?:LS(?:32Space|Data|Space)|SV(?:32Space|Data|Space))|I(?:CC(?:ProfileVersion(?:2(?:1)?|4)|ReservedFlagsMask)|lluminant(?:A|D(?:5(?:0|5)|65|93)|EquiPower|F(?:2|8)|Unknown)|n(?:dexRangeErr|put(?:Class|Use)|ter(?:nalCFErr|polationMask)|valid(?:ColorSpace|DstMap|Profile(?:Comment|Location)?|S(?:earch|rcMap)))|terate(?:AllDeviceProfiles|Cu(?:rrentDeviceProfiles|stomDeviceProfiles)|DeviceProfilesMask|FactoryDeviceProfiles))|L(?:AB(?:24Space|32Space|48(?:LSpace|Space)|Space)|UV(?:32Space|Space)|abData|i(?:n(?:e(?:arChromaticAdaptation|sPer)|kClass)|ttleEndianPacking)|ong(?:10ColorPacking|8ColorPacking)|u(?:minanceTag|vData))|M(?:C(?:Eight(?:8Space|Space)|Five(?:8Space|Space)|H(?:5Data|6Data|7Data|8Data)|S(?:even(?:8Space|Space)|ix(?:8Space|Space)))|a(?:cintosh|gicNumber|keAndModelTag)|e(?:asurementTag|dia(?:BlackPointTag|WhitePointTag)|thod(?:Error|NotFound))|icrosoft)|N(?:a(?:med(?:Color(?:2Tag|Class|NotFound|Tag)|Data|Indexed(?:32(?:LSpace|Space)|Space))|tiveDisplayInfoTag)|o(?:C(?:olorPacking|urrentProfile)|GDevicesError|ProfileBase|Space|rmalMode)|umHeaderElements)|O(?:neBitDirectPacking|pen(?:Read(?:Access|Spool)|Write(?:Access|Spool))|riginalProfileLocationSize|utput(?:Class|Use))|P(?:S(?:2(?:C(?:RD(?:0Tag|1Tag|2Tag|3Tag|VMSizeTag)|SATag)|RenderingIntentTag)|7bit|8bit)|a(?:rametricType(?:0|1|2|3|4)|thBasedProfile)|erceptual|r(?:e(?:fsSynchError|view(?:0Tag|1Tag|2Tag))|interDeviceClass|o(?:file(?:Description(?:MLTag|Tag)|Error|IterateDataVersion(?:1|2|3|4)|MajorVersionMask|NotFound|SequenceDescTag|sIdentical)|of(?:DeviceClass|Use))|trDefaultScreens))|QualityMask|R(?:GB(?:16(?:LSpace|Space)|24Space|32Space|48(?:LSpace|Space)|565(?:LSpace|Space)|A(?:32(?:PmulSpace|Space)|64(?:L(?:PmulSpace|Space)|PmulSpace|Space)|PmulSpace|Space)|Data|Space)|angeOverFlow|e(?:ad(?:Access|Spool)|d(?:ColorantTag|TRCTag)|flective(?:TransparentMask)?|lativeColorimetric|servedSpace(?:1|2)|verseChannelPacking))|S(?:RGB(?:16ChannelEncoding|Data)|aturation|c(?:annerDeviceClass|reening(?:DescTag|Tag))|earchError|i(?:g(?:C(?:rdInfoType|urveType)|Dat(?:aType|eTimeType)|Lut(?:16Type|8Type)|M(?:akeAndModelType|easurementType|ulti(?:Funct(?:A2BType|B2AType)|LocalizedUniCodeType))|Na(?:medColor(?:2Type|Type)|tiveDisplayInfoType)|P(?:S2CRDVMSizeType|arametricCurveType|rofile(?:DescriptionType|SequenceDescType))|S(?:15Fixed16Type|creeningType|ignatureType)|TextType|U(?:1(?:6Fixed16Type|Fixed15Type)|Int(?:16Type|32Type|64Type|8Type)|crBgType|nicodeTextType)|Vi(?:deoCardGammaType|ewingConditionsType)|XYZType)|liconGraphics)|olaris|potFunction(?:Cross|D(?:efault|iamond)|Ellipse|Line|Round|Square|Unknown)|tdobs(?:19(?:31TwoDegrees|64TenDegrees)|Unknown))|T(?:aligent|echnology(?:AMDisplay|CRTDisplay|D(?:igitalCamera|yeSublimationPrinter)|Electro(?:photographicPrinter|staticPrinter)|F(?:ilm(?:Scanner|Writer)|lexography)|Gravure|InkJetPrinter|OffsetLithography|P(?:MDisplay|hoto(?:CD|ImageSetter|graphicPaperPrinter)|rojectionTelevision)|ReflectiveScanner|Silkscreen|T(?:ag|hermalWaxPrinter)|Video(?:Camera|Monitor)))|U(?:crBgTag|nsupportedDataType|seDefaultChromaticAdaptation)|V(?:i(?:deoCardGamma(?:FormulaType|Ta(?:bleType|g))|ewingConditions(?:DescTag|Tag))|onKriesChromaticAdaptation)|W(?:ord5(?:65ColorPacking|ColorPacking)|rite(?:Access|Spool))|XYZ(?:24Space|32Space|48(?:LSpace|Space)|Data|Space)|Y(?:CbCrData|XY(?:32Space|Space)|xyData)|apFontTableTag|dKey(?:Bit)?|p(?:Alias(?:NoFlags|OnlyThisFile)|IsMissing|ThreadSafe|WantsRegisterMessage))|o(?:dec(?:AbortErr|BadDataErr|C(?:ant(?:QueueErr|WhenErr)|onditionErr)|D(?:ataVersErr|isabledErr|roppedFrameErr)|E(?:rr|xtensionNotFoundErr)|ImageBufErr|N(?:eed(?:AccessKeyErr|ToFlushChainErr)|o(?:MemoryPleaseWaitErr|thingToBlitErr))|O(?:ffscreenFailed(?:Err|PleaseRetryErr)|penErr)|ParameterDialogConfirm|S(?:creenBufErr|izeErr|poolErr)|UnimpErr|WouldOffscreenErr)|l(?:lection(?:I(?:ndexRangeErr|tem(?:LockedErr|NotFoundErr))|VersionErr)|or(?:SyncNotInstalled|sRequestedErr))|mponent(?:AutoVersionIncludeFlags|D(?:ll(?:EntryNotFoundErr|LoadErr)|o(?:AutoVersion|ntRegister))|HasMultiplePlatforms|LoadResident|Not(?:Captured|ThreadSafeErr)|WantsUnregister)|n(?:nectionInvalid|straintReachedErr|t(?:ainer(?:AlreadyOpenWrn|NotFoundWrn)|rol(?:Err|HandleInvalidErr|InvalidDataVersionErr|Key(?:Bit)?|P(?:anelFolderIconResource|roperty(?:Invalid|NotFoundErr))|ler(?:BoundsNotExact|HasFixedHeight))))|pyDev|r(?:Err|eFoundationUnknownErr)|uld(?:Not(?:ParseSourceFileErr|ResolveDataRef|UseAnExistingSample)|ntGetRequiredComponent))|rash|trlItem|u(?:r(?:NumberPartsVersion|r(?:LeadingZ|NegSym|SymLead|TrailingZ|ent(?:CurLang|DefLang))|sorDev)|tDev))|d(?:BoxProc|InstErr|RemovErr|a(?:t(?:a(?:Already(?:Closed|OpenForWrite)|No(?:DataRef|tOpenFor(?:Read|Write))|VerErr)|e(?:StdMask|Time(?:Invalid|NotFound)))|y(?:Field|LdingZ|Mask|Of(?:Week(?:Field|Mask)|Year(?:Field|Mask))))|blDagger|c(?:eExtErr|m(?:B(?:ad(?:D(?:ataSizeErr|ictionaryErr)|F(?:eatureErr|i(?:eld(?:InfoErr|TypeErr)|ndMethodErr))|KeyErr|PropertyErr)|lockFullErr|ufferOverflowErr)|D(?:ictionary(?:BusyErr|NotOpenErr)|upRecordErr)|IterationCompleteErr|N(?:ecessaryFieldErr|o(?:AccessMethodErr|FieldErr|RecordErr|tDictionaryErr))|P(?:aramErr|ermissionErr|rotectedErr)|TooManyKeyErr))|dp(?:LenErr|SktErr)|e(?:activDev|bugging(?:Duplicate(?:OptionErr|SignatureErr)|ExecutionContextErr|Invalid(?:NameErr|OptionErr|SignatureErr)|No(?:CallbackErr|MatchErr))|fault(?:Component(?:Any(?:Flags(?:AnyManufacturer(?:AnySubType)?)?|Manufacturer|SubType)|Identical)|PhysicalEntryCount)|limPad|s(?:criptorFontTableTag|k(?:PatID|top(?:DamagedErr|IconResource))|tPortErr)|viceCantMeetRequest)|i(?:a(?:eresisUpr(?:E|I|Y)|log(?:Kind|NoTimeoutErr))|ffVolErr|giUnimpErr|r(?:FulErr|NFErr|ectXObjectAlreadyExists)|sk(?:Evt|Mask))|my|o(?:All|Color|F(?:ace|ont)|Size|Toggle|cumentProc|m(?:Cannot|Native|TranslateFirst|Wildcard)|tlessLwrI|ubleAcute)|r(?:agNotAcceptedErr|iver(?:Evt|HardwareGoneErr|Mask)|opFolderIconResource|vQType)|s(?:32BitMode|AddressErr|B(?:ad(?:L(?:aunch|ibrary)|Patch(?:Header)?|S(?:ANEOpcode|lotInt|tartupDisk))|u(?:fPtrTooLow|sError))|C(?:DEFNotFound|antHoldSystemHeap|hkErr|oreErr)|Di(?:rtyDisk|sassemblerInstalled)|ExtensionsDisabled|F(?:PErr|SErr|inderErr|orcedQuit)|G(?:ibblyMovedToDisabledFolder|reeting)|H(?:D20Installed|MenuFindErr)|I(?:OCoreErr|llInstErr|rqErr)|L(?:ine(?:AErr|FErr)|o(?:adErr|stConnectionToNetworkDisk))|M(?:B(?:ATA(?:PISysError|SysError)|ExternFlpySysError|FlpySysError|SysError|arNFnd)|DEFNotFound|ac(?:OSROMVersionTooOld|sBugInstalled)|emFullErr|i(?:scErr|xedModeFailure)|ustUseFCBAccessors)|N(?:eedToWriteBootBlocks|o(?:Exts(?:Disassembler|MacsBug)|FPU|P(?:a(?:ckErr|tch)|k(?:1|2|3|4|5|6|7))|t(?:EnoughRAMToBoot|The1)))|O(?:ldSystem|vflowErr)|P(?:CCardATASysError|arityErr|rivErr)|R(?:AMDiskTooBig|e(?:insert|moveDisk))|S(?:CSIWarn|hutDownOrRes(?:tart|ume)|tknHeap|witchOffOrRestart|ys(?:Err|tem(?:FileErr|RequiresPowerPC)))|TraceErr|UnBootableSystem|VM(?:BadBackingStore|DeferredFuncTableFull)|W(?:DEFNotFound|riteToSupervisorStackGuardPage)|ZeroDivErr|kFulErr)|tQType|u(?:mmyType|p(?:FNErr|licate(?:AtomTypeAndIDErr|F(?:lavorErr|olderDescErr)|HandlerErr|PasteboardFlavorErr|RoutingErr|ScrapFlavorErr))|ration(?:Day|Forever|Hour|Mi(?:crosecond|llisecond|nute)|NoWait|Second))|ym)|e(?:A(?:DB|ddressSpec|nalogAudio|ppleTalk|udio(?:Line(?:In|Out)|Out))|Bus|C(?:DROM|apsLockDown|learKey|o(?:mm(?:Slot|andDown)|n(?:duit|trolDown)))|D(?:VD|e(?:leteKey|viceType)|i(?:gitalAudio|splay)|ownArrowKey)|E(?:n(?:dKey|terKey)|scapeKey|thernet)|F(?:1(?:0Key|1Key|2Key|3Key|4Key|5Key|Key)|2Key|3Key|4Key|5Key|6Key|7Key|8Key|9Key|ireWire|loppy|orwardDelKey)|H(?:D|elpKey|omeKey)|I(?:P|RTalk|nfrared|rDA)|Key(?:Kind|board)|L(?:CD|e(?:ftArrowKey|nErr)|ocalTalk)|M(?:ac(?:IP|Video)|icrophone|o(?:d(?:em(?:P(?:ort|rinterPort))?|ifiers)|nitorOut|use)|ultiErr)|NuBus(?:Card)?|OptionDown|P(?:C(?:I(?:bus|card)|card)|DS(?:card|slot)|PP|age(?:DownKey|UpKey)|o(?:intingDevice|stScript)|r(?:inter(?:Port)?|otocol))|R(?:eturnKey|ightArrowKey)|S(?:CSI|VGA|cheme|erial|hiftDown|peakers|torageDevice|video)|T(?:abKey|okenRing|rack(?:ball|pad))|U(?:SB|pArrowKey)|Video(?:In|Monitor|Out)|WS(?:ArrayType|BooleanType|D(?:at(?:aType|eType)|ictionaryType|oubleType)|IntegerType|NullType|StringType|UnknownType)|dit(?:Text|i(?:ngNotAllowed|onMgrInitErr))|mptyPathErr|n(?:dOfDataReached|um(?:A(?:fterDate|l(?:iases|l(?:D(?:isks|ocuments)|LocalDisks|OpenFolders|RemoteDisks))|nyDate|rr(?:angement|ows))|B(?:e(?:foreDate|tweenDate)|ooleanValues)|Con(?:flicts|sid(?:erations|sAndIgnores))|Date|ExistingItems|Fo(?:lders|ntsPanel)|Ge(?:neralPanel|stalt)|I(?:conSize|nfoWindowPanel)|Justification|KeyForm|La(?:rgeIconSize|st(?:Month|Week|Year))|M(?:emoryPanel|i(?:niIconSize|scValues))|O(?:lderItems|nDate)|P(?:osition|r(?:efs(?:ButtonViewPanel|GeneralPanel|IconViewPanel|L(?:abelPanel|istViewPanel)|WindowPanel)|otection))|Quality|S(?:aveOptions|haringPanel|mallIconSize|ortDirection(?:Normal|Reverse)?|t(?:at(?:ionery|usNConfigPanel)|yle))|T(?:his(?:Month|Week|Year)|oday|ransferMode)|ViewBy|Where|Yesterday)|v(?:BadVers|NotPresent|VersTooBig))|ofErr|r(?:a(?:Field|Mask)|r(?:A(?:E(?:AccessorNotFound|B(?:ad(?:KeyForm|ListItem|TestKey)|u(?:fferTooSmall|ildSyntaxError))|C(?:ant(?:HandleClass|PutThatThere|SupplyType|Undo)|o(?:ercionFail|rruptData))|D(?:esc(?:IsNull|NotFound)|uplicateHandler)|E(?:mptyListContainer|vent(?:F(?:ailed|iltered)|Not(?:Handled|Permitted)|WouldRequireUserConsent))|HandlerNotFound|I(?:llegalIndex|mpossibleRange|n(?:Transaction|dexTooLarge))|LocalOnly|N(?:e(?:gativeCount|werVersion)|o(?:Such(?:Logical|Object|Transaction)|User(?:Interaction|Selection)|t(?:A(?:EDesc|S(?:ingleObject|pecialFunction)|n(?:E(?:lement|numMember)|ObjSpec)|ppleEvent)|Modifiable)))|P(?:aramMissed|r(?:ivilegeError|opertiesClash))|Re(?:adDenied|c(?:eive(?:EscapeCurrent|Terminate)|ordingIsAlreadyOn)|plyNot(?:Arrived|Valid))|Stream(?:AlreadyConverted|BadNesting)|T(?:argetAddressNotPermitted|imeout|ypeError)|Unknown(?:AddressType|ObjectType|SendMode)|ValueOutOfRange|W(?:aitCanceled|r(?:iteDenied|ong(?:DataType|NumberArgs))))|S(?:CantCo(?:mpareMoreThan32k|nsiderAndIgnore)|I(?:llegalFormalParameter|nconsistentNames)|NoResultReturned|ParameterNotForEvent|TerminologyNestingTooDeep)|borted|lreadyInImagingMode|ttention|uthorization(?:BadAddress|Canceled|Denied|ExternalizeNotAllowed|In(?:ter(?:actionNotAllowed|nal(?:izeNotAllowed)?)|valid(?:Flags|Pointer|Ref|Set|Tag))|Success|ToolE(?:nvironmentError|xecuteFailure)))|C(?:an(?:NotInsertWhileWalkProcInProgress|notUndo|tEmbed(?:IntoSelf|Root))|o(?:ntrol(?:DoesntSupportFocus|HiddenOrDisabled|IsNotEmbedder|sAlreadyExist)|r(?:eEndianData(?:DoesNotMatchFormat|Too(?:LongForFormat|ShortForFormat))|ruptWindowDescription)|uldntSetFocus)|pp(?:General|Last(?:SystemDefinedError|UserDefinedError)|bad_(?:alloc|cast|exception|typeid)|domain_error|i(?:nvalid_argument|os_base_failure)|l(?:ength_error|ogic_error)|o(?:ut_of_range|verflow_error)|r(?:ange_error|untime_error)|underflow_error))|D(?:SPQueueSize|ata(?:Browser(?:I(?:nvalidProperty(?:Data|Part)|temNot(?:Added|Found))|NotConfigured|PropertyNot(?:Found|Supported))|NotSupported|SizeMismatch))|E(?:mptyScrap|n(?:dOf(?:Body|Document)|gineNotFound))|F(?:S(?:AttributeNotFound|Bad(?:AllocFlags|Buffer|F(?:SRef|ork(?:Name|Ref))|I(?:nfoBitmap|te(?:mCount|ratorFlags))|PosMode|SearchParams)|Fork(?:Exists|NotFound)|IteratorNot(?:Found|Supported)|Missing(?:CatInfo|Name)|N(?:ameTooLong|o(?:MoreItems|t(?:AFolder|EnoughSpaceForOperation)))|OperationNotSupported|PropertyNotValid|QuotaExceeded|RefsDifferent|UnknownCall)|inder(?:AppFolderProtected|B(?:adPackageContents|oundsWrong)|C(?:an(?:notPutAway|t(?:DeleteImmediately|Move(?:Source|To(?:Ancestor|Destination))|Overwrite|UseTrashedItems))|orruptOpenFolderList)|FileSharingMustBeOn|I(?:ncestuousMove|sBusy|temAlreadyInDest)|L(?:astReserved|ockedItemsInTrash)|MustBeActive|NoInvisibleFiles|OnlyLockedItemsInTrash|Pro(?:gramLinkingMustBeOn|perty(?:DoesNotApply|NowWindowBased))|S(?:harePointsCantInherit|ysFolderProtected)|Un(?:knownUser|supportedInsidePackages)|VolumeNotFound|Window(?:MustBe(?:ButtonView|IconView|ListView)|NotOpen|WrongType))|loatingWindowsNotInitialized|wdReset)|HMIllegalContentForM(?:aximumState|inimumState)|I(?:A(?:AllocationErr|BufferTooSmall|Canceled|EndOfTextRun|InvalidDocument|No(?:Err|MoreItems)|ParamErr|TextExtractionErr|UnknownErr)|nvalid(?:PartCode|Range|Window(?:P(?:roperty|tr)|Ref))|te(?:m(?:AlreadyInTree|Not(?:Control|FoundInTree))|ratorReachedEnd))|K(?:B(?:Fail(?:Setting(?:ID|TranslationTable)|WritePreference)|IlligalParameters|PS2KeyboardNotAvailable)|C(?:AuthFailed|BufferTooSmall|CreateChainFailed|D(?:ata(?:Not(?:Available|Modifiable)|TooLarge)|uplicate(?:Callback|Item|Keychain))|I(?:n(?:teraction(?:NotAllowed|Required)|valid(?:Callback|ItemRef|Keychain|SearchRef))|temNotFound)|KeySizeNotAllowed|No(?:CertificateModule|DefaultKeychain|PolicyModule|S(?:torageModule|uch(?:Attr|Class|Keychain))|tAvailable)|ReadOnly(?:Attr)?|WrongKCVersion))|M(?:arginWilllNotFit|essageNotSupported)|N(?:eedsCompositedWindow|o(?:HiliteText|RootControl|nContiuousAttribute|t(?:InImagingMode|ValidTree)))|O(?:SA(?:AppNotHighLevelEventAware|BadS(?:elector|torageType)|C(?:ant(?:A(?:ccess|ssign)|C(?:oerce|reate)|GetTerminology|Launch|OpenComponent|StorePointers)|o(?:mponentMismatch|rrupt(?:Data|Terminology)))|D(?:ata(?:BlockTooLarge|Format(?:Obsolete|TooNew))|ivideByZero)|GeneralError|In(?:ternalTableOverflow|validID)|N(?:oSuchDialect|umericOverflow)|RecordingIsAlreadyOn|S(?:criptError|ourceNotAvailable|tackOverflow|ystemError)|TypeError)|ffset(?:I(?:nvalid|sOutsideOfView)|NotOnElementBounday)|pen(?:Denied|ing))|R(?:e(?:adOnlyText|fNum)|ootAlreadyExists)|S(?:SL(?:ATS(?:C(?:ertificate(?:HashAlgorithmViolation|TrustViolation)|iphersuiteViolation)|LeafCertificateHashAlgorithmViolation|Minimum(?:KeySizeViolation|VersionViolation)|Violation)|B(?:ad(?:C(?:ert(?:ificateStatusResponse)?|ipherSuite|onfiguration)|RecordMac)|ufferOverflow)|C(?:ert(?:Expired|NotYetValid|ificateRequired)|l(?:ient(?:CertRequested|HelloReceived)|osed(?:Abort|Graceful|NoNotify))|on(?:figurationFailed|nectionRefused)|rypto)|Dec(?:o(?:deError|mpressFail)|ryptionFail)|FatalAlert|H(?:andshakeFail|ostNameMismatch)|I(?:llegalParam|n(?:appropriateFallback|ternal))|M(?:issingExtension|oduleAttach)|N(?:e(?:gotiation|tworkTimeout)|oRootCert)|P(?:eer(?:A(?:ccessDenied|uthCompleted)|Bad(?:Cert|RecordMac)|Cert(?:Expired|Revoked|Unknown)|Dec(?:o(?:deError|mpressFail)|rypt(?:Error|ionFail))|ExportRestriction|HandshakeFail|In(?:sufficientSecurity|ternalError)|NoRenegotiation|ProtocolVersion|RecordOverflow|U(?:n(?:expectedMsg|knownCA|supportedCert)|serCancelled))|rotocol)|RecordOverflow|SessionNotFound|TransportReset|Un(?:expected(?:Message|Record)|known(?:PSKIdentity|RootCert)|recognizedName|supportedExtension)|W(?:eakPeerEphemeralDHKey|ouldBlock)|XCertChainInvalid)|e(?:c(?:A(?:CL(?:AddFailed|ChangeFailed|DeleteFailed|NotSimple|ReplaceFailed)|ddin(?:LoadFailed|UnloadFailed)|l(?:gorithmMismatch|locate|readyLoggedIn)|pple(?:AddAppACLSubject|InvalidKey(?:EndDate|StartDate)|PublicKeyIncomplete|S(?:SLv2Rollback|ignatureMismatch))|tt(?:achHandleBusy|ributeNotInContext)|uthFailed)|B(?:adReq|lockSizeMismatch|ufferTooSmall)|C(?:RL(?:AlreadySigned|BadURI|Expired|Not(?:Found|Trusted|ValidYet)|PolicyFailed|ServerDown)|S(?:AmbiguousBundleFormat|Bad(?:BundleFormat|CallbackValue|Di(?:ctionaryFormat|skImageFormat)|FrameworkVersion|LVArch|MainExecutable|NestedCode|ObjectFormat|Resource|TeamIdentifier)|C(?:MSTooLarge|ancelled)|D(?:B(?:Access|Denied)|SStoreSymlink|bCorrupt)|FileHardQuarantined|GuestInvalid|H(?:elperFailed|ost(?:Protocol(?:Contradiction|DedicationError|Invalid(?:Attribute|Hash)|NotProxy|RelativePath|StateError|Unrelated)|Reject))|In(?:foPlistFailed|ternalError|valid(?:A(?:ssociatedFileData|ttributeValues)|Entitlements|Flags|ObjectRef|Platform|RuntimeVersion|Symlink|TeamIdentifier))|MultipleGuests|No(?:Ma(?:inExecutable|tches)|SuchCode|t(?:A(?:Host|ppLike)|Supported))|O(?:bjectRequired|utdated)|Re(?:gularFile|q(?:Failed|Invalid|Unsupported)|source(?:DirectoryFailed|NotSupported|RulesInvalid|s(?:Invalid|Not(?:Found|Sealed)))|vokedNotarization)|S(?:ig(?:DB(?:Access|Denied)|nature(?:Failed|Invalid|NotVerifiable|Un(?:supported|trusted)))|taticCode(?:Changed|NotFound))|TooBig|Un(?:implemented|s(?:ealed(?:AppRoot|FrameworkRoot)|igned(?:NestedCode)?|upported(?:DigestAlgorithm|GuestAttributes)))|Vetoed|WeakResource(?:Envelope|Rules))|allbackFailed|ertificate(?:CannotOperate|Expired|N(?:ameNotAllowed|otValidYet)|PolicyNotAllowed|Revoked|Suspended|ValidityPeriodTooLong)|o(?:deSigning(?:Bad(?:CertChainLength|PathLengthConstraint)|Development|No(?:BasicConstraints|ExtendedKeyUsage))|nversionError|reFoundationUnknown)|reateChainFailed)|D(?:ata(?:Not(?:Available|Modifiable)|TooLarge|baseLocked|storeIsOpen)|e(?:code|vice(?:Error|Failed|Reset|VerifyFailed))|iskFull|skFull|uplicate(?:Callback|Item|Keychain))|E(?:MM(?:LoadFailed|UnloadFailed)|ndOfData|ventNotificationCallbackNotFound|xtendedKeyUsageNotCritical)|F(?:i(?:eldSpecifiedMultiple|leTooBig)|unction(?:Failed|IntegrityFail))|HostNameMismatch|I(?:DPFailure|O|n(?:DarkWake|comp(?:atible(?:DatabaseBlob|FieldFormat|KeyBlob|Version)|leteCertRevocationCheck)|putLengthError|sufficientC(?:lientID|redentials)|ter(?:action(?:NotAllowed|Required)|nal(?:Component|Error))|val(?:dCRLAuthority|id(?:A(?:CL|c(?:cess(?:Credentials|Request)|tion)|ddinFunctionTable|lgorithm(?:Parms)?|ttribute(?:AccessCredentials|B(?:ase|lockSize)|DLDBHandle|E(?:ffectiveBits|ndDate)|I(?:nitVector|terationCount)|Key(?:Length|Type)?|Label|Mode|OutputSize|P(?:a(?:dding|ssphrase)|ri(?:me|vateKeyFormat)|ublicKeyFormat)|R(?:andom|ounds)|S(?:alt|eed|tartDate|ubprime|ymmetricKeyFormat)|Version|WrappedKeyFormat)|uthority(?:KeyID)?)|B(?:aseACLs|undleInfo)|C(?:RL(?:Encoding|Group|Index|Type)?|allback|ert(?:Authority|ificate(?:Group|Ref))|ontext)|D(?:BL(?:ist|ocation)|ata(?:baseBlob)?|igestAlgorithm)|E(?:ncoding|xtendedKeyUsage)|FormType|GUID|Handle(?:Usage)?|I(?:D(?:Linkage)?|dentifier|n(?:dex(?:Info)?|putVector)|temRef)|Key(?:AttributeMask|Blob|Format|Hierarchy|Label|Ref|Usage(?:ForPolicy|Mask)|chain)|LoginName|ModifyMode|N(?:ame|e(?:tworkAddress|wOwner)|umberOfFields)|O(?:utputVector|wnerEdit)|P(?:VC|a(?:rsingModule|ss(?:throughID|wordRef))|o(?:inter|licyIdentifiers)|refsDomain)|Query|R(?:e(?:ason|cord|quest(?:Inputs|or)|sponseVector)|oot)|S(?:ampleValue|cope|e(?:archRef|rviceMask)|ignature|topOnPolicy|ub(?:ServiceID|ject(?:KeyID|Name)))|T(?:imeString|rustSetting(?:s)?|uple(?:Credendtials|Group)?)|Val(?:idityPeriod|ue))))|temNotFound)|Key(?:BlobTypeIncorrect|HeaderInconsistent|IsSensitive|SizeNotAllowed|UsageIncorrect)|LibraryReferenceNotFound|M(?:DSError|emoryError|issing(?:A(?:lgorithmParms|ttribute(?:AccessCredentials|B(?:ase|lockSize)|DLDBHandle|E(?:ffectiveBits|ndDate)|I(?:nitVector|terationCount)|Key(?:Length|Type)?|Label|Mode|OutputSize|P(?:a(?:dding|ssphrase)|ri(?:me|vateKeyFormat)|ublicKeyFormat)|R(?:andom|ounds)|S(?:alt|eed|tartDate|ubprime|ymmetricKeyFormat)|Version|WrappedKeyFormat))|Entitlement|RequiredExtension|Value)|o(?:bileMe(?:CSRVerifyFailure|FailedConsistencyCheck|NoRequestPending|Request(?:AlreadyPending|Queued|Redirected)|Server(?:AlreadyExists|Error|NotAvailable|ServiceErr))|dule(?:Man(?:ager(?:InitializeFailed|NotFound)|ifestVerifyFailed)|NotLoaded))|ultiple(?:ExecSegments|PrivKeys|ValuesUnsupported))|N(?:etworkFailure|o(?:AccessForItem|BasicConstraints(?:CA)?|CertificateModule|Default(?:Authority|Keychain)|FieldValues|PolicyModule|S(?:torageModule|uch(?:Attr|Class|Keychain))|TrustSettings|t(?:Available|Initialized|LoggedIn|Signer|Trusted)))|O(?:CSP(?:BadRe(?:quest|sponse)|No(?:Signer|tTrustedToAnchor)|Respon(?:der(?:InternalError|MalformedReq|SignatureRequired|TryLater|Unauthorized)|seNonceMismatch)|S(?:ignatureError|tatusUnrecognized)|Unavailable)|pWr|utputLengthError)|P(?:VC(?:AlreadyConfigured|ReferentNotFound)|a(?:ram|ssphraseRequired|thLengthConstraintExceeded)|kcs12VerifyFailure|olicyNotFound|rivilegeNot(?:Granted|Supported)|ublicKeyInconsistent)|Qu(?:erySizeUnknown|otaExceeded)|Re(?:adOnly(?:Attr)?|cordModified|jectedForm|quest(?:Descriptor|Lost|Rejected)|sourceSignBad(?:CertChainLength|ExtKeyUsage))|S(?:MIME(?:Bad(?:ExtendedKeyUsage|KeyUsage)|EmailAddressesNotFound|KeyUsageNotCritical|NoEmailAddress|SubjAltNameNotCritical)|SLBadExtendedKeyUsage|e(?:lfCheckFailed|rviceNotAvailable)|igningTimeMissing|tagedOperation(?:InProgress|NotStarted)|uccess)|T(?:agNotFound|imestamp(?:AddInfoNotAvailable|Bad(?:Alg|DataFormat|Request)|Invalid|Missing|NotTrusted|Re(?:jection|vocation(?:Notification|Warning))|S(?:erviceNotAvailable|ystemFailure)|TimeNotAvailable|Unaccepted(?:Extension|Policy)|Waiting)|rust(?:NotAvailable|SettingDeny))|U(?:n(?:implemented|known(?:C(?:RLExtension|ertExtension|riticalExtensionFlag)|Format|QualifiedCertStatement|Tag)|supported(?:AddressType|F(?:ieldFormat|ormat)|IndexInfo|Key(?:AttributeMask|Format|Label|Size|UsageMask)|Locality|Num(?:Attributes|Indexes|RecordTypes|SelectionPreds)|Operator|QueryLimits|Service|VectorOfBuffers))|serCanceled)|Verif(?:icationFailure|y(?:ActionFailed|Failed))|Wr(?:Perm|ongSecVersion))|ssion(?:AuthorizationDenied|In(?:ternal|valid(?:Attributes|Flags|Id))|Success|ValueNotSet))|tate)|T(?:askNotFound|opOf(?:Body|Document)|reeIsLocked)|U(?:n(?:known(?:AttributeTag|Control|Element)|recognizedWindowClass|supportedWindowAttributesForClass)|serWantsToDragWindow)|W(?:S(?:InternalError|ParseError|T(?:imeoutError|ransportError))|indow(?:Does(?:Not(?:FitOnscreen|HaveProxy)|ntSupportFocus)|NotFound|PropertyNotFound|RegionCodeInvalid|sAlreadyInitialized))))|url(?:A(?:FP|T)|EPPC|F(?:TP|ile)|Gopher|HTTP(?:S)?|IMAP|L(?:DAP|aunch)|M(?:ail(?:box)?|essage|ulti)|N(?:FS|NTP|ews)|POP|RTSP|SNews|Telnet|Unknown)|v(?:Type|e(?:nt(?:AlreadyPostedErr|ClassIn(?:correctErr|validErr)|DeferAccessibilityEventErr|H(?:andlerAlreadyInstalledErr|otKey(?:ExistsErr|InvalidErr))|InternalErr|KindIncorrectErr|Loop(?:QuitErr|TimedOutErr)|Not(?:HandledErr|InQueueErr)|Pa(?:rameterNotFoundErr|ssToNextTargetErr)|TargetBusyErr)|ryEvent)|tNotEnb)|x(?:UserBreak|cessCollsns|t(?:FSErr|en(?:dedBlock(?:Len)?|sionsFolderIconResource)|ra(?:ctErr|neousStrings))))|f(?:B(?:adPartsTable|estGuess|syErr)|D(?:esktop|isk)|E(?:mptyFormatString|xtra(?:Decimal|Exp|Percent|Separator))|Form(?:StrIsNAN|atO(?:K|verflow))|HasBundle|Invisible|LckdErr|Missing(?:Delimiter|Literal)|Negative|O(?:nDesk|utOfSynch)|Positive|SpuriousChars|Trash|VNumber|Zero|a(?:ceBit|talDateTime)|e(?:ature(?:FontTableTag|Unsupported)|tchReference)|i(?:Ligature|d(?:Exists|NotFound)|eldOrderNotIntl|le(?:BoundsErr|OffsetTooBigErr)|rst(?:DskErr|PickerError))|l(?:Ligature|avor(?:DataPromised|NotSaved|S(?:ender(?:Only|Translated)|ystemTranslated)|Type(?:HFS|PromiseHFS))|o(?:at(?:GrowProc|Proc|Side(?:GrowProc|Proc|Zoom(?:GrowProc|Proc))|Zoom(?:GrowProc|Proc))|ppyIconResource))|mt(?:1Err|2Err)|n(?:OpnErr|fErr)|o(?:nt(?:Bit|DecError|Not(?:Declared|OutlineErr)|Panel(?:FontSelectionQDStyleVersionErr|S(?:electionStyleErr|howErr))|SubErr|sFolderIconResource)|r(?:ceRead(?:Bit|Mask)|m(?:A(?:bsolutePosition|lias)|Creator|Name|PropertyID|R(?:ange|elativePosition)|Test|U(?:niqueID|serPropertyID)|Whose)))|raction|s(?:AtMark|CurPerm|D(?:SIntErr|ataTooBigErr)|From(?:LEOF|Mark|Start)|QType|R(?:d(?:AccessPerm|DenyPerm|Perm|Wr(?:Perm|ShPerm))|nErr|t(?:DirID|ParID))|SB(?:A(?:ccessDate(?:Bit)?|ttributeModDate(?:Bit)?)|Dr(?:BkDat(?:Bit)?|CrDat(?:Bit)?|FndrInfo(?:Bit)?|MdDat(?:Bit)?|NmFls(?:Bit)?|ParID(?:Bit)?|UsrWds(?:Bit)?)|F(?:l(?:Attrib(?:Bit)?|BkDat(?:Bit)?|CrDat(?:Bit)?|FndrInfo(?:Bit)?|LgLen(?:Bit)?|MdDat(?:Bit)?|P(?:arID(?:Bit)?|yLen(?:Bit)?)|R(?:LgLen(?:Bit)?|PyLen(?:Bit)?)|XFndrInfo(?:Bit)?)|ullName(?:Bit)?)|GroupID(?:Bit)?|N(?:egate(?:Bit)?|odeID(?:Bit)?)|P(?:artialName(?:Bit)?|ermissions(?:Bit)?)|Skip(?:HiddenItems(?:Bit)?|PackageContents(?:Bit)?)|UserID(?:Bit)?)|UnixPriv|Wr(?:AccessPerm|DenyPerm|Perm)|m(?:B(?:adF(?:FSNameErr|SD(?:LenErr|VersionErr))|usyFFSErr)|DuplicateFSIDErr|FFSNotFoundErr|NoAlternateStackErr|UnknownFSMMessageErr))|ullTrashIconResource)|g(?:WorldsNotSameDepthAndSizeErr|crOnMFMErr|e(?:n(?:CdevRangeBit|eric(?:ApplicationIconResource|CDROMIconResource|D(?:eskAccessoryIconResource|ocumentIconResource)|E(?:ditionFileIconResource|xtensionIconResource)|F(?:ileServerIconResource|olderIconResource)|HardDiskIconResource|MoverObjectIconResource|PreferencesIconResource|QueryDocumentIconResource|RAMDiskIconResource|S(?:tationeryIconResource|uitcaseIconResource)))|stalt(?:16Bit(?:AudioSupport|SoundIO)|20thAnniversary|32Bit(?:Addressing|Capable|QD(?:1(?:1|2|3))?|SysZone)|68(?:0(?:00|10|20|30(?:MMU)?|40(?:FPU|MMU)?)|8(?:51|8(?:1|2))|k)|8BitQD|A(?:DB(?:ISOKbdII|KbdII)|FPClient(?:3_(?:5|6(?:_(?:1|2|3))?|7(?:_2)?|8(?:_(?:1|3|4))?)|AttributeMask|CfgRsrc|MultiReq|SupportsIP|V(?:MUI|ersionMask))?|LM(?:Attr|Has(?:CFMSupport|RescanNotifiers|SF(?:Group|Location))|Present|Vers)|MU|T(?:A(?:Attr|Present)|SU(?:AscentDescentControlsFeature|B(?:atchBreakLinesFeature|iDiCursorPositionFeature|yCharacterClusterFeature)|D(?:ecimalTabFeature|irectAccess|ropShadowStyleFeature)|F(?:allbacks(?:Feature|ObjFeatures)|eatures)|GlyphBoundsFeature|Highlight(?:ColorControlFeature|InactiveTextFeature)|IgnoreLeadingFeature|L(?:ayoutC(?:acheClearFeature|reateAndCopyFeature)|ineControlFeature|owLevelOrigFeatures)|MemoryFeature|NearestCharLineBreakFeature|PositionToCursorFeature|StrikeThroughStyleFeature|T(?:abSupportFeature|extLocatorUsageFeature|rackingFeature)|U(?:nderlineOptionsStyleFeature|pdate(?:1|2|3|4|5|6|7))|Version)|alkVersion)|UXVersion|VLTree(?:Attr|PresentBit|Supports(?:HandleBasedTreeBit|TreeLockingBit))|WS(?:6150_6(?:0|6)|8(?:150_(?:110|80)|550)|9150_(?:120|80))|d(?:dressingModeAttr|minFeaturesFlagsAttr)|l(?:iasMgr(?:Attr|FollowsAliasesWhenResolving|Pre(?:fersPath|sent)|Re(?:quiresAccessors|solveAliasFileWithMountOptions)|Supports(?:AOCEKeychain|ExtendedCalls|FSCalls|RemoteAppletalk))|legroQD(?:Text)?|tivecRegistersSwappedCorrectlyBit)|ntiAliasedTextAvailable|pp(?:earance(?:Attr|CompatMode|Exists|Version)|le(?:Adjust(?:ADBKbd|ISOKbd|Keypad)|Events(?:Attr|Present)|Guide(?:IsDebug|Present)|Script(?:Attr|P(?:owerPCSupport|resent)|Version)|TalkVersion))|rbitorAttr|syncSCSI(?:INROM)?)|Bu(?:iltInSoundInput|sClkSpeed(?:MHz)?)|C(?:FM(?:99Present(?:Mask)?|Attr|Present(?:Mask)?)|PU(?:486|6(?:0(?:1|3(?:e(?:v)?)?|4(?:e(?:v)?)?)|80(?:00|10|20|30|40))|750(?:FX)?|970(?:FX|MP)?|Apollo|G4(?:74(?:47|50))?|Pentium(?:4|II|Pro)?|X86)|RM(?:Attr|P(?:ersistentFix|resent)|ToolRsrcCalls)|TBVersion|a(?:n(?:StartDragInFloatWindow|UseCGTextRendering)|r(?:bonVersion|dServicesPresent))|l(?:assic(?:II)?|oseView(?:Attr|DisplayMgrFriendly|Enabled))|o(?:l(?:lectionMgrVersion|or(?:Matching(?:Attr|LibLoaded|Version)|Picker(?:Version)?|Sync(?:1(?:0(?:4|5)?|1)|2(?:0|1(?:1|2|3)?|5|6(?:1)?)|30)))|mp(?:onent(?:Mgr|Platform)|ressionMgr)|n(?:nMgr(?:Attr|CMSearchFix|ErrorString|MultiAsyncIO|Present)|t(?:extualMenu(?:Attr|Has(?:AttributeAndModifierKeys|UnicodeSupport)|TrapAvailable|UnusedBit)|rol(?:M(?:gr(?:Attr|Present(?:Bit)?|Version)|sgPresentMask)|Strip(?:Attr|Exists|User(?:Font|HotKey)|Version(?:Fixed)?))))|untOfCPUs)|reatesAliasFontRsrc|urrentGraphicsVersion)|D(?:BAccessMgr(?:Attr|Present)|ITLExt(?:Attr|Present|SupportsIctb)|T(?:MgrSupportsFSM|P(?:Features|Info))|esktop(?:Pictures(?:Attr|Displayed|Installed)|SpeechRecognition)|i(?:alogM(?:gr(?:Attr|HasAquaAlert(?:Bit|Mask)|Present(?:Bit|Mask)?)|sgPresentMask)|ctionaryMgr(?:Attr|Present)|gitalSignatureVersion|s(?:kCacheSize|playMgr(?:Attr|C(?:an(?:Confirm|SwitchMirrored)|olorSyncAware)|GeneratesProfiles|Present|S(?:etDepthNotifies|leepNotifies)|Vers)))|ra(?:gMgr(?:Attr|FloatingWind|HasImageSupport|Present)|wSprocketVersion)|upSelectorErr)|E(?:MMU1|asyAccess(?:Attr|Locked|O(?:ff|n)|Sticky)|ditionMgr(?:Attr|Present|TranslationAware)|xt(?:ADBKbd|ISOADBKbd|ToolboxTable|en(?:ded(?:TimeMgr|WindowAttributes(?:Bit|Mask)?)|sionTableVersion)))|F(?:BC(?:CurrentVersion|IndexingState|Version|indexing(?:Critical|Safe))|PUType|S(?:A(?:llowsConcurrentAsyncIO|ttr)|IncompatibleDFA82|M(?:DoesDynamicLoad|Version)|NoMFSVols|Supports(?:2TBVols|4GBVols|DirectIO|ExclusiveLocks|H(?:FSPlusVols|ardLinkDetection))|UsesPOSIXPathsForConversion)|XfrMgr(?:A(?:sync|ttr)|ErrorString|MultiFile|Present)|i(?:le(?:AllocationZeroedBlocksBit|Mapping(?:Attr|MultipleFilesFix|Present))|nd(?:Folder(?:Attr|Present|RedirectionAttr)|er(?:Attr|CallsAEProcess|DropEvent|F(?:loppyRootComments|ullDragManagerSupport)|HasClippings|LargeAndNotSavedFlavorsOK|MagicPlacement|Supports4GBVolumes|U(?:nderstandsRedirectedDesktopFolder|ses(?:ExtensibleFolderManager|SpecialOpenFoldersFile))))|rstSlotNumber)|loppy(?:Attr|IsM(?:FMOnly|anualEject)|UsesDiskInPlace)|o(?:lder(?:DescSupport|Mgr(?:FollowsAliasesWhenResolving|Supports(?:Domains|ExtendedCalls|FSCalls)))|ntMgrAttr)|rontWindowMayBeHidden(?:Bit|Mask)|ullExtFSDispatching)|G(?:X(?:PrintingMgrVersion|Version)|raphics(?:Attr|Is(?:Debugging|Loaded|PowerPC)|Version))|H(?:a(?:rdware(?:Attr|Vendor(?:Apple|Code))|s(?:ASC|Color|D(?:eepGWorlds|irectPixMaps)|E(?:nhancedLtalk|xtendedDiskInit)|F(?:MTuner|SSpecCalls|ileSystemManager|loatingWindows(?:Bit|Mask)?)|G(?:PI(?:aTo(?:DCDa|RTxCa)|bToDCDb)|rayishTextOr)|H(?:FSPlusAPIs|WClosedCaptioning)|IRRemote|ParityCapability|ResourceOverrides|S(?:C(?:C|SI(?:96(?:1|2))?)|erialFader|ingleWindowMode(?:Bit|Mask)|o(?:ftPowerOff|und(?:Fader|InputDevice))|tereoDecoder|ystemIRFunction)|TVTuner|UniversalROM|V(?:IA(?:1|2)|idDecoderScaler)|Window(?:Buffering(?:Bit|Mask)?|Shadows(?:Bit|Mask))|ZoomedVideo))|elpMgr(?:Attr|Extensions|Present)|i(?:dePort(?:A|B)|ghLevelMatching))|I(?:NeedIRPowerOffConfirm|PCSupport|RDisabled|conUtilities(?:Attr|Has(?:32BitIcons|48PixelIcons|8BitDeepMasks|IconServices)|Present)|n(?:itHeapZerosOutHeapsBit|te(?:l|rnalDisplay)))|JapanAdjustADBKbd|K(?:BPS2(?:Keyboards|Set(?:IDToAny|TranslationTable))|eyboard(?:Type|sAttr))|L(?:aunch(?:C(?:anReturn|ontrol)|FullFileSpec)|ineLevelInput|o(?:cationErr|gical(?:PageSize|RAMSize)|wMemorySize))|M(?:B(?:Legacy|MultipleBays|SingleBay)|MUType|P(?:CallableAPIsAttr|DeviceManager|FileManager|TrapCalls)|ac(?:512KE|AndPad|C(?:entris6(?:10|50|60AV)|lassic|olorClassic)|II(?:c(?:i|x)|fx|si|v(?:i|m|x)|x)?|Kbd|LC(?:475|5(?:20|75|80)|II(?:I)?)?|OS(?:Compatibility(?:Box(?:Attr|HasSerial|Present|less))?|XQD(?:Text)?)|Plus(?:Kbd)?|Quadra(?:6(?:05|10|30|50|60AV)|700|8(?:00|40AV)|9(?:00|50))|SE(?:030)?|TV|XL|hine(?:Icon|Type))|e(?:diaBay|moryMap(?:Attr|Sparse)|nuMgr(?:A(?:quaLayout(?:Bit|Mask)|ttr)|CGImageMenuTitle(?:Bit|Mask)|M(?:oreThanFiveMenusDeep(?:Bit|Mask)|ultipleItemsWithCommandID(?:Bit|Mask))|Present(?:Bit|Mask)?|RetainsIconRef(?:Bit|Mask)|SendsMenuBoundsToDefProc(?:Bit|Mask))|ssageMgrVersion)|i(?:scAttr|xedMode(?:Attr|CFM68K(?:Has(?:State|Trap))?|PowerPC|Version))|u(?:lti(?:Channels|pleUsersState)|stUseFCBAccessors))|N(?:a(?:meRegistryVersion|tive(?:CPU(?:family|type)|ProcessMgrBit|T(?:imeMgr|ype1FontSupport)))|ew(?:HandleReturnsZeroedMemoryBit|PtrReturnsZeroedMemoryBit)|o(?:FPU|MMU|tification(?:MgrAttr|Present))|uBus(?:Connectors|Present|SlotCount))|O(?:CE(?:SFServerAvailable|T(?:B(?:Available|NativeGlueAvailable|Present)?|oolbox(?:Attr|Version)))|FA2available|S(?:Attr|L(?:CompliantFinder|InSystem)|Table|XFBCCurrentVersion)|pen(?:FirmwareInfo|Tpt(?:A(?:RAPPresent|ppleTalk(?:Loaded(?:Bit|Mask)|Present(?:Bit|Mask)))|IPXSPX(?:Loaded(?:Bit|Mask)|Present(?:Bit|Mask))|Loaded(?:Bit|Mask)|NetworkSetup(?:Legacy(?:Export|Import)|SupportsMultihoming|Version)?|P(?:PPPresent|resent(?:Bit|Mask))|RemoteAccess(?:ClientOnly|Loaded|MPServer|P(?:Server|resent)|Version)?|TCP(?:Loaded(?:Bit|Mask)|Present(?:Bit|Mask))|Versions)?)|riginal(?:ATSUVersion|QD(?:Text)?)|utlineFonts)|P(?:C(?:Card(?:FamilyPresent|HasPowerControl|SupportsCardBus)?|X(?:Attr|Has(?:8and16BitFAT|ProDOS)|NewUI|UseICMapping))|Mgr(?:CPUIdle|DispatchExists|Exists|S(?:CC|ound|upportsAVPowerStateAtSleepWake))|PC(?:DragLibPresent|QuickTimeLibPresent|Supports(?:Incoming(?:AppleTalk|TCP_IP)?|Out(?:Going|going(?:AppleTalk|TCP_IP))|RealTime|TCP_IP)|Toolbox(?:Attr|Present))|S2Keyboard|ar(?:ity(?:Attr|Enabled)|tialRsrcs)|erforma(?:250|4(?:50|6x|7x)|5(?:300|50|80)|6(?:00|3(?:00|60)|400))|hysicalRAMSize(?:InMegabytes)?|layAndRecord|o(?:pup(?:Attr|Present)|rt(?:ADisabled|BDisabled|able(?:2001(?:ANSIKbd|ISOKbd|JISKbd)|SlotPresent|USB(?:ANSIKbd|ISOKbd|JISKbd))?)|wer(?:Book(?:1(?:00|4(?:0(?:0)?|5)|50|6(?:0|5(?:c)?)|70|80(?:c)?|90)|2400|3400|5(?:00PPCUpgrade|20(?:c)?|300|40(?:c)?)|Duo2(?:10|30(?:0)?|50|70c|80(?:c)?)|G3(?:Series(?:2)?)?)|M(?:ac(?:4400(?:_160)?|5(?:2(?:00|60)|400|500)|6(?:100_6(?:0|6)|200|400|500)|7(?:100_(?:66|80)|200|300|500|600)|8(?:100_(?:1(?:00|10|20)|80)|500|600)|9(?:500|600)|Centris6(?:10|50)|G3|LC(?:475|575|630)|NewWorld|Performa(?:47x|57x|63x)|Quadra(?:6(?:10|30|50)|700|800|9(?:00|50)))|gr(?:Attr|Vers))|PC(?:A(?:SArchitecture|ware)|Has(?:64BitSupport|D(?:CB(?:AInstruction|TStreams)|ataStreams)|GraphicsInstructions|S(?:TFIWXInstruction|quareRootInstructions)|VectorInstructions)|IgnoresDCBST|ProcessorFeatures)?))|r(?:o(?:F16(?:ANSIKbd|ISOKbd|JISKbd)|c(?:ClkSpeed(?:MHz)?|essor(?:CacheLineSize|Type)))|tbl(?:ADBKbd|ISOKbd))|wrB(?:k(?:99JISKbd|E(?:K(?:DomKbd|ISOKbd|JISKbd)|xt(?:ADBKbd|ISOKbd|JISKbd))|Sub(?:DomKbd|ISOKbd|JISKbd))|ook(?:ADBKbd|ISOADBKbd)))|Q(?:D(?:3D(?:Present|V(?:ersion|iewer(?:Present)?))?|HasLongRowBytes|Text(?:Features|Version))|TVR(?:C(?:ubicPanosPresent|ylinderPanosPresent)|Mgr(?:Attr|Present|Vers)|ObjMoviesPresent)|u(?:adra(?:6(?:05|10|30|50|60AV)|700|8(?:00|40AV)|9(?:00|50))|ick(?:Time(?:Conferencing(?:Info)?|Features|Streaming(?:Features|Version)|ThreadSafe(?:FeaturesAttr|Graphics(?:Export|Import)|ICM|Movie(?:Export|Import|Playback|Toolbox))|Version)?|draw(?:Features|Version))))|R(?:BVAddr|M(?:F(?:akeAppleMenuItemsRolledIn|orceSysHeapRolledIn)|SupportsFSCalls|TypeIndexOrderingReverse)|OM(?:Size|Version)|e(?:al(?:TempMemory|timeMgr(?:Attr|Present))|sourceMgr(?:Attr|BugFixesAttrs)|visedTimeMgr))|S(?:C(?:C(?:ReadAddr|WriteAddr)|SI(?:PollSIH|SlotBoot)?)|DP(?:FindVersion|PromptVersion|StandardDirectoryVersion)|E(?:30SlotPresent|SlotPresent)|FServer|MP(?:MailerVersion|SPSendLetterVersion)|a(?:feOFAttr|nityCheckResourceFiles)|bitFontSupport|cr(?:apMgr(?:Attr|TranslationAware)|eenCapture(?:Dir|Main)|ipt(?:Count|MgrVersion|ingSupport)|ollingThrottle)|e(?:rialA(?:rbitrationExists|ttr)|tDragImageUpdates)|h(?:eetsAreWindowModal(?:Bit|Mask)|utdown(?:Attributes|HassdOnBootVolUnmount))|lot(?:Attr|MgrExists)|ndPlayDoubleBuffer|o(?:ftwareVendor(?:Apple|Code|Licensee)|und(?:Attr|IOMgrPresent))|p(?:e(?:cificMatchSupport|ech(?:Attr|HasPPCGlue|MgrPresent|Recognition(?:Attr|Version)))|litOS(?:A(?:ttr|ware)|BootDriveIsNetworkVolume|EnablerVolumeIsDifferentFromBootVolume|MachineNameS(?:etToNetworkNameTemp|tartupDiskIsNonPersistent)))|quareMenuBar|t(?:andard(?:File(?:58|Attr|Has(?:ColorIcons|DynamicVolumeAllocation)|TranslationAware|UseGenericIcons)|TimeMgr)|d(?:ADBKbd|ISOADBKbd|NBP(?:Attr|Present|SupportsAutoPosition))|ereo(?:Capability|Input|Mixing))|upports(?:ApplicationURL|FSpResourceFileAlreadyOpenBit|Mirroring)|ys(?:Architecture|DebuggerSupport|ZoneGrowable|temUpdateVersion))|T(?:E(?:1|2|3|4|5|6|Attr|Has(?:GetHiliteRgn|WhiteBackground)|Supports(?:InlineInput|TextObjects))|SM(?:DisplayMgrAwareBit|TE(?:1(?:5(?:2)?)?|Attr|Present|Version)?|doesTSMTEBit|gr(?:15|2(?:0|2|3)|Attr|Version))|VAttr|e(?:le(?:Mgr(?:A(?:ttr|utoAnswer)|IndHandset|NewTELNewSupport|P(?:owerPCSupport|resent)|S(?:ilenceDetect|oundStreams))|phoneSpeechRecognition)|mpMem(?:Support|Tracked)|rmMgr(?:Attr|ErrorString|Present)|xtEditVersion)|h(?:irdParty(?:ANSIKbd|ISOKbd|JISKbd)|read(?:Mgr(?:Attr|Present)|sLibraryPresent))|imeMgrVersion|oolboxTable|ranslation(?:Attr|GetPathAPIAvail|Mgr(?:Exists|HintOrder)|PPCAvail))|U(?:DFSupport|SB(?:A(?:ndy(?:ANSIKbd|ISOKbd|JISKbd)|ttr)|Cosmo(?:ANSIKbd|ISOKbd|JISKbd)|HasIsoch|Pr(?:esent|interSharing(?:Attr(?:Booted|Mask|Running)?|Version(?:Mask)?)|oF16(?:ANSIKbd|ISOKbd|JISKbd))|Version)|n(?:defSelectorErr|known(?:Err|ThirdPartyKbd))|serVisibleMachineName)|V(?:IA(?:1Addr|2Addr)|M(?:Attr|BackingStoreFileRefNum|FilemappingOn|Has(?:LockMemoryForOutput|PagingControl)|Info(?:NoneType|Si(?:mpleType|ze(?:StorageType|Type))|Type)|Present|ZerosPagesBit)|alueImplementedVers|ersion)|W(?:SII(?:CanPrintWithoutPrGeneralBit|Support)|indow(?:LiveResize(?:Bit|Mask)|M(?:gr(?:Attr|Present(?:Bit|Mask)?)|inimizeToDock(?:Bit|Mask)))|orldScriptII(?:Attr|Version))|X86(?:AdditionalFeatures|Features|Has(?:APIC|C(?:ID|LFSH|MOV|X(?:16|8))|D(?:E|S(?:CPL)?)|EST|F(?:PU|XSR)|HTT|M(?:C(?:A|E)|MX|ONITOR|SR|TRR)|P(?:A(?:E|T)|GE|S(?:E(?:36)?|N))|S(?:EP|MX|S(?:E(?:2|3)?)?|upplementalSSE3)|T(?:M(?:2)?|SC)|VM(?:E|X)|xTPR)|ResACPI|Serviced20)))|fpErr|ra(?:bTimeComplete|veUpr(?:E|I|O|U))|uestNotAllowedErr)|h(?:AxisOnly|Menu(?:Cmd|FindErr)|a(?:chek|ndlerNotFoundErr|rdwareConfigErr)|i(?:Archive(?:EncodingCompleteErr|HIObjectIgnoresArchivingErr|KeyNotAvailableErr|TypeMismatchErr)|Object(?:C(?:annotSubclassSingletonErr|lass(?:ExistsErr|Has(?:InstancesErr|SubclassesErr)|IsAbstractErr))|Delegate(?:AlreadyExistsErr|NotFoundErr))|erMenu|ghLevelEventMask|tDev)|m(?:BalloonAborted|CloseViewActive|Help(?:Disabled|ManagerNotInited)|NoBalloonUp|OperationUnsupported|S(?:ameAsLastBalloon|kippedBalloon)|UnknownHelpType|WrongVersion)|our(?:Field|Mask)|r(?:HTMLRenderingLibNotInstalledErr|LeadingZ|MiscellaneousExceptionErr|U(?:RLNotHandledErr|nableToResizeHandleErr))|wParamErr)|i(?:IOAbort(?:Err)?|MemFullErr|c(?:Config(?:InappropriateErr|NotFoundErr)|InternalErr|No(?:MoreWritersErr|Perm|URLErr|thingToOverrideErr)|P(?:ermErr|r(?:ef(?:DataErr|NotFoundErr)|ofileNotFoundErr))|Read(?:OnlyPerm|WritePerm)|T(?:ooManyProfilesErr|runcatedErr)|onItem)|llegal(?:C(?:hannelOSErr|ontrollerOSErr)|InstrumentOSErr|Knob(?:OSErr|ValueOSErr)|NoteChannelOSErr|PartOSErr|ScrapFlavor(?:FlagsErr|SizeErr|TypeErr)|VoiceAllocationOSErr)|n(?:Co(?:llapseBox|ntent)|D(?:esk|rag)|G(?:oAway|row)|MenuBar|NoWindow|ProxyIcon|S(?:tructure|ysWindow)|ToolbarButton|Zoom(?:In|Out)|compatibleVoice|it(?:Dev|IWMErr)|putOutOfBounds|sufficientStackErr|t(?:Arabic|DrawHook|E(?:OLHook|uropean)|HitTestHook|InlineInputTSMTEP(?:ostUpdateHook|reUpdateHook)|Japanese|NWidthHook|OutputMask|Roman|TextWidthHook|W(?:estern|idthHook)|er(?:nal(?:ComponentErr|QuickTimeError|ScrapErr)|ruptsMaskedErr)|lCurrency)|valid(?:Atom(?:ContainerErr|Err|TypeErr)|C(?:hunk(?:Cache|Num)|omponentID)|D(?:ataRef(?:Container)?|uration)|EditState|FolderTypeErr|H(?:andler|otSpotIDErr)|I(?:conRefErr|mageIndexErr|ndexErr)|M(?:edia|ovie)|Node(?:FormatErr|IDErr)|PickerType|Rect|S(?:ample(?:Desc(?:Index|ription)|Num|Table)|prite(?:I(?:DErr|ndexErr)|PropertyErr|WorldPropertyErr))|T(?:ime|ra(?:ck|nslationPathErr))|ViewStateErr))|o(?:Dir(?:Flg|Mask)|Err|QType)|t(?:emDisable|lc(?:D(?:isableKeyScriptSync(?:Mask)?|ualCaret)|S(?:howIcon|ysDirection)))|u(?:Current(?:CurLang|DefLang|Script)|NumberPartsTable|S(?:cript(?:CurLang|DefLang)|ystem(?:CurLang|DefLang|Script))|UnTokenTable|W(?:hiteSpaceList|ord(?:SelectTable|WrapTable))))|k(?:1(?:6(?:B(?:E5(?:55PixelFormat|65PixelFormat)|itCardErr)|LE5(?:55(?:1PixelFormat|PixelFormat)|65PixelFormat))|IndexedGrayPixelFormat|MonochromePixelFormat)|2(?:4(?:BGRPixelFormat|RGBPixelFormat)|Indexed(?:GrayPixelFormat|PixelFormat)|vuyPixelFormat)|3(?:2(?:A(?:BGRPixelFormat|RGBPixelFormat)|B(?:GRAPixelFormat|itHeap)|RGBAPixelFormat)|DMixer(?:AttenuationCurve_(?:Exponential|Inverse|Linear|Power)|Param_(?:Azimuth|Distance|Elevation|Gain|P(?:laybackRate|ost(?:AveragePower|PeakHoldLevel)|re(?:AveragePower|PeakHoldLevel)))|RenderingFlags_(?:ConstantReverbBlend|D(?:istance(?:Attenuation|Diffusion|Filter)|opplerShift)|InterAuralDelay|LinearDistanceAttenuation)))|4Indexed(?:GrayPixelFormat|PixelFormat)|68kInterruptLevelMask|8Indexed(?:GrayPixelFormat|PixelFormat)|A(?:E(?:A(?:ND|bout|ctivate|fter|l(?:iasSelection|l(?:Caps)?|waysInteract)|n(?:swer|y)|pp(?:earanceChanged|lication(?:Class|Died))|rrow(?:At(?:End|Start)|BothEnds)|sk|utoDown)|B(?:e(?:fore|gin(?:Transaction|ning|sWith))|old)|C(?:a(?:n(?:Interact|SwitchLayer)|se(?:ConsiderMask|IgnoreMask|SensEquals)?)|entered|hangeView|l(?:eanUp|o(?:ne|se))|o(?:mmandClass|n(?:densed|tains)|py|reSuite|untElements)|reate(?:Element|Publisher)|ut)|D(?:ata(?:Array|baseSuite)|e(?:activate|bug(?:POSTHeader|ReplyHeader|XML(?:DebugAll|Re(?:quest|sponse)))|faultTimeout|lete|sc(?:Array|ListFactor(?:None|Type(?:AndSize)?)))|i(?:acritic(?:ConsiderMask|IgnoreMask)?|rectCall|skEvent)|o(?:Not(?:AutomaticallyAddAnnotationsToEvent|IgnoreHandler|PromptForUserConsent)|ObjectsExist|Script|nt(?:DisposeOnResume|Execute|Reco(?:nnect|rd))|wn)|rag|uplicateSelection)|E(?:ditGraphic|ject|mpty(?:Trash)?|nd(?:Transaction|sWith)?|quals|rase|xpan(?:ded|sion(?:ConsiderMask|IgnoreMask)?))|F(?:a(?:lse|st)|etchURL|i(?:nder(?:Events|Suite)|rst)|ormulaProtect|ullyJustified)|G(?:e(?:stalt|t(?:ClassInfo|Data(?:Size)?|EventInfo|InfoSelection|PrivilegeSelection|SuiteInfo|URL))|r(?:eaterThan(?:Equals)?|ow))|H(?:TTPProxy(?:HostAttr|PortAttr)|andle(?:Array|SimpleRanges)|i(?:Quality|dden|gh(?:Level|Priority))|yphens(?:ConsiderMask|IgnoreMask)?)|I(?:Do(?:M(?:arking|inimum)|Whose)|S(?:Action(?:Path)?|C(?:lient(?:Address|IP)|ontentType)|F(?:romUser|ullRequest)|GetURL|HTTPSearchArgs|Method|P(?:assword|ostArgs)|Referrer|S(?:criptName|erver(?:Name|Port))|User(?:Agent|Name)|WebStarSuite)|gnore(?:App(?:EventHandler|PhacHandler)|Sys(?:EventHandler|PhacHandler))|mageGraphic|n(?:fo|goreBuiltInEventHandler|ter(?:actWith(?:All|Local|Self)|ceptOpen|netSuite))|sUniform|talic)|K(?:ataHiragana|ey(?:Class|D(?:escArray|own)))|L(?:ast|e(?:ftJustified|ssThan(?:Equals)?)|o(?:calProcess|gOut|wercase))|M(?:a(?:in|keObjectsVisible)|enu(?:Class|Select)|i(?:ddle|scStandards)|o(?:difiable|use(?:Class|Down(?:InBack)?)|ve(?:d)?))|N(?:OT|avigationKey|e(?:verInteract|xt)|o(?:Arrow|Dispatch|Reply|nmodifiable|rmalPriority|tify(?:Recording|St(?:artRecording|opRecording)))?|ullEvent)|O(?:R|SAXSizeResource|pen(?:Application|Contents|Documents|Selection)?|utline)|P(?:a(?:ckedArray|geSetup|s(?:sSubDescs|te))|lain|r(?:evious|int(?:Documents|Selection|Window)?|o(?:cessNonReplyEvents|mise))|u(?:nctuation(?:ConsiderMask|IgnoreMask)?|tAway(?:Selection)?))|Q(?:D(?:Ad(?:M(?:ax|in)|d(?:Over|Pin))|B(?:ic|lend)|Copy|Not(?:Bic|Copy|Or|Xor)|Or|Su(?:b(?:Over|Pin)|pplementalSuite)|Xor)|u(?:eueReply|i(?:ckdrawSuite|t(?:A(?:ll|pplication)|PreserveState|Reason))))|R(?:PCClass|awKey|e(?:allyLogOut|buildDesktopDB|do|gular|moteProcess|openApplication|place|quiredSuite|s(?:ized|olveNestedLists|tart|ume)|ve(?:alSelection|rt))|ightJustified)|S(?:OAPScheme|a(?:meProcess|ve)|cr(?:apEvent|iptingSizeResource)|e(?:lect|t(?:Data|Position))|h(?:a(?:dow|r(?:edScriptHandler|ing))|ow(?:Clipboard|Preferences|RestartDialog|ShutdownDialog)|utDown)|leep|mall(?:Caps|Kana|SystemFontChanged)|o(?:cks(?:4Protocol|5Protocol|HostAttr|P(?:asswordAttr|ortAttr|roxyAttr)|UserAttr)|rt)|pe(?:cialClassProperties|ech(?:D(?:etected|one)|Suite))|t(?:artRecording|op(?:Recording|pedMoving)|rikethrough)|u(?:bscript|perscript|spend)|y(?:nc|stemFontChanged))|T(?:ableSuite|e(?:rminologyExtension|xtSuite)|hemeSwitch|r(?:ansactionTerminated|ue))|U(?:T(?:Apostrophe|ChangesState|DirectParamIsReference|Enum(?:ListIsExclusive|erated|sAreTypes)|Feminine|HasReturningParam|Masculine|NotDirectParamIsTarget|Optional|P(?:aramIs(?:Reference|Target)|lural|ropertyIsReference)|Re(?:adWrite|plyIsReference)|TightBindingFunction|listOfItems)|n(?:d(?:erline|o)|knownSource)|p(?:date)?|se(?:HTTPProxyAttr|RelativeIterators|S(?:ocksAttr|tandardDispatch)|rTerminology))|Vi(?:ewsFontChanged|rtualKey)|W(?:a(?:itReply|keUpEvent|ntReceipt)|h(?:iteSpace(?:ConsiderMask|IgnoreMask)?|oleWordEquals)|indowClass)|XMLRPCScheme|Yes|Z(?:enkakuHankaku|oom(?:In|Out)?))|FP(?:ExtendedFlagsAlternateAddressMask|ServerIcon|Tag(?:Length(?:DDP|IP(?:Port)?)|Type(?:D(?:DP|NS)|IP(?:Port)?)))|H(?:Intern(?:alErr|etConfigPrefErr)|TOCType(?:Developer|User))|LM(?:D(?:eferSwitchErr|uplicateModuleErr)|GroupNotFoundErr|In(?:stallationErr|ternalErr)|Location(?:NotFoundErr|sFolderType)|Module(?:CommunicationErr|sFolderType)|NoSuchModuleErr|PreferencesFolderType|RebootFlagsLevelErr)|NKRCurrentVersion|RM(?:M(?:ountVol|ultVols)|NoUI|Search(?:More|RelFirst)?|TryFileIDFirst)|S(?:A(?:dd|nd|ppleScriptSuite)|C(?:o(?:m(?:es(?:After|Before)|ment(?:Event)?)|n(?:catenate|siderReplies(?:ConsiderMask|IgnoreMask)?|tains))|urrentApplication)|D(?:efault(?:M(?:ax(?:HeapSize|StackSize)|in(?:HeapSize|StackSize))|Preferred(?:HeapSize|StackSize))|ivide)|E(?:ndsWith|qual|rrorEventCode|xcluding)|GreaterThan(?:OrEqual)?|HasOpenHandler|I(?:mporting|nitializeEventCode)|L(?:aunchEvent|essThan(?:OrEqual)?)|M(?:agic(?:EndTellEvent|TellEvent)|inimumVersion|ultiply)|N(?:egate|ot(?:Equal)?|um(?:berOfSourceStyles|ericStrings(?:ConsiderMask|IgnoreMask)?))|Or|P(?:ower|repositionalSubroutine)|Quotient|Remainder|S(?:criptEditorSuite|elect(?:CopySourceAttributes|Get(?:AppTerminology(?:Obsolete)?|Handler(?:Names|Obsolete)?|Property(?:Names|Obsolete)?|S(?:ourceStyle(?:Names|s)|ysTerminology))|Init|Set(?:Handler(?:Obsolete)?|Property(?:Obsolete)?|Source(?:Attributes|Styles)))|ourceStyle(?:ApplicationKeyword|C(?:lass|omment)|Dynamic(?:Class|E(?:numValue|ventName)|P(?:arameterName|roperty))|E(?:numValue|ventName)|L(?:anguageKeyword|iteral)|NormalText|ObjectSpecifier|P(?:arameterName|roperty)|String|U(?:ncompiledText|serSymbol))|t(?:art(?:LogEvent|sWith)|opLogEvent)|ub(?:routineEvent|tract))|TypeNamesSuite|UseEventCode)|TS(?:BoldQDStretch|CubicCurveType|DeletedGlyphcode|F(?:ileReferenceFilterSelector|lat(?:DataUstl(?:CurrentVersion|Version(?:0|1|2))|tenedFontSpecifierRawNameData)|ont(?:AutoActivation(?:Ask|D(?:efault|isabled)|Enabled)|Cont(?:ainerRefUnspecified|ext(?:Global|Local|Unspecified))|F(?:amilyRefUnspecified|ilter(?:CurrentVersion|Selector(?:Font(?:ApplierFunction|Family(?:ApplierFunction)?)|Generation|Unspecified))|ormatUnspecified)|Notify(?:Action(?:DirectoriesChanged|FontsChanged)|Option(?:Default|ReceiveWhileSuspended))|RefUnspecified))|G(?:enerationUnspecified|lyphInfo(?:AppleReserved|ByteSizeMask|HasImposedWidth|Is(?:Attachment|LTHanger|RBHanger|WhiteSpace)|TerminatorGlyph))|I(?:nvalid(?:Font(?:Access|ContainerAccess|FamilyAccess|TableAccess)|GlyphAccess)|t(?:alicQDSkew|eration(?:Completed|ScopeModified)))|Line(?:Appl(?:eReserved|yAntiAliasing)|BreakToNearestCharacter|Disable(?:A(?:ll(?:BaselineAdjustments|GlyphMorphing|Justification|KerningAdjustments|LayoutOperations|TrackingAdjustments)|utoAdjustDisplayPos)|NegativeJustification)|F(?:illOutToWidth|ractDisable)|HasNo(?:Hangers|OpticalAlignment)|I(?:gnoreFontLeading|mposeNoAngleForEnds|sDisplayOnly)|KeepSpacesOutOfMargin|LastNoJustification|No(?:AntiAliasing|LayoutOptions|SpecialJustification)|TabAdjustEnabled|Use(?:DeviceMetrics|QDRendering))|NoTracking|O(?:ptionFlags(?:ActivateDisabled|ComposeFontPostScriptName|D(?:efault(?:Scope)?|oNotNotify)|I(?:ncludeDisabledMask|terat(?:eByPrecedenceMask|ionScopeMask))|ProcessSubdirectories|Re(?:cordPersistently|strictedScope)|U(?:nRestrictedScope|se(?:DataFork(?:AsResourceFork)?|ResourceFork)))|therCurveType)|Qu(?:adCurveType|eryActivateFontMessage)|RadiansFactor|Style(?:Appl(?:eReserved|y(?:AntiAliasing|Hints))|No(?:AntiAliasing|Hinting|Options))|U(?:A(?:fterWithStreamShiftTag|scentTag)|B(?:a(?:ckgroundC(?:allback|olor)|dStreamErr|selineClassTag)|eforeWithStreamShiftTag|usyObjectErr|y(?:C(?:haracter(?:Cluster)?|luster)|TypographicCluster|Word))|C(?:GContextTag|enterTab|learAll|o(?:lorTag|ordinateOverflowErr)|rossStreamShiftTag)|D(?:ataStreamUnicodeStyledText|e(?:c(?:imalTab|ompositionFactorTag)|faultFontFallbacks|scentTag)|irectData(?:AdvanceDeltaFixedArray|BaselineDeltaFixedArray|DeviceDeltaSInt16Array|LayoutRecordATSLayoutRecord(?:Current|Version1)|Style(?:IndexUInt16Array|SettingATSUStyleSettingRefArray)))|F(?:lattenOptionNoOptionsMask|o(?:nt(?:MatrixTag|Tag|s(?:Matched|NotMatched))|rceHangingTag)|rom(?:FollowingLayout|PreviousLayout|TextBeginning))|GlyphSelectorTag|HangingInhibitFactorTag|I(?:mposeWidthTag|nvalid(?:Attribute(?:SizeErr|TagErr|ValueErr)|Ca(?:cheErr|llInsideCallbackErr)|Font(?:Err|FallbacksErr|ID)|StyleErr|Text(?:LayoutErr|RangeErr)))|KerningInhibitFactorTag|L(?:a(?:ng(?:RegionTag|uageTag)|st(?:Err|ResortOnlyFallback)|youtOperation(?:AppleReserved|BaselineAdjustment|CallbackStatus(?:Continue|Handled)|Justification|KerningAdjustment|Morph|None|OverrideTag|PostLayoutAdjustment|TrackingAdjustment))|e(?:adingTag|ftT(?:ab|oRightBaseDirection))|ine(?:AscentTag|B(?:aselineValuesTag|reakInWord)|D(?:e(?:cimalTabCharacterTag|scentTag)|irectionTag)|F(?:lushFactorTag|ontFallbacksTag)|HighlightCGColorTag|JustificationFactorTag|La(?:ng(?:RegionTag|uageTag)|youtOptionsTag)|RotationTag|T(?:extLocatorTag|runcationTag)|WidthTag)|owLevelErr)|Max(?:ATSUITagValue|LineTag|StyleTag)|N(?:o(?:C(?:aretAngleTag|orrespondingFontErr)|Font(?:CmapAvailableErr|NameErr|ScalerAvailableErr)|LigatureSplitTag|OpticalAlignmentTag|S(?:elector|pecialJustificationTag|tyleRunsAssignedErr)|tSetErr)|umberTabTypes)|OutputBufferTooSmallErr|PriorityJustOverrideTag|Q(?:D(?:BoldfaceTag|CondensedTag|ExtendedTag|ItalicTag|UnderlineTag)|uickDrawTextErr)|R(?:GBAlphaColorTag|ightT(?:ab|oLeftBaseDirection))|S(?:equentialFallbacks(?:Exclusive|Preferred)|izeTag|t(?:rongly(?:Horizontal|Vertical)|yle(?:Contain(?:edBy|s)|D(?:oubleLineCount|ropShadow(?:BlurOptionTag|ColorOptionTag|OffsetOptionTag|Tag))|Equals|RenderingOptionsTag|S(?:ingleLineCount|trikeThrough(?:Co(?:lorOptionTag|untOptionTag)|Tag))|TextLocatorTag|Un(?:derlineCo(?:lorOptionTag|untOptionTag)|equal)))|uppressCrossKerningTag)|T(?:oTextEnd|r(?:ackingTag|unc(?:FeatNoSquishing|ate(?:End|Middle|None|S(?:pecificationMask|tart)))))|U(?:n(?:FlattenOptionNoOptionsMask|supportedStreamFormatErr)|se(?:GrafPortPenLoc|LineControlWidth))|VerticalCharacterTag|se(?:CaretOrigins|DeviceOrigins|FractionalOrigins|GlyphAdvance|LineHeight|OriginFlags)))|U(?:Gr(?:aphErr_(?:CannotDoInCurrentContext|Invalid(?:AudioUnit|Connection)|NodeNotFound|OutputNodeErr)|oupParameterID_(?:All(?:NotesOff|SoundOff)|ChannelPressure|DataEntry(?:_LSB)?|Expression(?:_LSB)?|Foot(?:_LSB)?|KeyPressure(?:_(?:FirstKey|LastKey))?|ModWheel(?:_LSB)?|P(?:an(?:_LSB)?|itchBend)|ResetAllControllers|S(?:ostenuto|ustain)|Volume(?:_LSB)?))|LowShelfParam_(?:CutoffFrequency|Gain)|MIDISynthProperty_EnablePreload|N(?:BandEQ(?:FilterType_(?:2ndOrderButterworth(?:HighPass|LowPass)|Band(?:Pass|Stop)|HighShelf|LowShelf|Parametric|Resonant(?:High(?:Pass|Shelf)|Low(?:Pass|Shelf)))|P(?:aram_(?:B(?:andwidth|ypassBand)|F(?:ilterType|requency)|G(?:ain|lobalGain))|roperty_(?:BiquadCoefficients|MaxNumberOfBands|NumberOfBands)))|et(?:ReceiveP(?:aram_(?:NumParameters|Status)|roperty_(?:Hostname|Password))|S(?:end(?:NumPresetFormats|P(?:aram_(?:NumParameters|Status)|r(?:esetFormat_(?:AAC_(?:128kbpspc|32kbpspc|4(?:0kbpspc|8kbpspc)|64kbpspc|80kbpspc|96kbpspc|LD_(?:32kbpspc|4(?:0kbpspc|8kbpspc)|64kbpspc))|IMA4|Lossless(?:16|24)|PCM(?:Float32|Int(?:16|24))|ULaw)|operty_(?:Disconnect|P(?:assword|ortNum)|ServiceName|TransmissionFormat(?:Index)?))))|tatus_(?:Connect(?:ed|ing)|Listening|NotConnected|Overflow|Underflow)))|odeInteraction_(?:Connection|InputCallback))|Parameter(?:Listener_AnyParameter|MIDIMapping_(?:Any(?:ChannelFlag|NoteFlag)|Bipolar(?:_On)?|SubRange|Toggle))|Sampler(?:P(?:aram_(?:CoarseTuning|FineTuning|Gain|Pan)|roperty_(?:BankAndPreset|Load(?:AudioFiles|Instrument|PresetFromBank)))|_Default(?:BankLSB|MelodicBankMSB|PercussionBankMSB))|VoiceIO(?:Err_UnexpectedNumberOfInputChannels|Property_(?:BypassVoiceProcessing|MuteOutput|VoiceProcessingEnableAGC)))|VL(?:I(?:nOrder|s(?:Le(?:af|ftBranch)|RightBranch|Tree))|NullNode|P(?:ostOrder|reOrder))|X(?:CopyMultipleAttributeOptionStopOnError|Error(?:A(?:PIDisabled|ctionUnsupported|ttributeUnsupported)|CannotComplete|Failure|I(?:llegalArgument|nvalidUIElement(?:Observer)?)|No(?:Value|t(?:EnoughPrecision|Implemented|ification(?:AlreadyRegistered|NotRegistered|Unsupported)))|ParameterizedAttributeUnsupported|Success)|MenuItemModifier(?:Control|No(?:Command|ne)|Option|Shift)|UnderlineStyle(?:Double|None|Single|Thick))|bbrevSquaredLigaturesO(?:ffSelector|nSelector)|c(?:c(?:essException|ountKCItemAttr)|tivateAnd(?:HandleClick|IgnoreClick))|dd(?:KCEvent(?:Mask)?|ressKCItemAttr)|l(?:ert(?:Caution(?:Alert|BadgeIcon|Icon)|Default(?:CancelText|O(?:KText|therText))|Flags(?:AlertIsMovable|Use(?:Co(?:mpositing|ntrolHierarchy)|Theme(?:Background|Controls)))|Note(?:Alert|Icon)|PlainAlert|St(?:dAlert(?:CancelButton|HelpButton|O(?:KButton|therButton))|op(?:Alert|Icon))|VariantCode|WindowClass)|i(?:asBadgeIcon|gn(?:AbsoluteCenter|Bottom(?:Left|Right)?|Center(?:Bottom|Left|Right|Top)|HorizontalCenter|Left|None|Right|Top(?:Left|Right)?|VerticalCenter))|l(?:CapsSelector|LowerCaseSelector|PPDDomains|Typ(?:eFeaturesO(?:ffSelector|nSelector)|ographicFeaturesType)|WindowClasses)|readySavedStateErr|t(?:HalfWidthTextSelector|P(?:lainWindowClass|roportionalTextSelector)|ernate(?:HorizKanaO(?:ffSelector|nSelector)|KanaType|VertKanaO(?:ffSelector|nSelector)))|ways(?:Authenticate|SendSubject))|n(?:dConnections|notationType|y(?:AuthType|Component(?:FlagsMask|Manufacturer|SubType|Type)|P(?:ort|rotocol)|TransactionID))|pp(?:PackageAliasType|earance(?:EventClass|Folder(?:Icon|Type)|Part(?:DownButton|Indicator|LeftButton|Meta(?:Disabled|Inactive|None)|Page(?:DownArea|LeftArea|RightArea|UpArea)|RightButton|UpButton)|Region(?:C(?:loseBox|o(?:llapseBox|ntent))|Drag|Grow|Structure|T(?:itle(?:Bar|ProxyIcon|Text)|oolbarButton)|ZoomBox))|l(?:e(?:ExtrasFolder(?:Icon|Type)|JapaneseDictionarySignature|Lo(?:go(?:CharCode|Icon|Unicode)|sslessFormatFlag_(?:16BitSourceData|2(?:0BitSourceData|4BitSourceData)|32BitSourceData))|M(?:anufacturer|enu(?:Folder(?:AliasType|Icon(?:Resource)?|Type)|Icon))|S(?:cript(?:BadgeIcon|Subtype)|hare(?:AuthenticationFolderType|PasswordKCItemClass|SupportFolderType))|Talk(?:Icon|ZoneIcon)|shareAutomountServerAliasesFolderType)|ication(?:AliasType|CPAliasType|DAAliasType|SupportFolder(?:Icon|Type)|ThreadID|WindowKind|sFolder(?:Icon|Type))))|s(?:sistantsFolder(?:Icon|Type)|teriskToMultiplyO(?:ffSelector|nSelector)|ync(?:Eject(?:Complete|InProgress)|Mount(?:Complete|InProgress)|Unmount(?:Complete|InProgress)))|t(?:SpecifiedOrigin|temptDupCardEntryErr)|u(?:dio(?:A(?:ggregateDevice(?:ClassID|Property(?:ActiveSubDeviceList|C(?:lockDevice|omposition)|FullSubDeviceList|MasterSubDevice))|lertSoundsFolderType)|B(?:alanceFadeType_(?:EqualPower|MaxUnityGain)|o(?:o(?:leanControl(?:ClassID|PropertyValue)|tChimeVolumeControlClassID)|x(?:ClassID|Property(?:Acqui(?:red|sitionFailed)|BoxUID|ClockDeviceList|DeviceList|Has(?:Audio|MIDI|Video)|IsProtected|TransportType))))|C(?:hannel(?:Bit_(?:Center(?:Surround|Top(?:Front|Middle|Rear))?|L(?:FEScreen|eft(?:Center|Surround(?:Direct)?|Top(?:Front|Middle|Rear))?)|Right(?:Center|Surround(?:Direct)?|Top(?:Front|Middle|Rear))?|Top(?:Back(?:Center|Left|Right)|CenterSurround)|VerticalHeight(?:Center|Left|Right))|Coordinates_(?:Azimuth|BackFront|D(?:istance|ownUp)|Elevation|LeftRight)|Flags_(?:AllOff|Meters|RectangularCoordinates|SphericalCoordinates)|La(?:bel_(?:Ambisonic_(?:W|X|Y|Z)|B(?:eginReserved|inaural(?:Left|Right))|C(?:enter(?:Surround(?:Direct)?|Top(?:Front|Middle|Rear))?|lickTrack)|Di(?:alogCentricMix|screte(?:_(?:0|1(?:0|1|2|3|4|5)?|2|3|4|5|6(?:5535)?|7|8|9))?)|EndReserved|ForeignLanguage|H(?:OA_ACN(?:_(?:0|1(?:0|1|2|3|4|5)?|2|3|4|5|6(?:5024)?|7|8|9))?|aptic|ea(?:dphones(?:Left|Right)|ringImpaired))|L(?:FE(?:2|Screen)|eft(?:Center|Surround(?:Direct)?|To(?:p(?:Front|Middle|Rear)|tal)|Wide)?)|M(?:S_(?:Mid|Side)|ono)|Narration|R(?:earSurround(?:Left|Right)|ight(?:Center|Surround(?:Direct)?|To(?:p(?:Front|Middle|Rear)|tal)|Wide)?)|Top(?:Back(?:Center|Left|Right)|CenterSurround)|U(?:n(?:known|used)|seCoordinates)|VerticalHeight(?:Center|Left|Right)|XY_(?:X|Y))|youtTag_(?:A(?:AC_(?:3_0|4_0|5_(?:0|1)|6_(?:0|1)|7_(?:0|1(?:_(?:B|C))?)|Octagonal|Quadraphonic)|C3_(?:1_0_1|2_1_1|3_(?:0(?:_1)?|1(?:_1)?))|mbisonic_B_Format|tmos_(?:5_1_2|7_1_4|9_1_6)|udioUnit_(?:4|5(?:_(?:0|1))?|6(?:_(?:0|1))?|7_(?:0(?:_Front)?|1(?:_Front)?)|8))|B(?:eginReserved|inaural)|Cube|D(?:TS_(?:3_1|4_1|6_(?:0_(?:A|B|C)|1_(?:A|B|C|D))|7_(?:0|1)|8_(?:0_(?:A|B)|1_(?:A|B)))|VD_(?:0|1(?:0|1|2|3|4|5|6|7|8|9)?|2(?:0)?|3|4|5|6|7|8|9)|iscreteInOrder)|E(?:AC(?:3_(?:6_1_(?:A|B|C)|7_1_(?:A|B|C|D|E|F|G|H))|_(?:6_0_A|7_0_A))|magic_Default_7_1|ndReserved)|H(?:OA_ACN_(?:N3D|SN3D)|exagonal)|ITU_(?:1_0|2_(?:0|1|2)|3_(?:0|1|2(?:_1)?|4_1))|M(?:PEG_(?:1_0|2_0|3_0_(?:A|B)|4_0_(?:A|B)|5_(?:0_(?:A|B|C|D)|1_(?:A|B|C|D))|6_1_A|7_1_(?:A|B|C))|atrixStereo|idSide|ono)|Octagonal|Pentagonal|Quadraphonic|S(?:MPTE_DTV|tereo(?:Headphones)?)|TMH_10_2_(?:full|std)|U(?:nknown|seChannel(?:Bitmap|Descriptions))|WAVE_(?:2_1|3_0|4_0_(?:A|B)|5_(?:0_(?:A|B)|1_(?:A|B))|6_1|7_1)|XY)))|l(?:ipLightControlClassID|ock(?:Device(?:ClassID|Property(?:AvailableNominalSampleRates|C(?:lockDomain|ontrolList)|Device(?:Is(?:Alive|Running)|UID)|Latency|NominalSampleRate|TransportType))|Source(?:Control(?:ClassID|PropertyItemKind)|ItemKindInternal)))|o(?:dec(?:AppendInput(?:BufferListSelect|DataSelect)|B(?:ad(?:DataError|PropertySizeError)|itRate(?:ControlMode_(?:Constant|LongTermAverage|Variable(?:Constrained)?)|Format(?:_(?:ABR|CBR|VBR))?))|D(?:elayMode_(?:Compatibility|Minimum|Optimal)|oesSampleRateConversion)|ExtendFrequencies|GetProperty(?:InfoSelect|Select)|I(?:llegalOperationError|n(?:itializeSelect|putFormatsForOutputFormat))|No(?:Error|tEnoughBufferSpaceError)|Output(?:FormatsForInputFormat|Precedence(?:BitRate|None|SampleRate)?)|Pr(?:imeMethod_(?:No(?:ne|rmal)|Pre)|o(?:duceOutput(?:BufferListSelect|DataSelect|Packet(?:AtEOF|Failure|NeedsMoreInputData|Success(?:HasMore)?))|perty(?:A(?:djustLocalQuality|pplicable(?:BitRateRange|InputSampleRates|OutputSampleRates)|vailable(?:BitRate(?:Range|s)|Input(?:ChannelLayout(?:Tags|s)|SampleRates)|NumberChannels|Output(?:ChannelLayout(?:Tags|s)|SampleRates)))|BitRate(?:ControlMode|ForVBR)|Current(?:Input(?:ChannelLayout|Format|SampleRate)|Output(?:ChannelLayout|Format|SampleRate)|TargetBitRate)|D(?:elayMode|oesSampleRateConversion|ynamicRangeControlMode)|EmploysDependentPackets|Format(?:CFString|Info|List)|HasVariablePacketByteSizes|I(?:nput(?:BufferSize|ChannelLayout|FormatsForOutputFormat)|sInitialized)|M(?:a(?:gicCookie|nufacturerCFString|ximumPacketByteSize)|inimum(?:DelayMode|Number(?:InputPackets|OutputPackets)))|NameCFString|Output(?:ChannelLayout|FormatsForInputFormat)|P(?:a(?:cket(?:FrameSize|SizeLimitForVBR)|ddedZeros)|r(?:ime(?:Info|Method)|ogramTargetLevel(?:Constant)?))|QualitySetting|Re(?:commendedBitRateRange|quiresPacketDescription)|S(?:ettings|oundQualityForVBR|upported(?:InputFormats|OutputFormats))|UsedInputBufferSize|ZeroFramesPadded)))|Quality_(?:High|Low|M(?:ax|edium|in))|ResetSelect|S(?:etPropertySelect|tateError)|U(?:n(?:initializeSelect|knownPropertyError|s(?:pecifiedError|upportedFormatError))|seRecommendedSampleRate))|mponent(?:Err_Instance(?:Invalidated|TimedOut)|Flag_Unsearchable|ValidationResult_(?:Failed|Passed|TimedOut|Un(?:authorizedError_(?:Init|Open)|known))|sFolderType)|n(?:trol(?:ClassID|Property(?:Element|Scope|Variant))|verter(?:A(?:pplicableEncode(?:BitRates|SampleRates)|vailableEncode(?:BitRates|ChannelLayoutTags|SampleRates))|C(?:hannelMap|o(?:decQuality|mpressionMagicCookie)|urrent(?:InputStreamDescription|OutputStreamDescription))|DecompressionMagicCookie|E(?:ncode(?:AdjustableSampleRate|BitRate)|rr_(?:BadPropertySizeError|FormatNotSupported|In(?:putSampleRateOutOfRange|valid(?:InputSize|OutputSize))|O(?:perationNotSupported|utputSampleRateOutOfRange)|PropertyNotSupported|RequiresPacketDescriptionsError|UnspecifiedError))|InputChannelLayout|OutputChannelLayout|Pr(?:ime(?:Info|Method)|operty(?:BitDepthHint|Calculate(?:InputBufferSize|OutputBufferSize)|Dither(?:BitDepth|ing)|FormatList|InputCodecParameters|M(?:aximum(?:Input(?:BufferSize|PacketSize)|OutputPacketSize)|inimum(?:InputBufferSize|OutputBufferSize))|OutputCodecParameters|Settings))|Quality_(?:High|Low|M(?:ax|edium|in))|SampleRateConverter(?:Algorithm|Complexity(?:_(?:Linear|M(?:astering|inimumPhase)|Normal))?|InitialPhase|Quality)))))|D(?:ata(?:DestinationControlClassID|SourceControlClassID)|e(?:coderComponentType|vice(?:ClassID|P(?:ermissionsError|ro(?:cessorOverload|perty(?:A(?:ctualSampleRate|vailableNominalSampleRates)|Buffer(?:FrameSize(?:Range)?|Size(?:Range)?)|C(?:hannel(?:CategoryName(?:CFString)?|N(?:ame(?:CFString)?|ominalLineLevel(?:NameForID(?:CFString)?|s)?|umberName(?:CFString)?))|l(?:ipLight|ock(?:D(?:evice|omain)|Source(?:KindForID|NameForID(?:CFString)?|s)?))|onfigurationApplication)|D(?:ataSource(?:KindForID|NameForID(?:CFString)?|s)?|evice(?:CanBeDefault(?:Device|SystemDevice)|HasChanged|Is(?:Alive|Running(?:Somewhere)?)|Manufacturer(?:CFString)?|Name(?:CFString)?|UID)|riverShouldOwniSub)|H(?:ighPassFilterSetting(?:NameForID(?:CFString)?|s)?|ogMode)|I(?:O(?:CycleUsage|ProcStreamUsage|StoppedAbnormally)|con|sHidden)|JackIsConnected|L(?:atency|istenback)|M(?:odelUID|ute)|NominalSampleRate|P(?:ha(?:ntomPower|seInvert)|l(?:ayThru(?:Destination(?:NameForID(?:CFString)?|s)?|S(?:olo|tereoPan(?:Channels)?)|Volume(?:Decibels(?:ToScalar(?:TransferFunction)?)?|RangeDecibels|Scalar(?:ToDecibels)?))?|ugIn)|referredChannel(?:Layout|sForStereo))|Re(?:gisterBufferList|latedDevices)|S(?:afetyOffset|cope(?:Input|Output|PlayThrough)|olo|t(?:ereoPan(?:Channels)?|ream(?:Configuration|Format(?:Match|Supported|s)?|s))|u(?:b(?:Mute|Volume(?:Decibels(?:ToScalar(?:TransferFunction)?)?|RangeDecibels|Scalar(?:ToDecibels)?))|pportsMixing))|T(?:alkback|ransportType)|UsesVariableBufferFrameSizes|Volume(?:Decibels(?:ToScalar(?:TransferFunction)?)?|RangeDecibels|Scalar(?:ToDecibels)?))))|StartTime(?:DontConsult(?:DeviceFlag|HALFlag)|IsInputFlag)|TransportType(?:A(?:VB|ggregate|irPlay|utoAggregate)|B(?:luetooth(?:LE)?|uiltIn)|DisplayPort|FireWire|HDMI|PCI|Thunderbolt|U(?:SB|nknown)|Virtual)|Un(?:known|supportedFormatError)))|igidesignFolderType)|En(?:coderComponentType|dPoint(?:ClassID|Device(?:ClassID|Property(?:Composition|EndPointList|IsPrivate))))|F(?:ile(?:3GP(?:2Type|Type)|A(?:AC_ADTSType|C3Type|IF(?:CType|FType)|MRType)|BadPropertySizeError|C(?:AFType|loseSelect|o(?:mponent_(?:Available(?:FormatIDs|StreamDescriptionsForFormat)|Can(?:Read|Write)|ExtensionsForType|F(?:astDispatchTable|ileTypeName)|HFSTypeCodesForType|MIMETypesForType|UTIsForType)|untUserDataSelect)|reate(?:Select|URLSelect))|D(?:ataIsThisFormatSelect|oesNotAllow64BitDataSizeError)|E(?:ndOfFileError|xtensionIsThisFormatSelect)|F(?:LACType|ile(?:DataIsThisFormatSelect|IsThisFormatSelect|NotFoundError)|lags_(?:DontPageAlignAudioData|EraseFile))|G(?:et(?:GlobalInfoS(?:elect|izeSelect)|Property(?:InfoSelect|Select)|UserDataS(?:elect|izeSelect))|lobalInfo_(?:A(?:ll(?:Extensions|HFSTypeCodes|MIMETypes|UTIs)|vailable(?:FormatIDs|StreamDescriptionsForFormat))|ExtensionsForType|FileTypeName|HFSTypeCodesForType|MIMETypesForType|ReadableTypes|TypesFor(?:Extension|HFSTypeCode|MIMEType|UTI)|UTIsForType|WritableTypes))|In(?:itialize(?:Select|WithCallbacksSelect)|valid(?:ChunkError|FileError|Packet(?:DependencyError|OffsetError)))|L(?:ATMInLOASType|oopDirection_(?:Backward|Forward(?:AndBackward)?|NoLooping))|M(?:4(?:AType|BType)|P(?:1Type|2Type|3Type|EG4Type)|arkerType_Generic)|N(?:extType|otOp(?:enError|timizedError))|Op(?:e(?:n(?:Select|URLSelect|WithCallbacksSelect)|rationNotSupportedError)|timizeSelect)|P(?:ermissionsError|ositionError|roperty(?:A(?:lbumArtwork|udio(?:Data(?:ByteCount|PacketCount)|TrackCount))|B(?:itRate|yteToPacket)|Ch(?:annelLayout|unkIDs)|D(?:ata(?:Format(?:Name)?|Offset)|eferSizeUpdates)|EstimatedDuration|F(?:ileFormat|ormatList|rameToPacket)|I(?:D3Tag|nfoDictionary|sOptimized)|Ma(?:gicCookieData|rkerList|ximumPacketSize)|NextIndependentPacket|P(?:acket(?:RangeByteCountUpperBound|SizeUpperBound|T(?:ableInfo|o(?:Byte|DependencyInfo|Frame|RollDistance)))|reviousIndependentPacket)|Re(?:gionList|s(?:erveDuration|trictsRandomAccess))|SourceBitDepth|UseAudioTrack))|R(?:F64Type|e(?:ad(?:BytesSelect|P(?:acket(?:DataSelect|sSelect)|ermission)|WritePermission)|gionFlag_(?:LoopEnable|Play(?:Backward|Forward))|moveUserDataSelect))|S(?:et(?:PropertySelect|UserDataSelect)|oundDesigner2Type|tream(?:Error_(?:BadPropertySize|D(?:ataUnavailable|iscontinuityCantRecover)|I(?:llegalOperation|nvalid(?:File|PacketOffset))|NotOptimized|Uns(?:pecifiedError|upported(?:DataFormat|FileType|Property))|ValueUnknown)|P(?:arseFlag_Discontinuity|roperty(?:Flag_(?:CacheProperty|PropertyIsCached)|_(?:A(?:udioData(?:ByteCount|PacketCount)|verageBytesPerPacket)|B(?:itRate|yteToPacket)|ChannelLayout|Data(?:Format|Offset)|F(?:ileFormat|ormatList|rameToPacket)|InfoDictionary|Ma(?:gicCookieData|ximumPacketSize)|NextIndependentPacket|P(?:acket(?:SizeUpperBound|T(?:ableInfo|o(?:Byte|DependencyInfo|Frame|RollDistance)))|reviousIndependentPacket)|Re(?:adyToProducePackets|strictsRandomAccess))))|SeekFlag_OffsetIsEstimated))|Uns(?:pecifiedError|upported(?:DataFormatError|FileTypeError|PropertyError))|W(?:AVEType|rite(?:BytesSelect|P(?:acketsSelect|ermission))))|ormat(?:60958AC3|A(?:C3|ES3|Law|MR(?:_WB)?|pple(?:IMA4|Lossless)|udible)|Bad(?:PropertySizeError|SpecifierSizeError)|DVIIntelIMA|EnhancedAC3|F(?:LAC|lag(?:Is(?:AlignedHigh|BigEndian|Float|Non(?:Interleaved|Mixable)|Packed|SignedInteger)|s(?:A(?:reAllClear|udioUnitCanonical)|Canonical|Native(?:Endian|FloatPacked))))|LinearPCM|M(?:ACE(?:3|6)|IDIStream|PEG(?:4(?:AAC(?:_(?:ELD(?:_(?:SBR|V2))?|HE(?:_V2)?|LD|Spatial))?|CELP|HVXC|TwinVQ)|D_USAC|Layer(?:1|2|3))|icrosoftGSM)|Opus|P(?:arameterValueStream|roperty_(?:A(?:SBDFrom(?:ESDS|MPEGPacket)|reChannelLayoutsEquivalent|vailableEncode(?:BitRates|ChannelLayoutTags|NumberChannels|SampleRates))|B(?:alanceFade|itmapForLayoutTag)|Channel(?:Layout(?:F(?:or(?:Bitmap|Tag)|romESDS)|Hash|Name|SimpleName)|Map|Name|ShortName)|Decode(?:FormatIDs|rs)|Encode(?:FormatIDs|rs)|F(?:irstPlayableFormatFromList|ormat(?:EmploysDependentPackets|I(?:nfo|s(?:E(?:ncrypted|xternallyFramed)|VBR))|List|Name))|ID3Tag(?:Size|ToDictionary)|MatrixMixMap|NumberOfChannelsForLayout|OutputFormatList|PanningMatrix|Tag(?:ForChannelLayout|sForNumberOfChannels)|ValidateChannelLayout))|Q(?:Design(?:2)?|UALCOMM)|TimeCode|U(?:Law|n(?:knownFormatError|s(?:pecifiedError|upported(?:DataFormatError|PropertyError))))|iLBC))|H(?:ardware(?:Bad(?:DeviceError|ObjectError|PropertySizeError|StreamError)|IllegalOperationError|No(?:Error|tRunningError)|P(?:owerHint(?:FavorSavingPower|None)|roperty(?:Bo(?:otChimeVolume(?:Decibels(?:ToScalar(?:TransferFunction)?)?|RangeDecibels|Scalar(?:ToDecibels)?)|xList)|ClockDeviceList|De(?:fault(?:InputDevice|OutputDevice|SystemOutputDevice)|vice(?:ForUID|s))|HogModeIsAllowed|IsInitingOrExiting|MixStereoToMono|P(?:lugIn(?:ForBundleID|List)|owerHint|rocessIs(?:Audible|Master))|RunLoop|S(?:erviceRestarted|leepingIsAllowed)|Trans(?:late(?:BundleIDTo(?:PlugIn|TransportManager)|UIDTo(?:Box|ClockDevice|Device))|portManagerList)|U(?:nloadingIsAllowed|ser(?:IDChanged|SessionIsActiveOrHeadless))))|Service(?:DeviceProperty_VirtualMaster(?:Balance|Volume)|Property_ServiceRestarted)|Un(?:knownPropertyError|s(?:pecifiedError|upportedOperationError)))|ighPassFilterControlClassID)|ISubOwnerControlClassID|JackControlClassID|L(?:FE(?:MuteControlClassID|VolumeControlClassID)|evelControl(?:ClassID|Property(?:Convert(?:DecibelsToScalar|ScalarToDecibels)|Decibel(?:Range|Value|sToScalarTransferFunction)|ScalarValue)|TranferFunction(?:1(?:0Over1|1Over1|2Over1|Over(?:2|3))|2Over1|3Over(?:1|2|4)|4Over1|5Over1|6Over1|7Over1|8Over1|9Over1|Linear))|i(?:neLevelControlClassID|stenbackControlClassID))|MuteControlClassID|O(?:bject(?:ClassID(?:Wildcard)?|Property(?:BaseClass|C(?:lass|ontrolList|reator)|Element(?:CategoryName|Master|N(?:ame|umberName)|Wildcard)|FirmwareVersion|Identify|Listener(?:Added|Removed)|M(?:anufacturer|odelName)|Name|Owne(?:dObjects|r)|S(?:cope(?:Global|Input|Output|PlayThrough|Wildcard)|e(?:lectorWildcard|rialNumber)))|SystemObject|Unknown)|fflineUnit(?:Property_(?:InputSize|OutputSize)|RenderAction_(?:Complete|Preflight|Render))|utputUnit(?:Property_(?:C(?:hannelMap|urrentDevice)|EnableIO|HasIO|IsRunning|S(?:etInputCallback|tartTime(?:stampsAtZero)?))|Range|St(?:artSelect|opSelect)))|P(?:ha(?:ntomPowerControlClassID|seInvertControlClassID)|lugIn(?:C(?:lassID|reateAggregateDevice)|DestroyAggregateDevice|Property(?:B(?:oxList|undleID)|ClockDeviceList|DeviceList|TranslateUIDTo(?:Box|ClockDevice|Device))|sFolderType)|r(?:esetsFolderType|opertyWildcard(?:Channel|PropertyID|Section)))|Queue(?:DeviceProperty_(?:NumberChannels|SampleRate)|Err_(?:Buffer(?:E(?:mpty|nqueuedTwice)|InQueue)|C(?:annotStart(?:Yet)?|odecNotFound)|DisposalPending|EnqueueDuringReset|Invalid(?:Buffer|CodecAccess|Device|OfflineMode|P(?:arameter|roperty(?:Size|Value)?)|QueueType|RunState|Tap(?:Context|Type))|P(?:ermissions|rimeTimedOut)|QueueInvalidated|RecordUnderrun|TooManyTaps)|P(?:aram_(?:P(?:an|itch|layRate)|Volume(?:RampTime)?)|ro(?:cessingTap_(?:EndOfStream|P(?:ostEffects|reEffects)|S(?:iphon|tartOfStream))|perty_(?:C(?:hannelLayout|onverterError|urrent(?:Device|LevelMeter(?:DB)?))|DecodeBufferSizeFrames|Enable(?:LevelMetering|TimePitch)|IsRunning|Ma(?:gicCookie|ximumOutputPacketSize)|StreamDescription|TimePitch(?:Algorithm|Bypass))))|TimePitchAlgorithm_(?:Spectral|TimeDomain|Varispeed))|S(?:e(?:lectorControl(?:ClassID|ItemKindSpacer|Property(?:AvailableItems|CurrentItem|Item(?:Kind|Name)))|rvices(?:Bad(?:PropertySizeError|SpecifierSizeError)|NoError|Property(?:CompletePlaybackIfAppDies|IsUISound)|SystemSound(?:ClientTimedOutError|ExceededMaximumDurationError|UnspecifiedError)|UnsupportedPropertyError)|ttingsFlags_(?:ExpertParameter|InvisibleParameter|MetaParameter|UserInterfaceParameter))|liderControl(?:ClassID|Property(?:Range|Value))|o(?:loControlClassID|und(?:BanksFolderType|sFolderType))|t(?:ereoPanControl(?:ClassID|Property(?:PanningChannels|Value))|ream(?:ClassID|Property(?:Available(?:PhysicalFormats|VirtualFormats)|Direction|IsActive|Latency|OwningDevice|PhysicalFormat(?:Match|Supported|s)?|StartingChannel|TerminalType|VirtualFormat)|TerminalType(?:Di(?:gitalAudioInterface|splayPort)|H(?:DMI|ead(?:phones|setMicrophone))|L(?:FESpeaker|ine)|Microphone|Receiver(?:Microphone|Speaker)|Speaker|TTY|Unknown)|Unknown))|u(?:bDevice(?:ClassID|DriftCompensation(?:HighQuality|LowQuality|M(?:axQuality|ediumQuality|inQuality))|Property(?:DriftCompensation(?:Quality)?|ExtraLatency))|pportFolderType)|ystemObjectClassID)|T(?:alkbackControlClassID|imeStamp(?:HostTimeValid|NothingValid|RateScalarValid|S(?:MPTETimeValid|ample(?:HostTimeValid|TimeValid))|WordClockTimeValid)|oolboxErr(?:_(?:CannotDoInCurrentContext|EndOfTrack|I(?:llegalTrackDestination|nvalid(?:EventType|PlayerState|SequenceType))|NoSequence|StartOfTrack|Track(?:IndexError|NotFound))|or_NoTrackDestination)|ransportManager(?:C(?:lassID|reateEndPointDevice)|DestroyEndPointDevice|Property(?:EndPointList|Trans(?:lateUIDToEndPoint|portType))))|Unit(?:Add(?:PropertyListenerSelect|RenderNotifySelect)|C(?:lumpID_System|omplexRenderSelect)|E(?:rr_(?:CannotDoInCurrentContext|ExtensionNotFound|F(?:ailedInitialization|ileNotSpecified|ormatNotSupported)|I(?:llegalInstrument|n(?:itialized|strumentTypeNotFound|valid(?:Element|File(?:Path)?|OfflineRender|P(?:arameter(?:Value)?|roperty(?:Value)?)|Scope)))|M(?:IDIOutputBufferFull|issingKey)|NoConnection|PropertyNot(?:InUse|Writable)|RenderTimeout|TooManyFramesToProcess|Un(?:authorized|initialized|knownFileType))|vent_(?:BeginParameterChangeGesture|EndParameterChangeGesture|P(?:arameterValueChange|ropertyChange)))|GetP(?:arameterSelect|roperty(?:InfoSelect|Select))|InitializeSelect|M(?:anufacturer_Apple|igrateProperty_(?:FromPlugin|OldAutomation))|OfflineProperty_(?:InputSize|OutputSize|Preflight(?:Name|Requirements)|StartOffset)|P(?:arameter(?:Flag_(?:C(?:FNameRelease|anRamp)|Display(?:Cube(?:Root|d)|Exponential|Logarithmic|Mask|Square(?:Root|d))|ExpertMode|G(?:lobal|roup)|Has(?:C(?:FNameString|lump)|Name)|I(?:nput|s(?:ElementMeta|GlobalMeta|HighResolution|Readable|Writable))|MeterReadOnly|NonRealTime|O(?:mitFromPresets|utput)|PlotHistory|ValuesHaveStrings)|Name_Full|Unit_(?:AbsoluteCents|B(?:PM|eats|oolean)|C(?:ents|ustomUnit)|De(?:cibels|grees)|EqualPowerCrossfade|Generic|Hertz|Indexed|LinearGain|M(?:IDI(?:Controller|NoteNumber)|eters|i(?:lliseconds|xerFaderCurve1))|Octaves|P(?:an|ercent|hase)|R(?:at(?:e|io)|elativeSemiTones)|S(?:ampleFrames|econds)))|ro(?:cess(?:MultipleSelect|Select)|perty_(?:A(?:UHostIdentifier|ddParameterMIDIMapping|llParameterMIDIMappings|udioChannelLayout)|B(?:usCount|ypassEffect)|C(?:PULoad|lassInfo(?:FromDocument)?|o(?:coaUI|ntextName)|urrentP(?:layTime|reset))|De(?:ferredRenderer(?:ExtraLatency|PullSize|WaitFrames)|pendentParameters)|Element(?:Count|Name)|F(?:a(?:ctoryPresets|stDispatch)|requencyResponse)|GetUIComponentList|Ho(?:stCallbacks|tMapParameterMIDIMapping)|I(?:conLocation|n(?:PlaceProcessing|put(?:AnchorTimeStamp|SamplesInOutput)))|La(?:stRenderError|tency)|M(?:IDI(?:ControlMapping|OutputCallback(?:Info)?)|a(?:keConnection|trix(?:Dimensions|Levels)|ximumFramesPerSlice)|eter(?:Clipping|ingMode))|NickName|OfflineRender|P(?:a(?:nnerMode|rameter(?:ClumpName|HistoryInfo|I(?:DName|nfo)|List|StringFromValue|Value(?:FromString|Name|Strings)|sForOverview))|resent(?:Preset|ationLatency))|Re(?:moveParameterMIDIMapping|nderQuality|questViewController|verbRoomType)|S(?:RCAlgorithm|ampleRate(?:ConverterComplexity)?|chedule(?:AudioSlice|StartTimeStamp|dFile(?:BufferSizeFrames|IDs|NumberBuffers|Prime|Region))|et(?:ExternalBuffer|RenderCallback)|houldAllocateBuffer|p(?:atial(?:Mixer(?:AttenuationCurve|DistanceParams|RenderingFlags)|izationAlgorithm)|e(?:akerConfiguration|echChannel))|treamFormat|upport(?:ed(?:ChannelLayoutTags|NumChannels)|sMPE))|TailTime|UsesInternalReverb|Voice)))|R(?:ange|e(?:move(?:PropertyListener(?:Select|WithUserDataSelect)|RenderNotifySelect)|nder(?:Action_(?:DoNotCheckRenderArgs|OutputIsSilence|P(?:ostRender(?:Error)?|reRender))|Select)|setSelect))|S(?:RCAlgorithm_(?:MediumQuality|Polyphase)|ampleRateConverterComplexity_(?:Linear|Mastering|Normal)|c(?:heduleParametersSelect|ope_(?:G(?:lobal|roup)|Input|Layer(?:Item)?|Note|Output|Part))|etP(?:arameterSelect|ropertySelect)|ubType_(?:A(?:U(?:Converter|Filter|iPodTimeOther)|udioFilePlayer)|BandPassFilter|D(?:LSSynth|e(?:f(?:aultOutput|erredRenderer)|lay)|istortion|ynamicsProcessor)|G(?:enericOutput|raphicEQ)|H(?:ALOutput|RTFPanner|igh(?:PassFilter|ShelfFilter))|Low(?:PassFilter|ShelfFilter)|M(?:IDISynth|atrix(?:Mixer|Reverb)|erger|ulti(?:BandCompressor|ChannelMixer|Splitter))|N(?:BandEQ|e(?:t(?:Receive|Send)|wTimePitch))|P(?:arametricEQ|eakLimiter|itch)|R(?:everb2|o(?:gerBeep|undTripAAC))|S(?:ample(?:Delay|r)|cheduledSoundPlayer|oundFieldPanner|p(?:atialMixer|eechSynthesis|hericalHeadPanner|litter)|tereoMixer|ystemOutput)|TimePitch|V(?:arispeed|ectorPanner|oiceProcessingIO)))|Type_(?:Effect|FormatConverter|Generator|M(?:IDIProcessor|ixer|usic(?:Device|Effect))|O(?:fflineEffect|utput)|Panner)|UninitializeSelect|yCodecComponentType)|V(?:STFolderType|olumeControlClassID)|_(?:BadFilePathError|File(?:NotFoundError|PermissionError)|MemFullError|ParamError|TooManyFilesOpenError|UnimplementedError))|t(?:h(?:TypeKCItemAttr|orizationFlag(?:CanNotPreAuthorize|De(?:faults|stroyRights)|ExtendRights|InteractionAllowed|NoData|P(?:artialRights|reAuthorize)))|o(?:GenerateReturnID|matorWorkflowsFolderType|saveInformationFolderType)))|vailBoundsChangedFor(?:D(?:isplay|ock)|MenuBar))|B(?:LibTag2|SLN(?:C(?:ontrolPointFormat(?:NoMap|WithMap)|urrentVersion)|DistanceFormat(?:NoMap|WithMap)|HangingBaseline|Ideographic(?:CenterBaseline|HighBaseline|LowBaseline)|LastBaseline|MathBaseline|N(?:oBaseline(?:Override)?|umBaselineClasses)|RomanBaseline|Tag)|T(?:B(?:adCloseMask|igKeysMask)|HeaderNode|IndexNode|LeafNode|MapNode|VariableIndexKeysMask)|a(?:ck(?:spaceCharCode|wardArrowIcon)|d(?:A(?:dapterErr|rg(?:LengthErr|sErr)|ttributeErr)|BaseErr|C(?:ISErr|ustomIFIDErr)|DeviceErr|EDCErr|HandleErr|IRQErr|LinkErr|OffsetErr|PageErr|S(?:izeErr|ocketErr|peedErr)|T(?:upleDataErr|ypeErr)|V(?:ccErr|ppErr)|WindowErr)|ndpassParam_(?:Bandwidth|CenterFrequency))|ellCharCode|ig5_(?:BasicVariant|DOSVariant|ETenVariant|StandardVariant)|lessed(?:BusErrorBait|Folder)|o(?:otTimeStartupItemsFolderType|xAnnotationSelector)|ridgeSoftwareRunningCantSleep|u(?:llet(?:CharCode|Unicode)|rningIcon|syErr|ttonDialogItem)|y(?:CommentView|DateView|IconView|KindView|LabelView|NameView|S(?:izeView|mallIcon)|VersionView|tePacketTranslationFlag_IsEstimate))|C(?:A(?:Clock(?:Message_(?:Armed|Disarmed|PropertyChanged|St(?:art(?:TimeSet|ed)|opped)|WrongSMPTEFormat)|Property_(?:InternalTimebase|M(?:IDIClockDestinations|TC(?:Destinations|FreewheelTime)|eterTrack)|Name|S(?:MPTE(?:Format|Offset)|endMIDISPP|ync(?:Mode|Source))|T(?:empoMap|imebaseSource))|SyncMode_(?:Internal|M(?:IDIClockTransport|TCTransport))|Time(?:Format_(?:AbsoluteSeconds|Beats|HostTime|S(?:MPTE(?:Seconds|Time)|amples|econds))|base_(?:Audio(?:Device|OutputUnit)|HostTime))|_(?:CannotSetTimeError|Invalid(?:P(?:layRateError|ropertySizeError)|S(?:MPTE(?:FormatError|OffsetError)|ync(?:ModeError|SourceError))|Time(?:FormatError|base(?:Error|SourceError))|UnitError)|UnknownPropertyError))|F(?:LinearPCMFormatFlagIs(?:Float|LittleEndian)|MarkerType_(?:Edit(?:Destination(?:Begin|End)|Source(?:Begin|End))|Generic|Index|KeySignature|Program(?:End|Start)|Re(?:gion(?:End|S(?:tart|yncPoint))|leaseLoop(?:End|Start))|S(?:avedPlayPosition|election(?:End|Start)|ustainLoop(?:End|Start))|T(?:empo|imeSignature|rack(?:End|Start)))|RegionFlag_(?:LoopEnable|Play(?:Backward|Forward))|_(?:AudioDataChunkID|ChannelLayoutChunkID|EditCommentsChunkID|F(?:il(?:e(?:Type|Version_Initial)|lerChunkID)|ormatListID)|In(?:foStringsChunkID|strumentChunkID)|M(?:IDIChunkID|a(?:gicCookieID|rkerChunkID))|OverviewChunkID|P(?:acketTableChunkID|eakChunkID)|RegionChunkID|S(?:MPTE_TimeType(?:2(?:398|4|5|997(?:Drop)?)|30(?:Drop)?|5(?:0|994(?:Drop)?)|60(?:Drop)?|None)|tr(?:eamDescriptionChunkID|ingsChunkID))|U(?:MIDChunkID|UIDChunkID)|iXMLChunkID)))|CRegister(?:CBit|NBit|VBit|XBit|ZBit)|F(?:Error(?:HTTP(?:AuthenticationTypeUnsupported|Bad(?:Credentials|ProxyCredentials|URL)|ConnectionLost|P(?:arseFailure|roxyConnectionFailure)|RedirectionLoopDetected|SProxyConnectionFailure)|PACFile(?:Auth|Error))|FTPErrorUnexpectedStatusCode|H(?:TTPCookieCannotParseCookieFile|ost(?:Addresses|Error(?:HostNotFound|Unknown)|Names|Reachability))|M68kRTA|NetService(?:Error(?:BadArgument|C(?:ancel|ollision)|DNSServiceFailure|In(?:Progress|valid)|NotFound|Timeout|Unknown)|Flag(?:IsD(?:efault|omain)|MoreComing|NoAutoRename|Remove)|MonitorTXT|sError(?:BadArgument|C(?:ancel|ollision)|In(?:Progress|valid)|NotFound|Timeout|Unknown))|S(?:OCKS(?:4Error(?:Id(?:Conflict|entdFailed)|RequestFailed|UnknownStatusCode)|5Error(?:Bad(?:Credentials|ResponseAddr|State)|NoAcceptableMethod|UnsupportedNegotiationMethod)|ErrorUn(?:knownClientVersion|supportedServerVersion))|treamError(?:HTTP(?:Authentication(?:Bad(?:Password|UserName)|TypeUnsupported)|BadURL|ParseFailure|RedirectionLoop|SProxyFailureUnexpectedResponseToCONNECTMethod)|SOCKS(?:4(?:Id(?:Conflict|entdFailed)|RequestFailed|SubDomainResponse)|5(?:Bad(?:ResponseAddr|State)|SubDomain(?:Method|Response|UserPass))|SubDomain(?:None|VersionCode)|UnknownClientVersion)))|URLError(?:AppTransportSecurityRequiresSecureConnection|Ba(?:ckgroundSession(?:InUseByAnotherProcess|WasDisconnected)|d(?:ServerResponse|URL))|C(?:a(?:llIsActive|n(?:celled|not(?:C(?:loseFile|onnectToHost|reateFile)|Decode(?:ContentData|RawData)|FindHost|LoadFromNetwork|MoveFile|OpenFile|ParseResponse|RemoveFile|WriteToFile)))|lientCertificateRe(?:jected|quired))|D(?:NSLookupFailed|ata(?:LengthExceedsMaximum|NotAllowed)|ownloadDecodingFailed(?:MidStream|ToComplete))|File(?:DoesNotExist|IsDirectory|OutsideSafeArea)|HTTPTooManyRedirects|InternationalRoamingOff|N(?:etworkConnectionLost|o(?:PermissionsToReadFile|tConnectedToInternet))|Re(?:directToNonExistentLocation|questBodyStreamExhausted|sourceUnavailable)|Se(?:cureConnectionFailed|rverCertificate(?:Has(?:BadDate|UnknownRoot)|NotYetValid|Untrusted))|TimedOut|U(?:n(?:known|supportedURL)|ser(?:AuthenticationRequired|CancelledAuthentication))|ZeroByteResource))|G(?:Image(?:AnimationStatus_(?:AllocationFailure|CorruptInputImage|IncompleteInputImage|ParameterError|UnsupportedFormat)|Metadata(?:Error(?:BadArgument|ConflictingArguments|PrefixConflict|Un(?:known|supportedFormat))|Type(?:A(?:lternate(?:Array|Text)|rray(?:Ordered|Unordered))|Default|Invalid|Str(?:ing|ucture)))|PropertyOrientation(?:Down(?:Mirrored)?|Left(?:Mirrored)?|Right(?:Mirrored)?|Up(?:Mirrored)?)|Status(?:Complete|In(?:complete|validData)|ReadingHeader|Un(?:expectedEOF|knownType)))|L(?:Bad(?:A(?:ddress|lloc|ttribute)|Co(?:deModule|n(?:nection|text))|D(?:isplay|rawable)|Enumeration|FullScreen|Match|OffScreen|P(?:ixelFormat|roperty)|RendererInfo|State|Value|Window)|C(?:E(?:CrashOnRemovedFunctions|DisplayListOptimization|MPEngine|Rasterization|S(?:tateValidation|urfaceBackingSize|wap(?:Limit|Rectangle)))|P(?:C(?:lientStorage|ontextPriorityRequest(?:High|Low|Normal)|urrentRendererID)|DispatchTableSize|GPU(?:FragmentProcessing|RestartStatus(?:Blacklisted|Caused|None)|VertexProcessing)|HasDrawable|MPSwapsInFlight|ReclaimResources|S(?:urface(?:BackingSize|O(?:pacity|rder)|SurfaceVolatile|Texture)|wap(?:Interval|Rectangle))))|GO(?:ClearFormatCache|FormatCacheSize|Re(?:setLibrary|tainRenderers)|Use(?:BuildCache|ErrorHandler))|NoError|OGLPVersion_(?:3_2_Core|GL3_Core|Legacy)|PFA(?:A(?:cc(?:elerated(?:Compute)?|umSize)|l(?:l(?:Renderers|owOfflineRenderers)|phaSize)|ux(?:Buffers|DepthStencil))|Backing(?:Store|Volatile)|C(?:losestPolicy|o(?:lor(?:Float|Size)|mpliant))|D(?:epthSize|isplayMask|oubleBuffer)|FullScreen|M(?:PSafe|aximumPolicy|inimumPolicy|ulti(?:Screen|sample))|NoRecovery|O(?:ffScreen|penGLProfile)|PBuffer|R(?:e(?:motePBuffer|ndererID)|obust)|S(?:ample(?:Alpha|Buffers|s)|ingleRenderer|te(?:ncilSize|reo)|upersample)|TripleBuffer|VirtualScreenCount|Window)|R(?:P(?:Acc(?:elerated(?:Compute)?|umModes)|B(?:ackingStore|ufferModes)|Co(?:lorModes|mpliant)|D(?:epthModes|isplayMask)|FullScreen|GPU(?:FragProcCapable|VertProcCapable)|M(?:PSafe|ax(?:AuxBuffers|Sample(?:Buffers|s))|ultiScreen)|O(?:ffScreen|nline)|R(?:enderer(?:Count|ID)|obust)|S(?:ample(?:Alpha|Modes)|tencilModes)|TextureMemory(?:Megabytes)?|VideoMemory(?:Megabytes)?|Window)|enderer(?:A(?:TIRa(?:deon(?:8500ID|9700ID|ID|X(?:1000ID|2000ID|3000ID))|ge(?:128ID|ProID))|ppleSWID)|Ge(?:Force(?:2MXID|3ID|8xxxID|FXID)|neric(?:FloatID|ID))|Intel(?:900ID|HD(?:4000ID|ID)|X3100ID)|Mesa3DFXID|VTBladeXP2ID))))|JK(?:ItalicRoman(?:O(?:ffSelector|nSelector)|Selector)|RomanSpacingType|SymbolAlt(?:F(?:iveSelector|ourSelector)|OneSelector|T(?:hreeSelector|woSelector)|ernativesType)|VerticalRoman(?:CenteredSelector|HBaselineSelector|PlacementType))|M(?:ActivateTextService|CopyTextServiceInputModeList|DeactivateTextService|F(?:ixTextService|loatBitmapFlags(?:Alpha(?:Premul)?|None|RangeClipped))|Get(?:InputModePaletteMenu|ScriptLangSupport|TextService(?:Menu|Property))|H(?:elpItem(?:AppleGuide|NoHelp|OtherHelp|RemoveHelp)|idePaletteWindows)|In(?:itiateTextService|putModePaletteItemHit)|MenuItemSelected|NothingSelected|S(?:Attr(?:Apple(?:CodesigningHashAgility(?:V2)?|ExpirationTime)|None|S(?:igningTime|mime(?:Capabilities|EncryptionKeyPrefs|MSEncryptionKeyPrefs)))|Certificate(?:Chain(?:WithRoot(?:OrFail)?)?|None|SignerOnly)|Signer(?:Invalid(?:Cert|Index|Signature)|NeedsDetachedContent|Unsigned|Valid)|etTextService(?:Cursor|Property)|howHelpSelected)|Te(?:rminateTextService|xtService(?:Event(?:Ref)?|MenuSelect))|UCTextServiceEvent)|S(?:Accept(?:AllComponentsMode|ThreadSafeComponentsOnlyMode)|DiskSpaceRecoveryOptionNoUI|Identity(?:AuthorityNotAccessibleErr|C(?:lass(?:Group|User)|ommitCompleted)|D(?:eletedErr|uplicate(?:FullNameErr|PosixNameErr))|Flag(?:Hidden|None)|Invalid(?:FullNameErr|PosixNameErr)|PermissionErr|Query(?:Event(?:ErrorOccurred|Results(?:Added|Changed|Removed)|SearchPhaseFinished)|GenerateUpdateEvents|IncludeHiddenIdentities|String(?:BeginsWith|Equals))|UnknownAuthorityErr)|SM_APPLEDL_MASK_MODE|tackBased)|T(?:CharacterCollection(?:Adobe(?:CNS1|GB1|Japan(?:1|2)|Korea1)|IdentityMapping)|F(?:ont(?:BoldTrait|C(?:la(?:rendonSerifsClass|ss(?:ClarendonSerifs|FreeformSerifs|M(?:ask(?:Shift|Trait)|odernSerifs)|O(?:ldStyleSerifs|rnamentals)|S(?:ansSerif|cripts|labSerifs|ymbolic)|TransitionalSerifs|Unknown))|o(?:l(?:lectionCopy(?:DefaultOptions|StandardSort|Unique)|orGlyphsTrait)|mpositeTrait|ndensedTrait))|DescriptorMatching(?:D(?:id(?:Begin|F(?:ailWithError|inish(?:Downloading)?)|Match)|ownloading)|Stalled|WillBegin(?:Downloading|Querying))|ExpandedTrait|F(?:ormat(?:Bitmap|OpenType(?:PostScript|TrueType)|PostScript|TrueType|Unrecognized)|reeformSerifsClass)|ItalicTrait|M(?:anager(?:AutoActivation(?:D(?:efault|isabled)|Enabled)|Error(?:A(?:lreadyRegistered|ssetNotFound)|CancelledByUser|DuplicatedName|ExceededResourceLimit|FileNotFound|In(?:Use|sufficient(?:Info|Permissions)|validF(?:ilePath|ontData))|MissingEntitlement|NotRegistered|RegistrationFailed|SystemRequired|UnrecognizedFormat)|Scope(?:None|P(?:ersistent|rocess)|Session|User))|o(?:dernSerifsClass|noSpaceTrait))|O(?:ldStyleSerifsClass|ptions(?:Default|Pre(?:ferSystemFont|ventAutoActivation))|r(?:ientation(?:Default|Horizontal|Vertical)|namentalsClass))|Priority(?:Computer|Dynamic|Network|Process|System|User)|S(?:ansSerifClass|criptsClass|labSerifsClass|ymbolicClass)|T(?:able(?:A(?:cnt|nkr|var)|B(?:ASE|dat|hed|loc|sln)|C(?:B(?:DT|LC)|FF(?:2)?|OLR|PAL|idg|map|v(?:ar|t))|DSIG|EB(?:DT|LC|SC)|F(?:dsc|eat|mtx|ond|pgm|var)|G(?:DEF|POS|SUB|asp|lyf|var)|H(?:VAR|dmx|ead|hea|mtx|sty)|J(?:STF|ust)|Ker(?:n|x)|L(?:TSH|car|oca|tag)|M(?:ATH|ERG|VAR|axp|eta|or(?:t|x))|Name|O(?:S2|p(?:bd|tionNoOptions))|P(?:CLT|ost|r(?:ep|op))|S(?:TAT|VG|bi(?:t|x))|Trak|V(?:DMX|ORG|VAR|hea|mtx)|Xref|Zapf)|ra(?:it(?:Bold|C(?:lassMask|o(?:lorGlyphs|mposite|ndensed))|Expanded|Italic|MonoSpace|UIOptimized|Vertical)|nsitionalSerifsClass))|U(?:I(?:Font(?:A(?:lertHeader|pplication)|ControlContent|EmphasizedSystem(?:Detail)?|Label|M(?:e(?:nu(?:Item(?:CmdKey|Mark)?|Title)|ssage)|ini(?:EmphasizedSystem|System))|None|P(?:alette|ushButton)|S(?:mall(?:EmphasizedSystem|System|Toolbar)|ystem(?:Detail)?)|Tool(?:Tip|bar)|U(?:ser(?:FixedPitch)?|tilityWindowTitle)|Views|WindowTitle)|OptimizedTrait)|nknownClass)|VerticalTrait)|rameP(?:athFill(?:EvenOdd|WindingNumber)|rogression(?:LeftToRight|RightToLeft|TopToBottom)))|Line(?:B(?:ounds(?:ExcludeTypographic(?:Leading|Shifts)|IncludeLanguageExtents|Use(?:GlyphPathBounds|HangingPunctuation|OpticalBounds))|reakBy(?:C(?:harWrapping|lipping)|Truncating(?:Head|Middle|Tail)|WordWrapping))|Truncation(?:End|Middle|Start))|ParagraphStyleSpecifier(?:Alignment|BaseWritingDirection|Count|DefaultTabInterval|FirstLineHeadIndent|HeadIndent|Line(?:B(?:oundsOptions|reakMode)|HeightMultiple|SpacingAdjustment)|M(?:aximumLine(?:Height|Spacing)|inimumLine(?:Height|Spacing))|ParagraphSpacing(?:Before)?|Ta(?:bStops|ilIndent))|Run(?:Delegate(?:CurrentVersion|Version1)|Status(?:HasNonIdentityMatrix|No(?:Status|nMonotonic)|RightToLeft))|TextAlignment(?:Center|Justified|Left|Natural|Right)|Underline(?:Pattern(?:D(?:ash(?:Dot(?:Dot)?)?|ot)|Solid)|Style(?:Double|None|Single|Thick))|WritingDirection(?:Embedding|LeftToRight|Natural|Override|RightToLeft))|UPSPPDDomain|V(?:AttachmentMode_Should(?:NotPropagate|Propagate)|Pixel(?:Buffer(?:Lock_ReadOnly|PoolFlushExcessBuffers)|FormatType_(?:1(?:28RGBAFloat|4Bayer_(?:BGGR|G(?:BRG|RBG)|RGGB)|6(?:BE5(?:55|65)|Gray|LE5(?:55(?:1)?|65))|IndexedGray_WhiteIsZero|Monochrome)|2(?:4(?:BGR|RGB)|Indexed(?:Gray_WhiteIsZero)?)|3(?:0RGB(?:LEPackedWideGamut)?|2(?:A(?:BGR|RGB|lphaGray)|BGRA|RGBA))|4(?:2(?:0YpCbCr(?:10BiPlanar(?:FullRange|VideoRange)|8(?:BiPlanar(?:FullRange|VideoRange)|Planar(?:FullRange)?|VideoRange_8A_TriPlanar))|2YpCbCr(?:1(?:0(?:BiPlanar(?:FullRange|VideoRange))?|6)|8(?:FullRange|_yuvs)?|_4A_8BiPlanar))|44(?:4(?:AYpCbCr(?:16|8)|YpCbCrA8(?:R)?)|YpCbCr(?:10(?:BiPlanar(?:FullRange|VideoRange))?|8))|8RGB|Indexed(?:Gray_WhiteIsZero)?)|64(?:ARGB|RGBAHalf)|8Indexed(?:Gray_WhiteIsZero)?|ARGB2101010LEPacked|D(?:epthFloat(?:16|32)|isparityFloat(?:16|32))|OneComponent(?:16Half|32Float|8)|TwoComponent(?:16Half|32Float|8)))|Return(?:AllocationFailed|DisplayLink(?:AlreadyRunning|CallbacksNotSet|NotRunning)|Error|First|Invalid(?:Argument|Display|P(?:ixel(?:BufferAttributes|Format)|oolAttributes)|Size)|Last|P(?:ixelBufferNot(?:MetalCompatible|OpenGLCompatible)|oolAllocationFailed)|Retry|Success|Unsupported|WouldExceedAllocationThreshold)|SMPTETime(?:Running|Type(?:2(?:4|5|997(?:Drop)?)|30(?:Drop)?|5994|60)|Valid)|Time(?:IsIndefinite|Stamp(?:BottomField|HostTimeValid|IsInterlaced|RateScalarValid|SMPTETimeValid|TopField|Video(?:HostTimeValid|RefreshPeriodValid|TimeValid))))|a(?:chedDataFolderType|l(?:ibratorNamePrefix|lingConvention(?:Mask|Phase|Width))|n(?:onicalCompositionO(?:ffSelector|nSelector)|t(?:ConfigureCardErr|ReportProcessorTemperatureErr))|r(?:bonLibraryFolderType|d(?:BusCardErr|PowerOffErr))|seSensitive(?:Layout(?:O(?:ffSelector|nSelector)|Type)|SpacingO(?:ffSelector|nSelector))|utionIcon)|e(?:nterOn(?:MainScreen|Screen)|rt(?:Search(?:Any|Decrypt(?:Allowed|Disallowed|Ignored|Mask)|Encrypt(?:Allowed|Disallowed|Ignored|Mask)|PrivKeyRequired|S(?:hift|igning(?:Allowed|Disallowed|Ignored|Mask))|Unwrap(?:Allowed|Disallowed|Ignored|Mask)|Verify(?:Allowed|Disallowed|Ignored|Mask)|Wrap(?:Allowed|Disallowed|Ignored|Mask))|Usage(?:AllAdd|DecryptA(?:dd|skAndAdd)|EncryptA(?:dd|skAndAdd)|KeyExchA(?:dd|skAndAdd)|RootA(?:dd|skAndAdd)|S(?:SLA(?:dd|skAndAdd)|hift|igningA(?:dd|skAndAdd))|VerifyA(?:dd|skAndAdd))|ificateKCItemClass))|h(?:aracter(?:AlternativesType|PaletteInputMethodClass|ShapeType)|e(?:ck(?:BoxDialogItem|CharCode|Unicode)|wableItemsFolderType))|ircleAnnotationSelector|l(?:ass(?:KCItemAttr|ic(?:D(?:esktopFolderType|omain)|PreferencesFolderType))|ea(?:nUpAEUT|rCharCode)|i(?:entRequestDenied|p(?:boardIcon|ping(?:Creator|PictureType(?:Icon)?|SoundType(?:Icon)?|TextType(?:Icon)?|UnknownType(?:Icon)?))))|o(?:l(?:l(?:ate(?:AttributesNotFoundErr|BufferTooSmall|Invalid(?:C(?:har|ollationRef)|Options)|MissingUnicodeTableErr|PatternNotFoundErr|UnicodeConvertFailedErr)|ection(?:AllAttributes|D(?:efaultAttributes|ontWant(?:Attributes|Data|I(?:d|ndex)|Size|Tag))|Lock(?:Bit|Mask)|NoAttributes|Persistence(?:Bit|Mask)|Reserved(?:0(?:Bit|Mask)|1(?:0(?:Bit|Mask)|1(?:Bit|Mask)|2(?:Bit|Mask)|3(?:Bit|Mask)|Bit|Mask)|2(?:Bit|Mask)|3(?:Bit|Mask)|4(?:Bit|Mask)|5(?:Bit|Mask)|6(?:Bit|Mask)|7(?:Bit|Mask)|8(?:Bit|Mask)|9(?:Bit|Mask))|User(?:0(?:Bit|Mask)|1(?:0(?:Bit|Mask)|1(?:Bit|Mask)|2(?:Bit|Mask)|3(?:Bit|Mask)|4(?:Bit|Mask)|5(?:Bit|Mask)|Bit|Mask)|2(?:Bit|Mask)|3(?:Bit|Mask)|4(?:Bit|Mask)|5(?:Bit|Mask)|6(?:Bit|Mask)|7(?:Bit|Mask)|8(?:Bit|Mask)|9(?:Bit|Mask)|Attributes)))|or(?:Picker(?:AppIsColorSyncAware|Ca(?:llColorProcLive|n(?:AnimatePalette|ModifyPalette))|D(?:etachedFromChoices|ialogIsMo(?:dal|veable))|In(?:ApplicationDialog|PickerDialog|SystemDialog)|sFolderType)|Sync(?:1(?:0BitInteger|6Bit(?:Float|Integer)|BitGamut)|32Bit(?:Float|Integer|NamedColorIndex)|8BitInteger|Alpha(?:First|InfoMask|Last|None(?:Skip(?:First|Last))?|Premultiplied(?:First|Last))|ByteOrder(?:16(?:Big|Little)|32(?:Big|Little)|Default|Mask)|CMMFolderType|Folder(?:Icon|Type)|ProfilesFolderType|ScriptingFolderType))?)|m(?:m(?:and(?:CharCode|Unicode)|entKCItemAttr|on(?:LigaturesO(?:ffSelector|nSelector)|NameKCItemAttr))|p(?:atibilityCompositionO(?:ffSelector|nSelector)|o(?:nent(?:AliasResourceType|C(?:anDoSelect|loseSelect)|DebugOption|ExecuteWiredActionSelect|Get(?:MPWorkFunctionSelect|PublicResourceSelect)|OpenSelect|Re(?:gisterSelect|sourceType)|TargetSelect|UnregisterSelect|VersionSelect|sFolderType)|sitionsFolderType)|uterIcon))|n(?:figurationLockedErr|n(?:Suite|ect(?:ToIcon|ion(?:AudioStreaming|BlueGammaScale|C(?:h(?:anged|eckEnable)|o(?:lor(?:DepthsSupported|Mode(?:sSupported)?)|ntroller(?:ColorDepth|D(?:epthsSupported|itherControl))))|Display(?:Flags|Parameter(?:Count|s))|Enable(?:Audio)?|Fl(?:ags|ushParameters)|G(?:ammaScale|reenGammaScale)|HandleDisplayPortEvent|Ignore|Overscan|P(?:anelTimingDisable|o(?:stWake|wer)|robe)|RedGammaScale|S(?:tartOfFrameTime|upports(?:AppleSense|HLDDCSense|LLDDCSense)|ync(?:Enable|Flags))|V(?:BLMultiplier|ideoBest))))|t(?:ainer(?:AliasType|CDROMAliasType|F(?:loppyAliasType|olderAliasType)|HardDiskAliasType|ServerAliasType|TrashAliasType)|extual(?:Alternates(?:O(?:ffSelector|nSelector)|Type)|LigaturesO(?:ffSelector|nSelector)|MenuItemsFolder(?:Icon|Type)|SwashAlternatesO(?:ffSelector|nSelector))|rol(?:A(?:dd(?:FontSizeMask|ToMetaFontMask)|utoToggles)|B(?:e(?:havior(?:CommandMenu|MultiValueMenu|OffsetContents|Pushbutton|S(?:ingleValueMenu|ticky)|Toggles)|velButton(?:Align(?:Bottom(?:Left|Right)?|Center|Left|Right|SysDirection|T(?:ext(?:Center|Flush(?:Left|Right)|SysDirection)|op(?:Left|Right)?))|C(?:enterPopupGlyphTag|ontentTag)|Graphic(?:AlignTag|OffsetTag)|IsMultiValueMenuTag|KindTag|La(?:rgeBevel(?:Proc|Variant)?|stMenuTag)|Menu(?:DelayTag|HandleTag|On(?:Bottom|Right(?:Variant)?)|RefTag|ValueTag)|NormalBevel(?:Proc|Variant)?|OwnedMenuRefTag|Place(?:AboveGraphic|BelowGraphic|Normally|SysDirection|To(?:LeftOfGraphic|RightOfGraphic))|S(?:caleIconTag|mallBevel(?:Proc|Variant)?)|T(?:ext(?:AlignTag|OffsetTag|PlaceTag)|ransformTag)))|oundsChange(?:PositionChanged|SizeChanged)|uttonPart)|C(?:h(?:asingArrows(?:AnimatingTag|Proc)|eckBox(?:AutoToggleProc|CheckedValue|MixedValue|P(?:art|roc)|UncheckedValue))|l(?:ickableMetaPart|ock(?:A(?:MPMPart|bsoluteTimeTag|nimatingTag)|DateProc|F(?:lag(?:DisplayOnly|Live|Standard)|ontStyleTag)|HourDayPart|Is(?:DisplayOnly|Live)|LongDateTag|M(?:inuteMonthPart|onthYearProc)|NoFlags|Part|SecondYearPart|T(?:ime(?:Proc|SecondsProc)|ype(?:HourMinute(?:Second)?|Month(?:DayYear|Year)))))|o(?:l(?:lectionTag(?:Bounds|Command|ID(?:ID|Signature)|M(?:aximum|inimum)|RefCon|Title|UnicodeTitle|V(?:a(?:lue|rCode)|i(?:ewSize|sibility)))|orTableResourceType)|ntent(?:AlertIconRes|C(?:GImageRef|Icon(?:Handle|Res))|I(?:CON(?:Res)?|con(?:Ref|Suite(?:Handle|Res)))|MetaPart|Pict(?:Handle|Res)|T(?:ag|extOnly))))|D(?:ataBrowser(?:DraggedPart|EditText(?:KeyFilterTag|ValidationProcTag)|IncludesFrameAndFocusTag|KeyFilterTag|Part)|efProc(?:ResourceType|Type)|i(?:alogItem|s(?:abledPart|closure(?:Button(?:Closed|Disclosed)|TrianglePoint(?:Default|Left|Right))))|ownButtonPart)|E(?:dit(?:Text(?:C(?:FStringTag|harCount)|FixedTextTag|In(?:line(?:InputProc|P(?:ostUpdateProcTag|reUpdateProcTag))|sert(?:CFStringRefTag|TextBufferTag))|Key(?:FilterTag|ScriptBehaviorTag)|LockedTag|P(?:a(?:rt|ssword(?:CFStringTag|Proc|Tag))|roc)|S(?:electionTag|ingleLineTag|pellCheck(?:AsYouTypeTag|ingTag)|tyleTag)|T(?:EHandleTag|extTag)|ValidationProcTag)|UnicodeTextP(?:asswordProc|ostUpdateProcTag|roc))|ntireControl)|Fo(?:cus(?:N(?:extPart|oPart)|PrevPart)|nt(?:BigSystemFont|MiniSystemFont|S(?:mall(?:BoldSystemFont|SystemFont)|tyleTag)|ViewSystemFont))|G(?:etsFocusOnClick|roupBox(?:CheckBoxProc|F(?:ontStyleTag|rameRectTag)|Menu(?:HandleTag|RefTag)|PopupButtonProc|Secondary(?:CheckBoxProc|PopupButtonProc|TextTitleProc)|T(?:extTitleProc|itleRectTag)))|Ha(?:ndlesTracking|s(?:RadioBehavior|SpecialBackground))|I(?:con(?:AlignmentTag|ContentTag|NoTrackProc|P(?:art|roc)|Re(?:f(?:NoTrackProc|Proc)|sourceIDTag)|Suite(?:NoTrackProc|Proc)|TransformTag)|dlesWithTimer|mageWell(?:ContentTag|IsDragDestinationTag|P(?:art|roc)|TransformTag)|n(?:activePart|dicatorPart|vertsUpDownValueMeaning))|K(?:ey(?:Filter(?:BlockKey|PassKey|Tag)|ScriptBehavior(?:AllowAnyScript|PrefersRoman|RequiresRoman))|ind(?:BevelButton|C(?:h(?:asingArrows|eck(?:Box|GroupBox))|lock)|D(?:ataBrowser|isclosure(?:Button|Triangle))|Edit(?:Text|UnicodeText)|GroupBox|HI(?:ComboBox|GrowBoxView|ImageView|MenuView|S(?:crollView|earchField|tandardMenuView)|TextView)|I(?:con|mageWell)|Li(?:stBox|ttleArrows)|P(?:icture|lacard|opup(?:Arrow|Button|GroupBox)|rogressBar|ush(?:Button|IconButton))|R(?:adio(?:Button|Group)|elevanceBar|oundButton)|S(?:croll(?:Bar|ingTextBox)|eparator|ignatureApple|lider|taticText)|Ta(?:bs|g)|UserPane|WindowHeader))|L(?:abelPart|i(?:st(?:Box(?:AutoSizeProc|DoubleClick(?:Part|Tag)|FontStyleTag|KeyFilterTag|L(?:DEFTag|istHandleTag)|P(?:art|roc))|DescResType)|ttleArrows(?:IncrementValueTag|Proc)))|MenuPart|No(?:Content|Part|Variant)|OpaqueMetaPart|P(?:a(?:ge(?:DownPart|UpPart)|nel(?:DisabledFolder(?:Icon|Type)|Folder(?:AliasType|Icon(?:Resource)?|Type)))|icture(?:HandleTag|NoTrackProc|P(?:art|roc))|lacardProc|opup(?:Arrow(?:EastProc|NorthProc|Orientation(?:East|North|South|West)|S(?:ize(?:Normal|Small)|mall(?:EastProc|NorthProc|SouthProc|WestProc)|outhProc)|WestProc)|Button(?:CheckCurrentTag|ExtraHeightTag|Menu(?:HandleTag|IDTag|RefTag)|OwnedMenuRefTag|Proc)|FixedWidthVariant|Use(?:AddResMenuVariant|WFontVariant)|VariableWidthVariant)|ro(?:gressBar(?:AnimatingTag|IndeterminateTag|Proc)|pertyPersistent)|ushBut(?:LeftIconProc|RightIconProc|ton(?:AnimatingTag|C(?:ancelTag|ontentTag)|DefaultTag|I(?:con(?:AlignmentTag|On(?:Left|Right))|sTexturedTag)|Proc)))|R(?:adio(?:Button(?:AutoToggleProc|CheckedValue|MixedValue|P(?:art|roc)|UncheckedValue)|GroupP(?:art|roc))|elevanceBarProc|oundButton(?:ContentTag|LargeSize|NormalSize|SizeTag))|S(?:croll(?:Bar(?:LiveProc|Proc|ShowsArrowsTag)|TextBox(?:A(?:nimatingTag|utoScroll(?:AmountTag|Proc))|ContentsTag|DelayBe(?:foreAutoScrollTag|tweenAutoScrollTag)|Proc))|e(?:archField(?:CancelPart|MenuPart)|paratorLineProc)|ize(?:Auto|Large|Mini|Normal|Small|Tag)|lider(?:DoesNotPoint|HasTickMarks|LiveFeedback|NonDirectional|P(?:oints(?:DownOrRight|UpOrLeft)|roc)|ReverseDirection)|t(?:aticText(?:CFStringTag|IsMultilineTag|Proc|StyleTag|T(?:ext(?:HeightTag|Tag)|runcTag))|r(?:ipModulesFolder(?:Icon|Type)|uctureMetaPart))|upports(?:C(?:alcBestRect|lickActivation|ontextualMenus)|D(?:ataAccess|ragAndDrop)|Embedding|F(?:lattening|ocus)|G(?:etRegion|hosting)|LiveFeedback|SetCursor))|T(?:ab(?:ContentRectTag|Direction(?:East|North|South|West)|EnabledFlagTag|FontStyleTag|I(?:mageContentTag|nfo(?:Tag|Version(?:One|Zero)))|L(?:arge(?:EastProc|NorthProc|Proc|SouthProc|WestProc)|istResType)|S(?:ize(?:Large|Mini|Small)|mall(?:EastProc|NorthProc|Proc|SouthProc|WestProc)))|emplateResourceType|hemeText(?:FontTag|HorizontalFlushTag|InfoTag|TruncationTag|VerticalFlushTag)|riangle(?:AutoToggleProc|L(?:astValueTag|eftFacing(?:AutoToggleProc|Proc))|P(?:art|roc)))|U(?:nicode|pButtonPart|se(?:AllMask|BackColorMask|F(?:aceMask|o(?:ntMask|reColorMask))|JustMask|ModeMask|SizeMask|ThemeFontIDMask|r(?:ItemDrawProcTag|Pane(?:ActivateProcTag|BackgroundProcTag|DrawProcTag|FocusProcTag|HitTestProcTag|IdleProcTag|KeyDownProcTag|Proc|TrackingProcTag))|sOwningWindowsFontVariant))|W(?:ants(?:Activate|Idle)|indow(?:Header(?:IsListHeaderTag|Proc)|ListViewHeaderProc))))|verterPrimeMethod_(?:No(?:ne|rmal)|Pre))|operativeThread|re(?:E(?:ndian(?:AppleEventManagerDomain|ResourceManagerDomain)|ventClass)|ServicesFolderType))|reat(?:e(?:Folder(?:AtBoot(?:Bit)?)?|IfNeeded)|ionDateKCItemAttr|orKCItemAttr)|u(?:r(?:rent(?:MixedModeStateRecord|Process|ThreadID|User(?:Folder(?:Location|Type)|RemoteFolder(?:Location|Type)))|sive(?:ConnectionType|Selector))|stom(?:BadgeResource(?:ID|Type|Version)|Icon(?:KCItemAttr|Resource))))|D(?:0Dispatched(?:CStackBased|PascalStackBased)|1DispatchedPascalStackBased|CM(?:A(?:llowListing|nyFieldT(?:ag|ype))|BasicDictionaryClass|Can(?:AddDictionaryFieldMask|CreateDictionaryMask|HaveMultipleIndexMask|ModifyDictionaryMask|StreamDictionaryMask|Use(?:FileDictionaryMask|MemoryDictionaryMask|TransactionMask))|DictionaryHeader(?:Signature|Version)|Fi(?:ndMethod(?:B(?:ackwardTrie|eginningMatch)|ContainsMatch|E(?:ndingMatch|xactMatch)|ForwardTrie)|xedSizeFieldMask)|HiddenFieldMask|I(?:dentifyFieldMask|ndexedFieldMask)|Japanese(?:AccentT(?:ag|ype)|FukugouInfoT(?:ag|ype)|H(?:inshiT(?:ag|ype)|yokiT(?:ag|ype))|OnKunReadingT(?:ag|ype)|PhoneticT(?:ag|ype)|WeightT(?:ag|ype)|YomiT(?:ag|ype))|ProhibitListing|Re(?:ad(?:OnlyDictionary|WriteDictionary)|quiredFieldMask)|SpecificDictionaryClass|UserDictionaryClass)|M(?:CantBlock|D(?:isplay(?:AlreadyInstalledErr|NotFoundErr)|riverNotDisplayMgrAwareErr)|FoundErr|GenErr|M(?:ainDisplayCannotMoveErr|irroring(?:Blocked|NotOn|OnAlready))|No(?:DeviceTableclothErr|tFoundErr)|SWNotInitializedErr|WrongNumberOfDisplays)|OSJapanese(?:PalmVariant|StandardVariant)|R(?:AudioFileNotSupportedErr|B(?:adLayoutErr|lock(?:Size(?:Audio|DVDData|Mode(?:1Data|2(?:Data|Form(?:1Data|2Data))))|Type(?:Audio|DVDData|Mode(?:1Data|2(?:Data|Form(?:1Data|2Data)))))|urn(?:MediaWriteFailureErr|NotAllowedErr|PowerCalibrationErr|UnderrunErr))|CDText(?:Encoding(?:ASCII|ISOLatin1Modified)|GenreCode(?:A(?:dultContemporary|lternativeRock)|C(?:hildrens|lassical|o(?:ntemporaryChristian|untry))|Dance|E(?:asyListening|rotic)|Folk|Gospel|HipHop|Jazz|Latin|Musical|NewAge|Oper(?:a|etta)|Pop|R(?:ap|eggae|hythmAndBlues|ock)|S(?:ound(?:Effects|track)|pokenWord)|Unknown|WorldMusic))|D(?:ata(?:Form(?:Audio|DVDData|Mode(?:1Data|2(?:Data|Form(?:1Data|2Data))))|ProductionErr)|evice(?:AccessErr|Bu(?:rnStrategyNotAvailableErr|syErr)|C(?:antWrite(?:CDTextErr|I(?:SRCErr|ndexPointsErr)|SCMSErr)|ommunicationErr)|InvalidErr|Not(?:ReadyErr|SupportedErr)|PreGapLengthNotValidErr)|oubleLayerL0(?:AlreadySpecifiedErr|DataZoneBlocksParamErr))|F(?:i(?:le(?:Fork(?:Data|Resource|Size(?:Actual|Estimate))|LocationConflictErr|M(?:essage(?:ForkSize|P(?:ostBurn|r(?:eBurn|oduceData))|Release|VerificationStarting)|odifiedDuringBurnErr)|system(?:Mask(?:Default|HFSPlus|ISO9660|Joliet|UDF)|sNotSupportedErr))|rstErr)|lag(?:NoMoreData|SubchannelDataRequested)|unctionNotSupportedErr)|In(?:ternalErr|validIndexPointsErr)|LinkType(?:FinderAlias|HardLink|SymbolicLink)|Media(?:BusyErr|InvalidErr|Not(?:BlankErr|ErasableErr|PresentErr|SupportedErr|WritableErr))|S(?:essionFormat(?:Audio|CD(?:I|XA)|DVDData|Mode1Data)|peedTestAlreadyRunningErr)|T(?:ooMany(?:NameConflictsErr|TracksForDVDErr)|rack(?:M(?:essage(?:EstimateLength|P(?:ostBurn|r(?:eBurn|oduce(?:Data|PreGap)))|Verif(?:ication(?:Done|Starting)|y(?:Data|PreGap)))|ode(?:1Data|2(?:Data|Form(?:1Data|2Data))|Audio|DVDData))|ReusedErr))|UserCanceledErr|VerificationFailedErr)|Sp(?:Con(?:firmSwitchWarning|text(?:AlreadyReservedErr|Not(?:FoundErr|ReservedErr)))|FrameRateNotReadyErr|In(?:ternalErr|valid(?:AttributesErr|ContextErr))|NotInitializedErr|S(?:tereoContextErr|ystemSWTooOldErr))|TP(?:AbortJobErr|HoldJobErr|StopQueueErr|T(?:hirdPartySupported|ryAgainErr))|ata(?:A(?:ccessKCEvent(?:Mask)?|lignmentException)|Br(?:eakpointException|owser(?:A(?:lwaysExtendSelection|ttribute(?:AutoHideScrollBars|ColumnViewResizeWindow|ListView(?:AlternatingRowColors|DrawColumnDividers)|None|ReserveGrowBoxSpace))|C(?:heckboxT(?:riState|ype)|lientPropertyFlags(?:Mask|Offset)|mdTogglesSelection|o(?:lumnView(?:PreviewProperty)?|nt(?:ainer(?:AliasIDProperty|Clos(?:ed|ing)|Is(?:ClosableProperty|Open(?:ableProperty)?|SortableProperty)|Opened|Sort(?:ed|ing))|entHit))|ustomType)|D(?:ateTime(?:DateOnly|Relative|SecondsToo|T(?:imeOnly|ype))|efaultPropertyFlags|oNotTruncateText|ragSelect)|Edit(?:Msg(?:C(?:lear|opy|ut)|Paste|Redo|SelectAll|Undo)|St(?:arted|opped))|I(?:con(?:AndTextType|Type)|tem(?:A(?:dded|nyState)|D(?:eselected|oubleClicked)|Is(?:ActiveProperty|ContainerProperty|DragTarget|EditableProperty|Select(?:ableProperty|ed))|No(?:Property|State)|ParentContainerProperty|Removed|Sel(?:ected|fIdentityProperty)|s(?:A(?:dd|ssign)|Remove|Toggle)))|L(?:atestC(?:allbacks|ustomCallbacks)|istView(?:AppendColumn|DefaultColumnFlags|LatestHeaderDesc|MovableColumn|NoGapForIconInHeaderButton|S(?:electionColumn|ortableColumn)|TypeSelectColumn)?)|Metric(?:CellContentInset|Disclosure(?:Column(?:EdgeInset|PerDepthGap)|TriangleAndContentGap)|IconAndTextGap|Last)|N(?:everEmptySelectionSet|o(?:DisjointSelection|Item|View|thingHit))|Order(?:Decreasing|Increasing|Undefined)|P(?:opupMenu(?:Buttonless|Type)|ro(?:gressBarType|perty(?:C(?:heckboxPart|ontentPart)|DisclosurePart|EnclosingPart|Flags(?:Mask|Offset)|I(?:conPart|s(?:Editable|Mutable))|ModificationFlags|ProgressBarPart|RelevanceRankPart|SliderPart|TextPart)))|Re(?:l(?:ativeDateTime|evanceRankType)|setSelection|veal(?:AndCenterInView|Only|WithoutSelecting))|S(?:elect(?:OnlyOne|ion(?:Anchor(?:Down|Left|Right|Up)|SetChanged))|lider(?:DownwardThumb|PlainThumb|Type|UpwardThumb)|topTracking)|T(?:a(?:bleView(?:FillHilite|LastColumn|MinimalHilite|SelectionColumn)|rgetChanged)|extType|runcateText(?:At(?:End|Start)|Middle))|U(?:niversalPropertyFlags(?:Mask)?|ser(?:StateChanged|ToggledContainer))|ViewSpecific(?:Flags(?:Mask|Offset)|PropertyFlags))))|e(?:c(?:o(?:mposeDiacriticsSelector|rativeBordersSelector)|ryptKCItemAttr)|epestColorScreen|fault(?:C(?:JKRomanSelector|MMSignature|hangedKCEvent(?:Mask)?|olorPicker(?:Height|Width))|LowerCaseSelector|UpperCaseSelector)|l(?:ayParam_(?:DelayTime|Feedback|LopassCutoff|WetDryMix)|ete(?:AliasIcon|CharCode|KCEvent(?:Mask)?))|s(?:criptionKCItemAttr|ign(?:ComplexityType|Level(?:1Selector|2Selector|3Selector|4Selector|5Selector))|ktop(?:FolderType|Icon(?:Resource)?|P(?:icturesFolderType|rinterAliasType)))|v(?:eloper(?:ApplicationsFolderType|DocsFolderType|FolderType|HelpFolderType)|ice(?:InitiatedWake|ToPCS)))|i(?:a(?:criticsType|gonalFractionsSelector|l(?:ectBundleResType|og(?:F(?:lags(?:HandleMovableModal|Use(?:Co(?:mpositing|ntrolHierarchy)|Theme(?:Background|Controls)))|ont(?:Add(?:FontSizeMask|ToMetaFontMask)|NoFontStyle|Use(?:AllMask|BackColorMask|F(?:aceMask|o(?:nt(?:Mask|NameMask)|reColorMask))|JustMask|ModeMask|SizeMask|ThemeFontIDMask)))|WindowKind))|mond(?:AnnotationSelector|CharCode|Unicode))|ctionar(?:iesFolderType|yFileType)|giHub(?:Blank(?:CD|DVD)|EventClass|MusicCD|PictureCD|VideoDVD)|ngbatsSelector|phthongLigaturesO(?:ffSelector|nSelector)|rectoryServices(?:FolderType|PlugInsFolderType)|s(?:p(?:atched(?:ParameterPhase|SelectorSize(?:Phase|Width))|lay(?:ExtensionsFolderType|Mode(?:A(?:cceleratorBackedFlag|lwaysShowFlag)|BuiltInFlag|DefaultFlag|InterlacedFlag|N(?:ativeFlag|everShowFlag|ot(?:GraphicsQualityFlag|PresetFlag|ResizeFlag))|RequiresPanFlag|S(?:afe(?:Flag|tyFlags)|imulscanFlag|tretchedFlag)|TelevisionFlag|Valid(?:F(?:lag|or(?:AirPlayFlag|HiResFlag|MirroringFlag))|ateAgainstDisplay))|ProductIDGeneric|SubPixel(?:Configuration(?:Delta|Quad|Stripe(?:Offset)?|Undefined)|Layout(?:BGR|QuadGB(?:L|R)|RGB|Undefined)|Shape(?:Elliptical|Oval|R(?:ectangular|ound)|Square|Undefined))|TextSelector|VendorIDUnknown))|tortionParam_(?:CubicTerm|De(?:c(?:ay|imation(?:Mix)?)|lay(?:Mix)?)|FinalMix|LinearTerm|PolynomialMix|R(?:ingMod(?:Balance|Freq(?:1|2)|Mix)|ounding)|S(?:oftClipGain|quaredTerm)))|therAlgorithm_(?:NoiseShaping|TPDF))|o(?:FolderActionEvent|NotActivateAnd(?:HandleClick|IgnoreClick)|cument(?:Window(?:Class|VariantCode)|ationFolderType|sFolder(?:Icon|Type))|main(?:LibraryFolderType|TopLevelFolderType)|nt(?:CreateFolder|FindAppBySignature|PassSelector)|wn(?:ArrowCharCode|loadsFolderType)|ze(?:Demand|Request|ToFullWakeUp|WakeUp))|r(?:a(?:g(?:Action(?:Al(?:ias|l)|Copy|Delete|Generic|Move|Nothing|Private)|Behavior(?:None|ZoomBackAnimation)|D(?:ark(?:Translucency|erTranslucency)|oNotScaleImage)|FlavorType(?:HFS|PromiseHFS)|HasLeftSenderWindow|InsideSender(?:Application|Window)|OpaqueTranslucency|P(?:romisedFlavor(?:FindFile)?|seudo(?:CreatorVolumeOrDirectory|FileType(?:Directory|Volume)))|Region(?:AndImage|Begin|Draw|End|Hide|Idle)|Standard(?:DropLocation(?:Trash|Unknown)|Translucency)|Tracking(?:Enter(?:Control|Handler|Window)|In(?:Control|Window)|Leave(?:Control|Handler|Window)))|w(?:Control(?:EntireControl|IndicatorOnly)|erWindowClass))|op(?:BoxFolderType|Folder(?:AliasType|Icon(?:Resource)?)|IconVariant))|uration(?:Forever|Immediate|Mi(?:crosecond|llisecond))|ynamic(?:RangeControlMode_(?:Heavy|Light|None)|sProcessorParam_(?:AttackTime|CompressionAmount|Expansion(?:Ratio|Threshold)|HeadRoom|InputAmplitude|MasterGain|OutputAmplitude|ReleaseTime|Threshold)))|E(?:A(?:CCESErr|DDR(?:INUSEErr|NOTAVAILErr)|GAINErr|LREADYErr)|B(?:AD(?:FErr|MSGErr)|USYErr)|C(?:ANCELErr|ONN(?:ABORTEDErr|RE(?:FUSEDErr|SETErr)))|DE(?:ADLKErr|STADDRREQErr)|EXISTErr|FAULTErr|HOST(?:DOWNErr|UNREACHErr)|I(?:N(?:PROGRESSErr|TRErr|VALErr)|OErr|SCONNErr)|M(?:SGSIZEErr|ailKCItemAttr)|N(?:ET(?:DOWNErr|RESETErr|UNREACHErr)|O(?:BUFSErr|D(?:ATAErr|EVErr)|ENTErr|M(?:EMErr|SGErr)|PROTOOPTErr|RSRCErr|S(?:RErr|TRErr)|T(?:CONNErr|SOCKErr|TYErr))|XIOErr)|OPNOTSUPPErr|P(?:ERMErr|IPEErr|ROTO(?:Err|NOSUPPORTErr|TYPEErr))|RANGEErr|S(?:HUTDOWNErr|OCKTNOSUPPORTErr|RCHErr)|T(?:IME(?:DOUTErr|Err)|OOMANYREFSErr)|UC_(?:CN_(?:BasicVariant|DOSVariant)|KR_(?:BasicVariant|DOSVariant))|WOULDBLOCKErr|dit(?:TextDialogItem|orsFolderType)|jectMediaIcon|n(?:crypt(?:KCItemAttr|Password)|d(?:CharCode|DateKCItemAttr|Of(?:Sentence|Word))|gravedTextSelector|ter(?:CharCode|Idle|Run|Standby))|scapeCharCode|ve(?:nt(?:A(?:ccessible(?:Get(?:All(?:A(?:ctionNames|ttributeNames)|ParameterizedAttributeNames)|ChildAtPoint|FocusedChild|NamedA(?:ctionDescription|ttribute))|IsNamedAttributeSettable|PerformNamedAction|SetNamedAttribute)|pp(?:A(?:ctiv(?:ated|eWindowChanged)|vailableWindowBoundsChanged)|Deactivated|F(?:ocus(?:Drawer|MenuBar|Next(?:DocumentWindow|FloatingWindow)|Toolbar)|rontSwitched)|GetDockTileMenu|Hidden|IsEventInInstantMouser|Launch(?:Notification|ed)|Quit|S(?:hown|ystemUIModeChanged)|Terminated|UpdateDockTile|earanceScrollBarVariantChanged|leEvent)|ttribute(?:Monitored|None|UserEvent))|C(?:l(?:ass(?:A(?:ccessibility|pp(?:earance|l(?:eEvent|ication)))|C(?:lockView|o(?:mmand|ntrol))|D(?:ataBrowser|elegate)|EPPC|Font|Gesture|HI(?:ComboBox|Object)|Ink|Keyboard|M(?:enu|ouse)|S(?:crollable|e(?:archField|rvice)|ystem)|T(?:SMDocumentAccess|ablet|ext(?:Field|Input)|oolbar(?:Item(?:View)?)?)|Volume|Window)|ockDateOrTimeChanged)|o(?:m(?:boBoxListItemSelected|mand(?:Process|UpdateStatus))|ntrol(?:A(?:ctivate|ddedSubControl|pplyTextColor)|BoundsChanged|C(?:lick|ontextualMenuClick)|D(?:eactivate|ispose|ra(?:g(?:Enter|Leave|Receive|Within)|w))|EnabledStateChanged|FocusPartChanged|G(?:et(?:A(?:ctionProcPart|utoToggleValue)|ClickActivation|Data|F(?:ocusPart|rameMetrics)|IndicatorDragConstraint|NextFocusCandidate|OptimalBounds|Part(?:Bounds|Region)|S(?:crollToHereStartPoint|izeConstraints|ubviewForMouseEvent))|hostingFinished)|Hi(?:liteChanged|t(?:Test)?)|In(?:dicatorMoved|itialize|terceptSubviewClick|validateForSizeChange)|LayoutInfoChanged|O(?:ptimalBoundsChanged|wningWindowChanged)|RemovingSubControl|S(?:et(?:Cursor|Data|FocusPart)|imulateHit)|T(?:itleChanged|rack(?:ingAreaE(?:ntered|xited))?)|V(?:alueFieldChanged|isibilityChanged))))|D(?:ataBrowserDrawCustomItem|elegate(?:Get(?:GroupClasses|TargetClasses)|I(?:nstalled|sGroup)|Removed))|Font(?:PanelClosed|Selection)|Ge(?:sture(?:Ended|Magnify|Rotate|S(?:tarted|wipe))|tSelectedText)|H(?:IObject(?:C(?:onstruct|reatedFromArchive)|Destruct|Encode|GetInitParameters|I(?:nitialize|sEqual)|PrintDebugInfo)|ighLevelEvent|otKey(?:Exclusive|NoOptions|Pressed|Released))|Ink(?:Gesture|Point|Text)|KeyModifier(?:Fn(?:Bit|Mask)|NumLock(?:Bit|Mask))|L(?:eaveInQueue|oopIdleTimer(?:Idling|St(?:arted|opped)))|M(?:enu(?:B(?:ar(?:Hidden|Shown)|e(?:comeScrollable|ginTracking))|C(?:alculateSize|easeToBeScrollable|hangeTrackingMode|losed|reateFrameView)|D(?:ispose|rawItem(?:Content)?)|En(?:ableItems|dTracking)|GetFrameBounds|M(?:atchKey|easureItem(?:Height|Width))|Opening|Populate|TargetItem)|ouse(?:Button(?:Primary|Secondary|Tertiary)|D(?:own|ragged)|E(?:ntered|xited)|Moved|Scroll|Up|Wheel(?:Axis(?:X|Y)|Moved)))|OffsetToPos|P(?:aram(?:A(?:EEvent(?:Class|ID)|TSUFont(?:ID|Size)|ccessib(?:ilityEventQueued|le(?:A(?:ction(?:Description|Name(?:s)?)|ttribute(?:Name(?:s)?|Parameter|Settable|Value))|Child|Object))|fterDelegates|ppleEvent(?:Reply)?|ttributes|vailableBounds)|B(?:eforeDelegates|ounds)|C(?:G(?:ContextRef|ImageRef)|TFontDescriptor|andidateText|lick(?:Activation|Count)|o(?:mboBoxListSelectedItemIndex|ntrol(?:Action|C(?:lickActivationResult|urrent(?:OwningWindow|Part))|D(?:ata(?:Buffer(?:Size)?|Tag)|raw(?:Depth|Engraved|InColor))|F(?:eatures|ocusEverything|rameMetrics)|Hit|I(?:n(?:dicator(?:DragConstraint|Offset|Region)|valRgn)|sGhosting)|Message|O(?:ptimalB(?:aselineOffset|ounds)|riginalOwningWindow)|P(?:ar(?:am|t(?:AutoRepeats|Bounds)?)|re(?:fersShape|viousPart))|Re(?:f|gion|sult)|Sub(?:Control|view)|Value|WouldAcceptDrop))|urrent(?:Bounds|Dock(?:Device|Rect)|MenuTrackingMode|Window))|D(?:ataBrowser(?:Item(?:ID|State)|PropertyID)|e(?:codingForEditor|legate(?:Group(?:Classes|Parameters)|Target(?:Classes)?)|vice(?:Color|Depth))|i(?:ctionary|mensions|rect(?:Object|ionInverted)|splay(?:ChangeFlags|Device))|ragRef)|E(?:nable(?:MenuForKeyEvent|d)|ventRef)|F(?:MFont(?:Family|S(?:ize|tyle))|ontColor)|G(?:Device|rafPort)|HI(?:Archive|Command|ObjectInstance|ViewTrackingArea)|I(?:mageSize|n(?:dex|it(?:Collection|Parameters)|k(?:Gesture(?:Bounds|Hotspot|Kind)|KeyboardShortcut|TextRef))|sInInstantMouser)|Key(?:Code|M(?:acCharCodes|odifiers)|Unicodes|boardType)|L(?:aunch(?:Err|RefCon)|ineSize)|M(?:a(?:gnificationAmount|ximumSize)|enu(?:Co(?:mmand(?:KeyBounds)?|ntext(?:Height)?)|D(?:i(?:rection|smissed)|rawState)|EventOptions|F(?:irstOpen|rameView)|I(?:conBounds|sPopup|tem(?:Bounds|Height|Index|Type|Width))|MarkBounds|PopupItem|Ref|T(?:extB(?:aseline|ounds)|ype)|Virtual(?:Bottom|Top))|inimumSize|o(?:dal(?:ClickResult|Window)|use(?:Button|Chord|Delta|Location|TrackingRef|Wheel(?:Axis|Delta|Smooth(?:HorizontalDelta|VerticalDelta))))|utableArray)|Ne(?:w(?:MenuTrackingMode|ScrollBarVariant)|xtControl)|Origin(?:alBounds)?|P(?:a(?:rentMenu(?:Item)?|steboardRef)|ost(?:Options|Target)|r(?:evious(?:Bounds|Dock(?:Device|Rect)|Window)|ocessID))|R(?:e(?:ason|placementText|sult)|gnHandle|otationAmount)|S(?:crapRef|ervice(?:CopyTypes|MessageName|PasteTypes|UserData)|hape|tartControl|wipeDirection|ystemUI(?:Mode|Options))|T(?:SM(?:DocAccess(?:BaselineDelta|CharacterCount|EffectiveRange|L(?:ineBounds|ockCount)|Re(?:ply(?:ATS(?:Font|UGlyphSelector)|C(?:T(?:FontRef|GlyphInfoRef)|haracter(?:Range|sPtr))|FontSize)|questedCharacterAttributes)|Send(?:C(?:haracter(?:Index|Range|sPtr)|omponentInstance)|RefCon))|Send(?:ComponentInstance|RefCon))|ablet(?:EventType|P(?:oint(?:Rec|erRec)|roximityRec))|ext(?:Input(?:GlyphInfoArray|Reply(?:A(?:TSFont|ttributedString)|CTFontRef|F(?:MFont|ont)|GlyphInfoArray|L(?:eadingEdge|ine(?:Ascent|Height))|MacEncoding|Point(?:Size)?|RegionClass|S(?:LRec|howHide)|Text(?:Angle|Offset)?)|Send(?:AttributedString|C(?:lauseRng|omponentInstance|urrentPoint)|DraggingMode|FixLen|GlyphInfoArray|HiliteRng|KeyboardEvent|LeadingEdge|MouseEvent|PinRng|Re(?:fCon|placeRange)|S(?:LRec|howHide)|Text(?:Offset|Service(?:Encoding|MacEncoding))?|UpdateRng))|Length|Selection)|oolbar(?:Display(?:Mode|Size)|Item(?:ConfigData|Identifier)?)?|ransactionID)|U(?:nconfirmed(?:Range|Text)|serData)|View(?:AttributesDictionary|Size)|Window(?:ContentBounds|D(?:efPart|ragHiliteFlag)|Features|GrowRect|Mo(?:d(?:ality|ifiedFlag)|useLocation)|P(?:artCode|roxy(?:GWorldPtr|ImageRgn|OutlineRgn))|Re(?:f|gionCode)|StateChangedFlags|T(?:itle(?:FullWidth|TextWidth)|ransition(?:Action|Effect))))|osToOffset|r(?:iority(?:High|Low|Standard)|ocessCommand))|QueueOptionsNone|R(?:awKey(?:Down|ModifiersChanged|Repeat|Up)|emoveFromQueue)|S(?:crollable(?:GetInfo|InfoChanged|ScrollTo)|e(?:archField(?:CancelClicked|SearchClicked)|rvice(?:Copy|GetTypes|P(?:aste|erform)))|howHideBottomWindow|ystem(?:Display(?:Reconfigured|sA(?:sleep|wake))|TimeDateChanged|UserSession(?:Activated|Deactivated)))|T(?:SMDocumentAccess(?:Get(?:Characters(?:Ptr(?:ForLargestBuffer)?)?|F(?:irstRectForRange|ont)|GlyphInfo|Length|SelectedRange)|LockDocument|UnlockDocument)|a(?:bletP(?:oint(?:er)?|roximity)|rget(?:DontPropagate|SendToAllHandlers))|ext(?:Accepted|DidChange|Input(?:FilterText|GetSelectedText|IsMouseEventInInlineInputArea|OffsetToPos|PosToOffset|ShowHideBottomWindow|U(?:nicode(?:ForKeyEvent|Text)|pdateActiveInputArea))|ShouldChangeInRange)|oolbar(?:BeginMultiChange|CreateItem(?:FromDrag|WithIdentifier)|Display(?:ModeChanged|SizeChanged)|EndMultiChange|Get(?:AllowedIdentifiers|DefaultIdentifiers|SelectableIdentifiers)|Item(?:A(?:cceptDrop|dded)|C(?:ommandIDChanged|reateCustomView)|EnabledStateChanged|GetPersistentData|HelpTextChanged|ImageChanged|LabelChanged|PerformAction|Removed|SelectedStateChanged|View(?:ConfigFor(?:Mode|Size)|E(?:nterConfigMode|xitConfigMode))|WouldAcceptDrop)|LayoutChanged))|U(?:nicodeForKeyEvent|pdateActiveInputArea)|Volume(?:Mounted|Unmounted)|Window(?:A(?:ctivated|ttributesChanged)|BoundsChang(?:ed|ing)|C(?:lose(?:All|d)?|o(?:l(?:laps(?:e(?:All|d)?|ing)|orSpaceChanged)|n(?:strain|textualMenuSelect))|ursorChange)|D(?:e(?:activated|f(?:D(?:ispose|ra(?:gHilite|w(?:Frame|GrowBox|Part)))|Get(?:GrowImageRegion|Region)|HitTest|Init|M(?:easureTitle|odified)|S(?:etupProxyDragImage|tateChanged)))|ispose|ra(?:g(?:Completed|Hilite|Started)|w(?:Frame|GrowBox|Part|er(?:Clos(?:ed|ing)|Open(?:ed|ing)))))|Expand(?:All|ed|ing)?|F(?:ocus(?:Acquired|Content|Drawer|Lost|Re(?:linquish|stored)|Toolbar)|ullScreenE(?:nter(?:Completed|Started)|xit(?:Completed|Started)))|Get(?:Click(?:Activation|Modality)|DockTileMenu|FullScreenContentSize|GrowImageRegion|IdealS(?:ize|tandardState)|M(?:aximumSize|inimumSize)|Region)|H(?:andle(?:Activate|Deactivate)|i(?:d(?:den|ing)|tTest))|Init|M(?:easureTitle|odified)|P(?:a(?:int|thSelect)|roxy(?:BeginDrag|EndDrag))|Res(?:ize(?:Completed|Started)|tore(?:FromDock|dAfterRelaunch))|S(?:etupProxyDragImage|h(?:eet(?:Clos(?:ed|ing)|Open(?:ed|ing))|ow(?:ing|n))|tateChanged)|T(?:itleChanged|oolbarSwitchMode|ransition(?:Completed|Started))|UpdateDockTile|Zoom(?:All|ed)?))|ryKCEventMask)|x(?:actMatchThread|cludedMemoryException|itIdle|p(?:ertCharactersSelector|o(?:nentsO(?:ffSelector|nSelector)|rtedFolderAliasType))|t(?:AudioFile(?:Error_(?:AsyncWrite(?:BufferOverflow|TooLarge)|Invalid(?:ChannelMap|DataFormat|OperationOrder|Property(?:Size)?|Seek)|MaxPacketSizeUnknown|NonPCMClientFormat)|Property_(?:Audio(?:Converter|File)|C(?:lient(?:ChannelLayout|DataFormat|MaxPacketSize)|o(?:decManufacturer|nverterConfig))|File(?:ChannelLayout|DataFormat|LengthFrames|MaxPacketSize)|IOBuffer(?:SizeBytes)?|PacketTable))|en(?:dedFlag(?:Has(?:CustomBadge|RoutingInfo)|ObjectIsBusy|sAreInvalid)|sion(?:DisabledFolderType|Folder(?:AliasType|Type)|s(?:DisabledFolderIcon|FolderIcon(?:Resource)?))))))|F(?:A(?:AttachCommand|EditCommand|FileParam|IndexParam|RemoveCommand|S(?:erverApp|uiteCode))|BC(?:a(?:ccess(?:Canceled|orStoreFailed)|ddDocFailed|llocFailed|nalysisNotAvailable)|bad(?:IndexFile(?:Version)?|Param|SearchSession)|com(?:mitFailed|pactionFailed)|deletionFailed|f(?:ileNotIndexed|lushFailed)|i(?:llegalSessionChange|ndex(?:CreationFailed|DiskIOFailed|FileDestroyed|Not(?:Available|Found)|ing(?:Canceled|Failed)))|m(?:ergingFailed|oveFailed)|no(?:IndexesFound|S(?:earchSession|uchHit))|s(?:earchFailed|omeFilesNotIndexed|ummarizationCanceled)|tokenizationFailed|v(?:TwinExceptionErr|alidationFailed))|M(?:CurrentFilterFormat|Font(?:C(?:allbackFilterSelector|ontainer(?:AccessErr|FilterSelector))|DirectoryFilterSelector|F(?:amilyCallbackFilterSelector|ileRefFilterSelector)|T(?:ableAccessErr|echnologyFilterSelector))|GenerationFilterSelector|I(?:nvalidFont(?:Err|FamilyErr)|teration(?:Completed|ScopeModifiedErr))|PostScriptFontTechnology|TrueTypeFontTechnology)|N(?:DirectoryModifiedMessage|No(?:ImplicitAllSubscription|tifyInBackground)|S(?:Bad(?:FlattenedSizeErr|ProfileVersionErr|ReferenceVersionErr)|DuplicateReferenceErr|In(?:sufficientDataErr|valid(?:ProfileErr|ReferenceErr))|MismatchErr|NameNotFoundErr))|PUNotNeeded|S(?:Al(?:iasInfo(?:F(?:SInfo|inderInfo)|I(?:Ds|sDirectory)|None|TargetCreateDate|Volume(?:CreateDate|Flags))|lo(?:c(?:AllOrNothingMask|ContiguousMask|DefaultFlags|NoRoundUpMask|ReservedMask)|wConcurrentAsyncIO(?:Bit|Mask)))|CatInfo(?:A(?:ccessDate|llDates|ttrMod)|BackupDate|C(?:ontentMod|reateDate)|DataSizes|F(?:SFileSecurityRef|inder(?:Info|XInfo))|GettableInfo|No(?:de(?:Flags|ID)|ne)|P(?:arentDirID|ermissions)|R(?:eserved|srcSizes)|S(?:et(?:Ownership|tableInfo)|haringFlags)|TextEncoding|User(?:Access|Privs)|V(?:alence|olume))|E(?:jectVolumeForceEject|ventStream(?:CreateFlag(?:FileEvents|IgnoreSelf|No(?:Defer|ne)|UseCFTypes|WatchRoot)|Event(?:Flag(?:EventIdsWrapped|HistoryDone|Item(?:C(?:hangeOwner|reated)|FinderInfoMod|I(?:nodeMetaMod|s(?:Dir|File|Symlink))|Modified|Re(?:moved|named)|XattrMod)|KernelDropped|M(?:ount|ustScanSubDirs)|None|RootChanged|U(?:nmount|serDropped))|IdSinceNow)))|F(?:ileOperation(?:D(?:efaultOptions|oNotMoveAcrossVolumes)|Overwrite|Skip(?:Preflight|SourcePermissionErrors))|orceRead(?:Bit|Mask))|I(?:nvalidVolumeRefNum|terate(?:Delete|Flat|Reserved|Subtree))|KMountVersion|MountServer(?:M(?:arkDoNotDisplay|ount(?:OnMountDir|WithoutNotification))|SuppressConnectionUI)|N(?:ewLine(?:Bit|CharMask|Mask)|o(?:Cache(?:Bit|Mask)|de(?:CopyProtect(?:Bit|Mask)|DataOpen(?:Bit|Mask)|ForkOpen(?:Bit|Mask)|HardLink(?:Bit|Mask)|I(?:nShared(?:Bit|Mask)|s(?:Directory(?:Bit|Mask)|Mounted(?:Bit|Mask)|SharePoint(?:Bit|Mask)))|Locked(?:Bit|Mask)|ResOpen(?:Bit|Mask))))|OperationStage(?:Complete|Preflighting|Running|Undefined)|P(?:athMakeRefD(?:efaultOptions|oNotFollowLeafSymlink)|leaseCache(?:Bit|Mask))|R(?:dVerify(?:Bit|Mask)|eplaceObject(?:D(?:efaultOptions|oNotCheckObjectWriteAccess)|PreservePermissionInfo|Replace(?:Metadata|PermissionInfo)|SaveOriginalAsABackup))|UnmountVolumeForceUnmount|Vol(?:Flag(?:DefaultVolume(?:Bit|Mask)|FilesOpen(?:Bit|Mask)|HardwareLocked(?:Bit|Mask)|JournalingActive(?:Bit|Mask)|SoftwareLocked(?:Bit|Mask))|Info(?:B(?:ackupDate|locks)|C(?:heckedDate|reateDate)|D(?:ataClump|irCount|riveInfo)|F(?:SInfo|i(?:leCount|nderInfo)|lags)|GettableInfo|ModDate|N(?:ext(?:Alloc|ID)|one)|RsrcClump|S(?:ettableInfo|izes))))|TPServerIcon|avorite(?:ItemsIcon|sFolder(?:Icon|Type))|e(?:male|tchReference)|i(?:l(?:eSystemSupportFolderType|lScreen)|nd(?:ByContent(?:FolderType|IndexesFolderType|PluginsFolderType)|SupportFolderType|erIcon)|rst(?:FailKCStopOn|IOKitNotificationType|MagicBusyFiletype|PassKCStopOn)|tToScreen)|l(?:avorType(?:Clipping(?:Filename|Name)|DragToTrashOnly|FinderNoTrackingBehavior|UnicodeClipping(?:Filename|Name))|euronsSelector|o(?:ating(?:PointException|Window(?:Class|Definition))|ppyIconResource))|o(?:lder(?:Action(?:Code|sFolderType)|C(?:losedEvent|reated(?:AdminPrivs(?:Bit)?|Invisible(?:Bit)?|NameLocked(?:Bit)?))|I(?:n(?:LocalOrRemoteUserFolder|RemoteUserFolderIfAvailable(?:Bit)?|UserFolder(?:Bit)?)|tems(?:AddedEvent|RemovedEvent))|M(?:anager(?:FolderInMacOS9FolderIfMacOSXIsInstalled(?:Bit|Mask)|LastDomain|N(?:ewlyCreatedFolder(?:IsLocalizedBit|ShouldHaveDotLocalizedCreatedWithinMask)|otCreatedOnRemoteVolumes(?:Bit|Mask)))|ustStayOnSameVolume(?:Bit)?)|NeverMatchedInIdentifyFolder(?:Bit)?|OpenedEvent|TrackedByAlias(?:Bit)?|WindowMovedEvent)|nt(?:A(?:lbanianLanguage|mharic(?:Language|Script)|r(?:abic(?:Language|Script)|menian(?:Language|Script))|ssameseLanguage|ymaraLanguage|zerbaijan(?:ArLanguage|iLanguage))|B(?:asqueLanguage|engali(?:Language|Script)|u(?:lgarianLanguage|rmese(?:Language|Script))|yelorussianLanguage)|C(?:atalanLanguage|h(?:ewaLanguage|ineseScript)|o(?:llectionsFolderType|pyrightName)|roatianLanguage|ustom(?:16BitScript|8(?:16BitScript|BitScript)|Platform)|yrillicScript|zechLanguage)|D(?:anishLanguage|e(?:s(?:criptionName|igner(?:Name|URLName))|vanagariScript)|utchLanguage|zongkhaLanguage)|E(?:astEuropeanRomanScript|nglishLanguage|s(?:perantoLanguage|tonianLanguage)|thiopicScript|xtendedArabicScript)|F(?:a(?:eroeseLanguage|milyName|rsiLanguage)|innishLanguage|lemishLanguage|renchLanguage|ullName)|G(?:allaLanguage|e(?:ezScript|orgian(?:Language|Script)|rmanLanguage)|reek(?:Language|Script)|u(?:araniLanguage|jarati(?:Language|Script)|rmukhiScript))|H(?:ebrew(?:Language|Script)|indiLanguage|ungarianLanguage)|I(?:SO10646_1993Semantics|celandicLanguage|ndonesianLanguage|rishLanguage|talianLanguage)|Ja(?:panese(?:Language|Script)|vaneseRomLanguage)|K(?:a(?:nnada(?:Language|Script)|shmiriLanguage|zakhLanguage)|hmer(?:Language|Script)|irghizLanguage|orean(?:Language|Script)|urdishLanguage)|L(?:a(?:o(?:Language|tianScript)|ppishLanguage|stReservedName|t(?:inLanguage|vianLanguage))|ettishLanguage|i(?:cense(?:DescriptionName|InfoURLName)|thuanianLanguage))|M(?:a(?:c(?:CompatibleFullName|edonianLanguage|intoshPlatform)|l(?:a(?:gasyLanguage|y(?:ArabicLanguage|RomanLanguage|alam(?:Language|Script)))|teseLanguage)|nufacturerName|rathiLanguage)|icrosoft(?:Platform|S(?:tandardScript|ymbolScript)|UCS4Script)|o(?:ldavianLanguage|ngolian(?:CyrLanguage|Language|Script)))|N(?:epaliLanguage|o(?:Language(?:Code)?|Name(?:Code)?|Platform(?:Code)?|Script(?:Code)?|rwegianLanguage))|Or(?:iya(?:Language|Script)|omoLanguage)|P(?:ashtoLanguage|ersianLanguage|o(?:lishLanguage|rtugueseLanguage|st(?:ScriptCIDName|scriptName))|referred(?:FamilyName|SubfamilyName)|unjabiLanguage)|QuechuaLanguage|R(?:SymbolScript|eservedPlatform|oman(?:Script|ianLanguage)|u(?:andaLanguage|ndiLanguage|ssian(?:Language)?))|S(?:a(?:amiskLanguage|mpleTextName|nskritLanguage)|e(?:lection(?:ATSUIType|CoreTextType|QD(?:StyleVersionZero|Type))|rbianLanguage)|i(?:mp(?:ChineseLanguage|leChineseScript)|n(?:dhi(?:Language|Script)|halese(?:Language|Script)))|l(?:avicScript|ov(?:akLanguage|enianLanguage))|omaliLanguage|panishLanguage|tyleName|u(?:itcaseIcon|ndaneseRomLanguage)|w(?:ahiliLanguage|edishLanguage))|T(?:a(?:galogLanguage|jikiLanguage|mil(?:Language|Script)|tarLanguage)|elugu(?:Language|Script)|hai(?:Language|Script)|i(?:betan(?:Language|Script)|grinyaLanguage)|rad(?:ChineseLanguage|emarkName|itionalChineseScript)|urk(?:ishLanguage|menLanguage))|U(?:ighurLanguage|krainianLanguage|ni(?:code(?:DefaultSemantics|Platform|V(?:1_1Semantics|2_0(?:BMPOnlySemantics|FullCoverageSemantics)|4_0VariationSequenceSemantics)|_FullRepertoire)|nterpretedScript|queName)|rduLanguage|zbekLanguage)|V(?:e(?:ndorURLName|rsionName)|ietnamese(?:Language|Script))|WelshLanguage|YiddishLanguage|sFolder(?:Icon(?:Resource)?|Type))|r(?:kInfoFlags(?:FileLocked(?:Bit|Mask)|LargeFile(?:Bit|Mask)|Modified(?:Bit|Mask)|OwnClump(?:Bit|Mask)|Resource(?:Bit|Mask)|SharedWrite(?:Bit|Mask)|Write(?:Bit|Locked(?:Bit|Mask)|Mask))|m(?:FeedCharCode|InterrobangO(?:ffSelector|nSelector))|wardArrowIcon)|urByteCode)|ra(?:ctionsType|gment(?:IsPrepared|NeedsPreparing)|me(?:buffer(?:DisableAltivecAccess|Supports(?:CopybackCache|GammaCorrection|WritethruCache))|worksFolderType))|u(?:ll(?:TrashIcon(?:Resource)?|Width(?:CJKRomanSelector|IdeographsSelector|KanaSelector))|nctionKeyCharCode))|G(?:SSSelect(?:Ge(?:nericToRealID|t(?:DefaultScriptingComponent|ScriptingComponent(?:FromStored)?))|OutOfRange|RealToGenericID|SetDefaultScriptingComponent)|UARD_EXC_(?:DE(?:ALLOC_GAP|STROY)|I(?:MMOVABLE|N(?:CORRECT_GUARD|VALID_(?:ARGUMENT|NAME|RIGHT|VALUE)))|KERN_(?:FAILURE|NO_SPACE|RESOURCE)|MOD_REFS|R(?:CV_(?:GUARDED_DESC|INVALID_NAME)|IGHT_EXISTS)|S(?:E(?:ND_INVALID_(?:R(?:EPLY|IGHT)|VOUCHER)|T_CONTEXT)|TRICT_REPLY)|UNGUARDED)|e(?:n(?:EditorsFolderType|er(?:alFailureErr|ic(?:ApplicationIcon(?:Resource)?|C(?:DROMIcon(?:Resource)?|o(?:mponent(?:Icon|Version)|ntrol(?:PanelIcon|StripModuleIcon)))|D(?:eskAccessoryIcon(?:Resource)?|ocumentIcon(?:Resource)?)|E(?:ditionFileIcon(?:Resource)?|xtensionIcon(?:Resource)?)|F(?:ileServerIcon(?:Resource)?|loppyIcon|o(?:lderIcon(?:Resource)?|nt(?:Icon|ScalerIcon)))|HardDiskIcon(?:Resource)?|IDiskIcon|KCItemAttr|MoverObjectIcon(?:Resource)?|NetworkIcon|P(?:CCardIcon|asswordKCItemClass|referencesIcon(?:Resource)?)|QueryDocumentIcon(?:Resource)?|R(?:AMDiskIcon(?:Resource)?|emovableMediaIcon)|S(?:haredLibaryIcon|tationeryIcon(?:Resource)?|uitcaseIcon(?:Resource)?)|URLIcon|W(?:ORMIcon|indowIcon))))|t(?:AE(?:TE|UT)|DebugOption|Power(?:Info|Level)|SelectedText|WakeOnNetInfo))|lyphCollection(?:Adobe(?:CNS1|GB1|Japan(?:1|2)|Korea1)|GID|Unspecified)|r(?:aphicEQParam_NumberOfBands|idIcon|oup(?:I(?:D2Name|con)|Name2ID))|uestUserIcon)|H(?:ALOutputParam_Volume|FS(?:A(?:llocationFileID|ttribute(?:DataFileID|sFileID)|utoCandidate(?:Bit|Mask))|B(?:adBlockFileID|inaryCompare|o(?:gusExtentFileID|otVolumeInconsistent(?:Bit|Mask)))|C(?:a(?:seFolding|talog(?:FileID|KeyM(?:aximumLength|inimumLength)|NodeIDsReused(?:Bit|Mask)))|ontentProtection(?:Bit|Mask))|DoNotFastDevPin(?:Bit|Mask)|Extent(?:Density|KeyMaximumLength|sFileID)|F(?:astDev(?:Candidate(?:Bit|Mask)|Pinned(?:Bit|Mask))|i(?:le(?:Locked(?:Bit|Mask)|Record|ThreadRecord)|rstUserCatalogNodeID)|older(?:Record|ThreadRecord))|Has(?:Attributes(?:Bit|Mask)|ChildLink(?:Bit|Mask)|DateAdded(?:Bit|Mask)|FolderCount(?:Bit|Mask)|LinkChain(?:Bit|Mask)|Security(?:Bit|Mask))|JMountVersion|M(?:DBAttributesMask|ax(?:AttrNameLen|FileNameChars|VolumeNameChars))|Plus(?:Attr(?:Extents|ForkData|InlineData|MinNodeSize)|C(?:atalog(?:KeyM(?:aximumLength|inimumLength)|MinNodeSize)|reator)|Extent(?:Density|KeyMaximumLength|MinNodeSize)|F(?:ile(?:Record|ThreadRecord)|older(?:Record|ThreadRecord))|M(?:axFileNameChars|ountVersion)|SigWord|Version)|R(?:epairCatalogFileID|oot(?:FolderID|ParentID))|S(?:igWord|tartupFileID)|ThreadExists(?:Bit|Mask)|UnusedNode(?:Fix(?:Bit|Mask)|sFixDate)|Volume(?:HardwareLock(?:Bit|Mask)|Inconsistent(?:Bit|Mask)|Journaled(?:Bit|Mask)|NoCacheRequired(?:Bit|Mask)|S(?:oftwareLock(?:Bit|Mask)|paredBlocks(?:Bit|Mask))|Unmounted(?:Bit|Mask))|X(?:SigWord|Version))|I(?:ArchiveDecod(?:eSuperclassForUnregisteredObjects|ingForEditor)|C(?:lassOptionSingleton|o(?:m(?:boBox(?:Auto(?:CompletionAttribute|DisclosureAttribute|S(?:izeListAttribute|ortAttribute))|DisclosurePart|EditTextPart|List(?:Pixel(?:HeightTag|WidthTag)|Tag)|N(?:oAttributes|umVisibleItemsTag)|StandardAttributes)|mand(?:A(?:bout|ppHelp|rrangeInFront)|BringAllToFront|C(?:ancel|h(?:angeSpelling|eckSpelling(?:AsYouType)?)|l(?:ear|ose(?:All|File)?)|opy|u(?:stomizeToolbar|t)|ycleToolbarMode(?:Larger|Smaller))|From(?:Control|Menu|Window)|Hide(?:Others|Toolbar)?|IgnoreSpelling|LearnWord|M(?:aximize(?:All|Window)|inimize(?:All|Window))|New|O(?:K|pen|ther)|P(?:a(?:geSetup|ste)|r(?:eferences|int))|Quit(?:And(?:DiscardWindows|KeepWindows))?|R(?:e(?:do|vert)|otate(?:FloatingWindows(?:Backward|Forward)|Windows(?:Backward|Forward)))|S(?:ave(?:As)?|elect(?:All|Window)|how(?:All|CharacterPalette|HideFontPanel|SpellingPanel|Toolbar)|tartDictation)|Toggle(?:AllToolbars|FullScreen|Toolbar)|Undo|WindowList(?:Separator|Terminator)|ZoomWindow))|ordSpace(?:72DPIGlobal|ScreenPixel|View|Window)))|D(?:B(?:a(?:d(?:Log(?:PhysValuesErr|icalM(?:aximumErr|inimumErr))|ParameterErr)|seError)|ufferTooSmallErr)|DeviceNotReady|EndOfDescriptorErr|In(?:compatibleReportErr|v(?:alid(?:PreparsedDataErr|R(?:angePageErr|eport(?:LengthErr|TypeErr)))|erted(?:LogicalRangeErr|PhysicalRangeErr|UsageRangeErr)))|N(?:ot(?:EnoughMemoryErr|ValueArrayErr)|ull(?:PointerErr|StateErr))|Report(?:CountZeroErr|IDZeroErr|SizeZeroErr)|Success|U(?:nmatched(?:DesignatorRangeErr|StringRangeErr|UsageRangeErr)|sage(?:NotFoundErr|PageZeroErr))|V(?:alueOutOfRangeErr|ersionIncompatibleErr)|elegate(?:A(?:fter|ll)|Before))|HotKeyModeAll(?:Disabled(?:ExceptUniversalAccess)?|Enabled)|ImageView(?:AutoTransform(?:None|OnD(?:eactivate|isable))|ImageTag)|Layout(?:Bind(?:Bottom|Left|M(?:ax|in)|None|Right|Top)|InfoVersionZero|Position(?:Bottom|Center|Left|M(?:ax|in)|None|Right|Top)|ScaleAbsolute)|M(?:enu(?:AppendItem|CenterDirection|DismissedBy(?:A(?:ctivationChange|ppSwitch)|CancelMenuTracking|FocusChange|KeyEvent|Mouse(?:Down|Up)|Selection|Timeout|UserCancel)|LeftDirection|RightDirection)|odalClick(?:A(?:llowEvent|nnounce)|IsModal|RaiseWindow))|S(?:crollView(?:Options(?:AllowGrow|DisableSmoothScrolling|FillGrowArea|HorizScroll|VertScroll)|Page(?:Down|Left|Right|Up)|ScrollTo(?:Bottom|Left|Right|Top)|ValidOptions)|e(?:archField(?:Attributes(?:Cancel|SearchIcon)|NoAttributes)|gment(?:Behavior(?:Momentary|Radio|Sticky|Toggles)|NoAttributes|SendCmdToUserFocus|edViewKind))|hape(?:Enumerate(?:Init|Rect|Terminate)|ParseFrom(?:Bottom(?:Right)?|Left|Right|Top(?:Left)?)))|T(?:heme(?:F(?:ocusRing(?:Above|Below|Only)|rame(?:ListBox|TextField(?:Round(?:Mini|Small)?|Square)))|Gro(?:upBoxKind(?:Primary(?:Opaque)?|Secondary(?:Opaque)?)|wBox(?:KindNo(?:ne|rmal)|Size(?:Normal|Small)))|HeaderKind(?:List|Window)|Menu(?:DrawInfoVersion(?:One|Zero)|TitleDrawCondensed)|Orientation(?:Inverted|Normal)|S(?:egment(?:Adornment(?:Focus|LeadingSeparator|None|TrailingSeparator)|Kind(?:Inset|Normal|Textured)|Position(?:First|Last|Middle|Only)|Size(?:Mini|Normal|Small))|plitterAdornment(?:Metal|None))|T(?:ab(?:Adornment(?:Focus|LeadingSeparator|None|TrailingSeparator)|KindNormal|P(?:aneAdornmentNormal|osition(?:First|Last|Middle|Only))|Size(?:Mini|Normal|Small))|ext(?:BoxOption(?:DontClip|Engraved|None|StronglyVertical)|HorizontalFlush(?:Center|Default|Left|Right)|InfoVersion(?:One|Zero)|Truncation(?:Default|End|Middle|None)|VerticalFlush(?:Bottom|Center|Default|Top))))|oolbar(?:AutoSavesConfig|CommandPressAction|Display(?:Mode(?:Default|Icon(?:AndLabel|Only)|LabelOnly)|Size(?:Default|Normal|Small))|I(?:sConfigurable|tem(?:A(?:llowDuplicates|nchoredLeft)|CantBeRemoved|Disabled|IsSeparator|LabelDisabled|MutableAttrs|NoAttributes|Se(?:lected|ndCmdToUserFocus)|ValidAttrs))|NoAttributes|V(?:alidAttrs|iewDrawBackgroundTag))|ransform(?:Disabled|None|Selected))|View(?:A(?:llowsSubviews|ttribute(?:IsFieldEditor|SendCommandToUserFocus)|utoToggles)|C(?:lickableMetaPart|ontent(?:AlertIconType|CGImageRef|I(?:con(?:Ref|SuiteRef|TypeAndCreator)|mage(?:File|Resource))|MetaPart|N(?:SImage|one)|TextOnly))|D(?:isabledPart|oesNot(?:Draw|UseSpecialParts))|EntireView|F(?:eature(?:A(?:llowsSubviews|utoToggles)|DoesNot(?:Draw|UseSpecialParts)|GetsFocusOnClick|I(?:dlesWithTimer|gnoresClicks|nvertsUpDownValueMeaning|sOpaque)|Supports(?:Ghosting|LiveFeedback|RadioBehavior))|ocus(?:N(?:extPart|oPart)|OnAnyControl|PrevPart|Traditionally|WithoutWrapping))|GetsFocusOnClick|I(?:dlesWithTimer|gnoresClicks|n(?:activePart|dicatorPart|vertsUpDownValueMeaning)|sOpaque)|KindSignatureApple|NoPart|O(?:ffscreenImageUseWindowBackingResolution|paqueMetaPart)|S(?:endCommandToUserFocus|tructureMetaPart|upports(?:Ghosting|LiveFeedback|RadioBehavior))|ValidFeaturesForPanther|ZOrder(?:Above|Below))|Window(?:B(?:ackingLocation(?:Default|MainMemory|VideoMemory)|ehavior(?:Stationary|Transient)|it(?:A(?:syncDrag|uto(?:Calibration|ViewDragTracking))|C(?:anBeVisibleWithoutLogin|loseBox|o(?:llapseBox|mpositing))|DoesNot(?:Cycle|Hide)|F(?:rameworkScaled|ullScreen(?:Auxiliary|Primary))|Hi(?:deOn(?:FullScreen|Suspend)|ghResolutionCapable)|I(?:gnoreClicks|nWindowMenu)|LiveResize|No(?:Activates|Constrain|Shadow|T(?:exturedContentSeparator|itleBar)|Updates)|OpaqueForEvents|R(?:esizable|oundBottomBarCorners)|S(?:ideTitlebar|tandardHandler)|T(?:extured(?:SquareCorners)?|oolbarButton)|UnifiedTitleAndToolbar|ZoomBox))|CanJoinAllSpaces|D(?:epth(?:32Bit|64Bit|Float|Invalid)|ragPart)|ExposeHidden|IgnoreObscuringWindows|M(?:enu(?:Creator|WindowTag)|oveToActiveSpace)|S(?:caleMode(?:FrameworkScaled|Magnified|Unscaled)|haring(?:None|Read(?:Only|Write)))|Title(?:BarPart|ProxyIconPart)|VisibleInAllSpaces))|M(?:AbsoluteCenterAligned|Bottom(?:LeftCorner|RightCorner|Side)|C(?:FString(?:Content|LocalizedContent)|ontent(?:NotProvided(?:DontPropagate)?|Provided))|D(?:efaultSide|isposeContent)|H(?:elpMenuID|ideTag(?:Fade|Immediately))|I(?:llegalContentForMinimumState|nside(?:Bottom(?:CenterAligned|LeftCorner|RightCorner)|LeftCenterAligned|RightCenterAligned|Top(?:CenterAligned|LeftCorner|RightCorner)))|Left(?:BottomCorner|Side|TopCorner)|M(?:aximumContentIndex|inimumContentIndex)|NoContent|Outside(?:Bottom(?:CenterAligned|LeftAligned|RightAligned|ScriptAligned)|Left(?:BottomAligned|CenterAligned|TopAligned)|Right(?:BottomAligned|CenterAligned|TopAligned)|Top(?:CenterAligned|LeftAligned|RightAligned|ScriptAligned))|PascalStrContent|Right(?:BottomCorner|Side|TopCorner)|S(?:tr(?:ResContent|ingResContent)|upplyContent)|T(?:EHandleContent|extResContent|op(?:LeftCorner|RightCorner|Side)))|TTPServerIcon|a(?:lfWidth(?:CJKRomanSelector|IdeographsSelector|TextSelector)|n(?:dle(?:IsResource(?:Bit|Mask)|Locked(?:Bit|Mask)|Purgeable(?:Bit|Mask))|jaToHangul(?:Alt(?:OneSelector|T(?:hreeSelector|woSelector))|Selector))|rd(?:LinkFileType|wareCursor(?:DescriptorM(?:ajorVersion|inorVersion)|InfoM(?:ajorVersion|inorVersion)))|s(?:B(?:eenInited|undle)|CustomIcon|NoINITs))|e(?:brew(?:FigureSpaceVariant|StandardVariant)|lp(?:CharCode|DialogItem|Folder(?:Icon|Type)|Icon(?:Resource)?|TagEventHandlerTag|WindowClass))|i(?:deDiacriticsSelector|erarchicalFontMenuOption|gh(?:LevelEvent|ShelfParam_(?:CutOffFrequency|Gain))|nt(?:Advanced|Basic|Hidden)|passParam_(?:CutoffFrequency|Resonance)|raganaToKatakanaSelector|storicalLigaturesO(?:ffSelector|nSelector))|o(?:joCharactersSelector|meCharCode|rizontalConstraint)|uge(?:1BitMask|32BitData|4BitData|8Bit(?:Data|Mask))|yphen(?:To(?:EnDashO(?:ffSelector|nSelector)|MinusO(?:ffSelector|nSelector))|sToEmDashO(?:ffSelector|nSelector)))|I(?:BCarbonRuntime(?:CantFind(?:NibFile|Object)|ObjectNotOfRequestedType)|C(?:Attr(?:Locked(?:Bit|Mask)|NoChange|Volatile(?:Bit|Mask))|C(?:omponent(?:InterfaceVersion(?:0|1|2|3|4)?|Version)|reator)|EditPreferenceEvent(?:Class)?|File(?:SpecHeaderSize|Type)|Map(?:Binary(?:Bit|Mask)|DataFork(?:Bit|Mask)|FixedLength|Not(?:Incoming(?:Bit|Mask)|Outgoing(?:Bit|Mask))|Post(?:Bit|Mask)|ResourceFork(?:Bit|Mask))|N(?:ilProfileID|oUserInteraction(?:Bit|Mask)|umVersion)|Services(?:TCP(?:Bit|Mask)|UDP(?:Bit|Mask)))|MJaTypingMethod(?:Kana|Property|Roman)|O(?:A(?:nalogS(?:etupExpected|ignalLevel_(?:07(?:00_0(?:000|300)|14_0286)|1000_0400))|sync(?:C(?:allout(?:Count|FuncIndex|RefconIndex)|ompletionNotificationType)|Reserved(?:Count|Index)))|B(?:itsPerColorComponent(?:1(?:0|2|6)|6|8|NotSupported)|uiltinPanelPowerAttribute)|C(?:LUTPixels|SyncDisable|apturedAttribute|lamshellStateAttribute|o(?:lorimetry(?:AdobeRGB|BT(?:2(?:020|100)|601|709)|DCIP3|N(?:ativeRGB|otSupported)|WGRGB|sRGB|xvYCC)|nnect(?:MethodVarOutputSize|ion(?:BuiltIn|StereoSync))|pyback(?:Cache|InnerCache))|ursorControlAttribute)|D(?:PEvent(?:AutomatedTestRequest|ContentProtection|ForceRetrain|Idle|MCCS|RemoteControlCommandPending|S(?:inkSpecific|tart))|SCBlockPredEnable|e(?:f(?:ault(?:Cache|MemoryType)|erCLUTSetAttribute)|tailedTimingValid)|i(?:gitalSignal|splay(?:ColorMode|Dither(?:All|D(?:efault|isable)|FrameRateControl|RGBShift|Spatial|Temporal|YCbCr4(?:22Shift|44Shift))|ModeID(?:BootProgrammable|ReservedBase)|NeedsCEAUnderscan|PowerState(?:MinUsable|O(?:ff|n))|RGBColorComponentBits(?:1(?:0|2|4|6)|6|8|Unknown)|YCbCr4(?:22ColorComponentBits(?:1(?:0|2|4|6)|6|8|Unknown)|44ColorComponentBits(?:1(?:0|2|4|6)|6|8|Unknown))))|riverPowerAttribute|ynamicRange(?:Dolby(?:NormalMode|TunnelMode)|HDR10|NotSupported|SDR|TraditionalGammaHDR))|F(?:B(?:AVSignalType(?:D(?:P|VI)|HDMI|Unknown|VGA)|B(?:itRate(?:HBR(?:2)?|RBR)|lueGammaScaleAttribute)|C(?:hangedInterruptType|onnectInterruptType)|Display(?:Port(?:InterruptType|LinkChangeInterruptType|TrainingAttribute)|State(?:_(?:AlreadyActive|Mask|PipelineBlack|RestoredProfile))?)|FrameInterruptType|GreenGammaScaleAttribute|H(?:BLInterruptType|D(?:CPLimit_(?:AllowAll|NoHDCP(?:1x|20Type(?:0|1)))|RMetaDataAttribute))|Li(?:mitHDCP(?:Attribute|StateAttribute)|nk(?:Downspread(?:Max|None)|PreEmphasisLevel(?:0|1|2|3)|Scrambler(?:Alternate|Normal)|VoltageLevel(?:0|1|2|3)))|MCCSInterruptType|NS_(?:D(?:i(?:m|splayState(?:Mask|Shift))|oze)|Generation(?:Mask|Shift)|MessageMask|Rendezvous|Sleep|UnDim|Wake)|O(?:fflineInterruptType|nlineInterruptType)|RedGammaScaleAttribute|S(?:erverConnectType|haredConnectType|top|ystemAperture)|UserRequestProbe|V(?:BLInterruptType|ariableRefreshRate)|WakeInterruptType)|ixedCLUTPixels)|GDiagnose(?:ConnectType|GTraceType)|H(?:SyncDisable|ardwareCursorAttribute|ibernatePreview(?:Active|Updates))|In(?:hibitCache|ter(?:estCallout(?:Count|FuncIndex|RefconIndex|ServiceIndex)|lacedCEATiming))|KitNotication(?:MsgSizeMask|Type(?:Mask|SizeAdjShift))|M(?:a(?:p(?:Anywhere|C(?:ache(?:Mask|Shift)|opyback(?:Cache|InnerCache))|DefaultCache|InhibitCache|Overwrite|P(?:osted(?:CombinedReordered|Reordered|Write)|refault)|Re(?:a(?:dOnly|lTimeCache)|ference)|Static|U(?:nique|serOptionsMask)|Write(?:CombineCache|ThruCache))|tchingCallout(?:Count|FuncIndex|RefconIndex)|xPixelBits)|irror(?:Attribute|Default(?:Attribute)?|Forced|HWClipped|Is(?:Mirrored|Primary))|ono(?:DirectPixels|InverseDirectPixels))|N(?:TSCTiming|oSeparateSyncControl)|P(?:ALTiming|ixelEncoding(?:NotSupported|RGB444|YCbCr4(?:2(?:0|2)|44))|o(?:sted(?:CombinedReordered|Reordered|Write)|wer(?:Attribute|StateAttribute)))|R(?:GB(?:DirectPixels|Signed(?:DirectPixels|FloatingPointPixels))|ange(?:BitsPerColorComponent(?:1(?:0|2|6)|6|8|NotSupported)|Colorimetry(?:AdobeRGB|BT(?:2(?:020|100)|601|709)|DCIP3|N(?:ativeRGB|otSupported)|WGRGB|sRGB|xvYCC)|DynamicRange(?:Dolby(?:NormalMode|TunnelMode)|HDR10|NotSupported|SDR|TraditionalGammaHDR)|PixelEncoding(?:NotSupported|RGB444|YCbCr4(?:2(?:0|2)|44))|Supports(?:CompositeSync|InterlacedCEATiming(?:WithConfirm)?|S(?:eparateSyncs|ignal_(?:07(?:00_0(?:000|300)|14_0286)|1000_0400)|yncOnGreen)|VSyncSerration))|e(?:alTimeCache|gistryIterate(?:Parents|Recursively)))|S(?:cal(?:e(?:Can(?:BorderInsetOnly|DownSamplePixels|Rotate|S(?:caleInterlaced|upportInset)|UpSamplePixels)|Invert(?:X|Y)|Rotate(?:0|180|270|90|Flags)|S(?:tretch(?:Only|ToFit)|wapAxes))|ingInfoValid)|ervice(?:InteractionAllowed|M(?:atchedNotificationType|essageNotificationType)|PublishNotificationType|TerminatedNotificationType)|urface(?:Co(?:mponent(?:Name(?:Alpha|Blue|Chroma(?:Blue|Red)|Green|Luma|Red|Unknown)|Range(?:FullRange|Unknown|VideoRange|WideRange)|Type(?:Float|SignedInteger|Un(?:known|signedInteger)))|pyback(?:Cache|InnerCache))|DefaultCache|InhibitCache|Lock(?:AvoidSync|ReadOnly)|Map(?:C(?:acheShift|opyback(?:Cache|InnerCache))|DefaultCache|InhibitCache|Write(?:CombineCache|ThruCache))|Purgeable(?:Empty|KeepCurrent|NonVolatile|Volatile)|Subsampling(?:4(?:11|2(?:0|2))|None|Unknown)|Write(?:CombineCache|ThruCache))|y(?:nc(?:On(?:Blue|Green|Red)|PositivePolarity)|stemPowerAttribute))|T(?:iming(?:ID(?:Apple(?:NTSC_(?:FF(?:conv)?|ST(?:conv)?)|PAL_(?:FF(?:conv)?|ST(?:conv)?)|_(?:0x0_0hz_Offline|1(?:024x768_75hz|152x870_75hz)|5(?:12x384_60hz|60x384_60hz)|640x(?:4(?:00_67hz|80_67hz)|8(?:18_75hz|70_75hz))|832x624_75hz|FixedRateLCD))|FilmRate_48hz|GTF_640x480_120hz|Invalid|S(?:MPTE240M_60hz|ony_1(?:600x1024_76hz|920x1(?:080_(?:60hz|72hz)|200_76hz)))|VESA_(?:1(?:024x768_(?:60hz|7(?:0hz|5hz)|85hz)|152x864_75hz|280x(?:1024_(?:60hz|75hz|85hz)|960_(?:60hz|75hz|85hz))|360x768_60hz|600x1200_(?:6(?:0hz|5hz)|7(?:0hz|5hz)|8(?:0hz|5hz))|792x1344_(?:60hz|75hz)|856x1392_(?:60hz|75hz)|920x1440_(?:60hz|75hz))|640x480_(?:60hz|7(?:2hz|5hz)|85hz)|8(?:00x600_(?:56hz|60hz|7(?:2hz|5hz)|85hz)|48x480_60hz)))|RangeV(?:1|2))|riStateSyncs)|V(?:RAMSaveAttribute|SyncDisable)|W(?:SAA_(?:Accelerated|D(?:efer(?:End|Start)|riverOpen)|From_Accelerated|Hibernate|NonConsoleDevice|Reserved|S(?:leep|tateMask)|T(?:o_Accelerated|ransactional)|Unaccelerated)|indowServerActiveAttribute|rite(?:CombineCache|ThruCache)))|PFileServerIcon|S(?:OLatin(?:1(?:MusicCDVariant|StandardVariant)|Arabic(?:ExplicitOrderVariant|ImplicitOrderVariant|VisualOrderVariant)|Hebrew(?:ExplicitOrderVariant|ImplicitOrderVariant|VisualOrderVariant))|SDownloadsFolderType|p(?:BufferToSmallErr|Device(?:ActiveErr|InactiveErr)|Element(?:InListErr|NotInListErr)|InternalErr|ListBusyErr|System(?:ActiveErr|InactiveErr|ListErr)))|con(?:DialogItem|FamilyType|Services(?:1(?:024PixelDataARGB|28PixelDataARGB|6PixelDataARGB)|256PixelDataARGB|32PixelDataARGB|48PixelDataARGB|512PixelDataARGB|CatalogInfoMask|No(?:BadgeFlag|rmalUsageFlag)|UpdateIfNeededFlag))|d(?:eographic(?:Alt(?:F(?:iveSelector|ourSelector)|OneSelector|T(?:hreeSelector|woSelector)|ernativesType)|SpacingType)|leKCEvent(?:Mask)?)|ll(?:egal(?:ClockValueErr|InstructionException)|uminatedCapsSelector)|mmediate|n(?:DeferredTaskMask|NestedInterruptMask|SecondaryIntHandlerMask|UseErr|VBLTaskMask|dexFilesFolderType|equalityLigaturesO(?:ffSelector|nSelector)|feriorsSelector|itialCaps(?:AndSmallCapsSelector|Selector)|kInputMethodClass|putM(?:anagersFolderType|ethodsFolderType)|s(?:ertHierarchicalMenu|t(?:aller(?:LogsFolderType|ReceiptsFolderType)|ru(?:ctionBreakpointException|mentType_(?:A(?:UPreset|udiofile)|DLSPreset|EXS24|SF2Preset))))|te(?:gerException|rn(?:ation(?:ResourcesIcon|al(?:ResourcesIcon|SymbolsSelector))|et(?:EventClass|Folder(?:Icon|Type)|Location(?:A(?:FP|pple(?:ShareIcon|Talk(?:ZoneIcon)?))|Creator|F(?:TP(?:Icon)?|ile(?:Icon)?)|Generic(?:Icon)?|HTTP(?:Icon)?|Mail(?:Icon)?|N(?:NTP|SL(?:NeighborhoodIcon)?|ewsIcon))|P(?:asswordKCItemClass|lugInFolder(?:Icon|Type))|S(?:earchSitesFolder(?:Icon|Type)|itesFolderType))))|v(?:alid(?:CSClientErr|DeviceNumber|Font(?:Family)?|Generation|RegEntryErr)|ert(?:Highlighting|ed(?:BoxAnnotationSelector|CircleAnnotationSelector|RoundedBoxAnnotationSelector)|ingEncod(?:edPixel|ing(?:Shift)?))|isibleKCItemAttr))|s(?:Alias|Invisible|OnDesk|S(?:hared|tationery)|suer(?:KCItemAttr|URLKCItemAttr))|t(?:alicCJKRomanType|em(?:DisableBit|List)))|J(?:I(?:Journal(?:InFSMask|NeedInitMask|OnOtherDeviceMask)|S(?:19(?:78CharactersSelector|83CharactersSelector|90CharactersSelector)|2004CharactersSelector))|S(?:ClassAttributeNo(?:AutomaticPrototype|ne)|PropertyAttribute(?:Dont(?:Delete|Enum)|None|ReadOnly)|Type(?:Boolean|Nu(?:ll|mber)|Object|String|Undefined|dArrayType(?:ArrayBuffer|Float(?:32Array|64Array)|Int(?:16Array|32Array|8Array)|None|Uint(?:16Array|32Array|8(?:Array|ClampedArray)))))|UST(?:CurrentVersion|KashidaPriority|LetterPriority|NullPriority|Override(?:Limits|Priority|Unlimited)|Priority(?:Count|Mask)|S(?:pacePriority|tandardFormat)|Tag|Unlimited|noGlyphcode|pc(?:ConditionalAddAction|D(?:ecompositionAction|uctilityAction)|Glyph(?:RepeatAddAction|StretchAction)|UnconditionalAddAction))|apanese(?:BasicVariant|PostScript(?:PrintVariant|ScrnVariant)|St(?:andardVariant|dNoVerticalsVariant)|VertAtKuPlusTenVariant))|K(?:C(?:AuthType(?:D(?:PA|efault)|HTTPDigest|MSN|NTLM|RPA)|ProtocolType(?:A(?:FP|ppleTalk)|FTP(?:Account)?|HTTP|I(?:MAP|RC)|LDAP|NNTP|POP3|S(?:MTP|OCKS)|Telnet))|ER(?:N(?:C(?:rossStream(?:ResetNote)?|urrentVersion)|FormatMask|IndexArray|Line(?:EndKerning|Start)|No(?:CrossKerning|StakeNote|t(?:Applied|esRequested))|OrderedList|ResetCrossStream|S(?:impleArray|tateTable)|Tag|UnusedBits|V(?:ariation|ertical))|X(?:Action(?:OffsetMask|Type(?:AnchorPoints|Co(?:ntrolPoints|ordinates)|Mask))|C(?:ontrolPoint|rossStream(?:ResetNote)?|urrentVersion)|Descending|FormatMask|IndexArray|Line(?:EndKerning|Start)|No(?:CrossKerning|StakeNote|t(?:Applied|esRequested))|OrderedList|ResetCrossStream|S(?:impleArray|tateTable)|Tag|Unused(?:Bits|Flags)|V(?:a(?:luesAreLong|riation)|ertical)))|L(?:GroupIdentifier|I(?:con|dentifier)|K(?:CHR(?:Data|Kind|uchrKind)|ind)|L(?:anguageCode|ocalizedName)|Name|USKeyboard|uchr(?:Data|Kind))|a(?:na(?:SpacingType|ToRomanizationSelector)|takanaToHiraganaSelector)|e(?:epArrangedIcon|rnelExtensionsFolderType|y(?:board(?:ANSI|I(?:SO|nputMethodClass)|JIS|Layout(?:Icon|sFolderType)|Unknown)|chain(?:FolderType|ListChangedKCEvent))))|L(?:A(?:AllMorphemes|DefaultEdge|EndOfSourceTextMask|FreeEdge|IncompleteEdge|MorphemesArrayVersion|Speech(?:BagyouGodan|Chimei(?:Setsubigo)?|Do(?:kuritsugo|ushi)|Fu(?:kushi|tsuuMeishi)|G(?:agyouGodan|odanDoushi)|IchidanDoushi|J(?:inmei(?:Mei|Se(?:i|tsubigo))?|o(?:doushi|shi))|K(?:a(?:gyouGodan|henDoushi|ndoushi|tsuyou(?:Gokan|Katei|M(?:ask|eirei|izen)|Ren(?:tai|you)|Syuushi))|ei(?:douMeishi|you(?:doushi|shi))|igou|oyuuMeishi|uten)|M(?:agyouGodan|e(?:diumClassMask|ishi)|uhinshi)|NagyouGodan|R(?:agyouGodan|entaishi|oughClassMask)|S(?:a(?:gyouGodan|hen(?:Doushi|Meishi))|e(?:iku|t(?:su(?:bi(?:Chimei|go)|zokushi)|tougo))|oshikimei(?:Setsubigo)?|trictClassMask|uu(?:jiSet(?:subigo|tougo)|shi))|T(?:a(?:gyouGodan|nkanji)|outen)|WagyouGodan|ZahenDoushi))|CAR(?:C(?:tlPointFormat|urrentVersion)|LinearFormat|Tag)|S(?:A(?:ccept(?:AllowLoginUI|Default)|pp(?:DoesNot(?:ClaimTypeErr|SupportSchemeWarning)|InTrashErr|licationNotFoundErr)|ttributeNot(?:FoundErr|SettableErr))|CannotSetInfoErr|Data(?:Err|TooOldErr|UnavailableErr)|ExecutableIncorrectFormat|GarbageCollectionUnsupportedErr|Incompatible(?:ApplicationVersionErr|SystemVersionErr)|Launch(?:A(?:nd(?:DisplayErrors|Hide(?:Others)?|Print)|sync)|D(?:efaults|ont(?:AddToRecents|Switch))|InProgressErr|NewInstance)|MultipleSessionsNotSupportedErr|No(?:32BitEnvironmentErr|ClassicEnvironmentErr|ExecutableErr|LaunchPermissionErr|R(?:egistrationInfoErr|osettaEnvironmentErr)|t(?:AnApplicationErr|InitializedErr|RegisteredErr))|Roles(?:All|Editor|None|Shell|Viewer)|S(?:erverCommunicationErr|haredFileList(?:DoNotMountVolumes|NoUserInteraction))|Unknown(?:Creator|Err|Type(?:Err)?))|TAGCurrentVersion|a(?:belKCItemAttr|nguageTagType|rge(?:1BitMask|32BitData|4Bit(?:Data|IconSize)|8Bit(?:Data|IconSize|Mask)|IconSize)|st(?:DomainConstant|FeatureType|IOKitNotificationType|MagicBusyFiletype)|unch(?:ToGetTerminology|erItemsFolderType))|e(?:ft(?:ArrowCharCode|ToRight)|tterCaseType)|i(?:braryAssistantsFolderType|gaturesType|miterParam_(?:AttackTime|DecayTime|PreGain)|n(?:e(?:F(?:eedCharCode|inalSwashesO(?:ffSelector|nSelector))|InitialSwashesO(?:ffSelector|nSelector)|arPCMFormatFlag(?:Is(?:AlignedHigh|BigEndian|Float|Non(?:Interleaved|Mixable)|Packed|SignedInteger)|s(?:AreAllClear|SampleFraction(?:Mask|Shift))))|guisticRearrangement(?:O(?:ffSelector|nSelector)|Type))|stDef(?:ProcPtr|Standard(?:IconType|TextType)|UserProcType))|o(?:c(?:al(?:Domain|PPDDomain|e(?:A(?:llPartsMask|ndVariantNameMask)|Language(?:Mask|VariantMask)|NameMask|OperationVariantNameMask|Region(?:Mask|VariantMask)|Script(?:Mask|VariantMask)|s(?:BufferTooSmallErr|DefaultDisplayStatus|Folder(?:Icon|Type)|TableFormatErr)))|k(?:KCEvent(?:Mask)?|ed(?:BadgeIcon|Icon)))|g(?:osO(?:ffSelector|nSelector)|sFolderType)|w(?:PassParam_(?:CutoffFrequency|Resonance)|erCase(?:NumbersSelector|PetiteCapsSelector|SmallCapsSelector|Type))))|M(?:68kISA|D(?:Label(?:LocalDomain|UserDomain)|Query(?:AllowFSTranslation|ReverseSortOrderFlag|Synchronous|WantsUpdates))|IDI(?:DriversFolderType|I(?:DNotUnique|nvalid(?:Client|Port|UniqueID))|M(?:essageSendErr|sg(?:IOError|Object(?:Added|Removed)|PropertyChanged|Se(?:rialPortOwnerChanged|tupChanged)|ThruConnectionsChanged))|No(?:C(?:onnection|urrentSetup)|tPermitted)|Object(?:NotFound|Type_(?:De(?:stination|vice)|E(?:ntity|xternal(?:De(?:stination|vice)|Entity|Source))|Other|Source))|Se(?:rverStartErr|tupFormatErr)|Unknown(?:E(?:ndpoint|rror)|Property)|Wrong(?:EndpointType|PropertyType|Thread))|OR(?:T(?:C(?:o(?:ntextualType|ver(?:Descending|IgnoreVertical|TypeMask|Vertical))|urr(?:Insert(?:Before|Count(?:Mask|Shift)|KashidaLike)|JustTableCount(?:Mask|Shift)|entVersion))|DoInsertionsBefore|I(?:nsertion(?:Type|sCountMask)|sSplitVowelPiece)|Lig(?:FormOffset(?:Mask|Shift)|LastAction|StoreLigature|atureType)|Mark(?:Insert(?:Before|Count(?:Mask|Shift)|KashidaLike)|JustTableCount(?:Mask|Shift))|RearrangementType|SwashType|Tag|ra(?:CDx(?:A(?:B)?|BA)?|D(?:Cx(?:A(?:B)?|BA)?|x(?:A(?:B)?|BA)?)|NoAction|x(?:A(?:B)?|BA)))|X(?:C(?:over(?:Descending|IgnoreVertical|LogicalOrder|TypeMask|Vertical)|urrentVersion)|Tag))|P(?:A(?:ddressSpaceInfoVersion|llocate(?:1(?:024ByteAligned|6ByteAligned)|32ByteAligned|4096ByteAligned|8ByteAligned|AltiVecAligned|ClearMask|DefaultAligned|GloballyMask|InterlockAligned|MaxAlignment|No(?:CreateMask|GrowthMask)|ResidentMask|VM(?:PageAligned|XAligned))|nyRemoteContext|syncInterruptRemoteContext)|BlueBlockingErr|Cr(?:eateTask(?:NotDebuggableMask|SuspendedMask|TakesAllExceptionsMask|ValidOptionsMask)|iticalRegionInfoVersion)|DeletedErr|E(?:G4Object_(?:AAC_(?:L(?:C|TP)|Main|S(?:BR|SR|calable))|CELP|HVXC|TwinVQ)|ventInfoVersion)|HighLevelDebugger|I(?:n(?:sufficientResourcesErr|terruptRemoteContext|validIDErr)|terationEndErr)|LowLevelDebugger|M(?:axAllocSize|idLevelDebugger)|N(?:anokernelNeedsMemoryErr|o(?:ID|tificationInfoVersion))|OwningProcessRemoteContext|Pr(?:eserveTimerIDMask|ivilegedErr|ocess(?:CreatedErr|TerminatedErr))|QueueInfoVersion|SemaphoreInfoVersion|T(?:ask(?:AbortedErr|Blocked(?:Err)?|CreatedErr|InfoVersion|Propagate(?:Mask)?|R(?:e(?:ady|sume(?:Branch(?:Mask)?|Mask|Step(?:Mask)?))|unning)|St(?:ate(?:32BitMemoryException|FPU|Machine|Registers|TaskInfo|Vectors)|oppedErr))|ime(?:IsD(?:eltaMask|urationMask)|outErr)))|a(?:c(?:Arabic(?:AlBayanVariant|StandardVariant|T(?:huluthVariant|rueTypeVariant))|C(?:roatian(?:CurrencySignVariant|DefaultVariant|EuroSignVariant)|yrillic(?:CurrSign(?:StdVariant|UkrVariant)|DefaultVariant|EuroSignVariant))|Farsi(?:StandardVariant|TrueTypeVariant)|Greek(?:DefaultVariant|EuroSignVariant|NoEuroSignVariant)|He(?:brew(?:FigureSpaceVariant|StandardVariant)|lpVersion)|Icelandic(?:St(?:andardVariant|d(?:CurrSignVariant|DefaultVariant|EuroSignVariant))|T(?:T(?:CurrSignVariant|DefaultVariant|EuroSignVariant)|rueTypeVariant))|Japanese(?:BasicVariant|PostScript(?:PrintVariant|ScrnVariant)|St(?:andardVariant|dNoVerticalsVariant)|VertAtKuPlusTenVariant)|MemoryMaximumMemoryManagerBlockSize|OSReadMe(?:FolderIcon|sFolderType)|Roman(?:CurrencySignVariant|DefaultVariant|EuroSignVariant|Latin1(?:CroatianVariant|DefaultVariant|IcelandicVariant|RomanianVariant|StandardVariant|TurkishVariant)|StandardVariant|ian(?:CurrencySignVariant|DefaultVariant|EuroSignVariant))|VT100(?:CurrencySignVariant|DefaultVariant|EuroSignVariant)|hineNameStrID)|gic(?:BusyCreationDate|TemporaryItemsFolderType)|le|nagedItemsFolderType|t(?:h(?:SymbolsSelector|ematical(?:ExtrasType|GreekO(?:ffSelector|nSelector)))|rixMixerParam_(?:Enable|P(?:ost(?:AveragePower(?:Linear)?|PeakHoldLevel(?:Linear)?)|re(?:AveragePower(?:Linear)?|PeakHoldLevel(?:Linear)?))|Volume))|x(?:AsyncArgs|InputLengthOfAppleJapaneseEngine|K(?:anjiLengthInAppleJapaneseDictionary|eyLength)|YomiLengthInAppleJapaneseDictionary|imumBlocksIn4GB))|enu(?:A(?:ppleLogo(?:FilledGlyph|OutlineGlyph)|ttr(?:AutoDisable|CondenseSeparators|DoNot(?:CacheImage|UseUserCommandKeys)|ExcludesMarkColumn|Hidden|UsePencilGlyph))|BlankGlyph|C(?:GImageRefType|a(?:lcItemMsg|psLockGlyph)|heckmarkGlyph|learGlyph|o(?:lorIconType|mmandGlyph|nt(?:ext(?:Co(?:mmandIDSearch|ntextualMenu)|DontUpdate(?:Enabled|Icon|Key|Text)|Inspection|KeyMatching|Menu(?:Bar(?:Tracking)?|Enabling)|P(?:opUp(?:Tracking)?|ullDown)|Submenu|ualMenuGlyph)|rol(?:Glyph|ISOGlyph|Modifier))))|D(?:e(?:f(?:ClassID|ProcPtr)|lete(?:LeftGlyph|RightGlyph))|i(?:amondGlyph|sposeMsg)|own(?:ArrowGlyph|wardArrowDashedGlyph)|raw(?:ItemsMsg|Msg))|E(?:isuGlyph|jectGlyph|nterGlyph|scapeGlyph|vent(?:DontCheckSubmenus|IncludeDisabledItems|QueryOnly))|F(?:1(?:0Glyph|1Glyph|2Glyph|3Glyph|4Glyph|5Glyph|6Glyph|7Glyph|8Glyph|9Glyph|Glyph)|2Glyph|3Glyph|4Glyph|5Glyph|6Glyph|7Glyph|8Glyph|9Glyph|indItemMsg)|H(?:elpGlyph|iliteItemMsg)|I(?:con(?:Re(?:fType|sourceType)|SuiteType|Type)|nitMsg|tem(?:Attr(?:Auto(?:Disable|Repeat)|CustomDraw|D(?:isabled|ynamic)|Hidden|I(?:conDisabled|gnoreMeta|ncludeInCmdKeyMatching)|NotPreviousAlternate|S(?:e(?:ctionHeader|parator)|ubmenuParentChoosable)|U(?:pdateSingleItem|seVirtualKey))|Data(?:A(?:llDataVersion(?:One|T(?:hree|wo))|ttribute(?:dText|s))|C(?:FString|md(?:Key(?:Glyph|Modifiers)?|VirtualKey)|ommandID)|Enabled|Font(?:ID)?|I(?:con(?:Enabled|Handle|ID)|ndent)|Mark|Properties|Refcon|S(?:tyle|ubmenu(?:Handle|ID))|Text(?:Encoding)?)))|KanaGlyph|Left(?:Arrow(?:DashedGlyph|Glyph)|DoubleQuotesJapaneseGlyph)|N(?:o(?:CommandModifier|Icon|Modifiers|nmarkingReturnGlyph|rthwestArrowGlyph)|ullGlyph)|Option(?:Glyph|Modifier)|P(?:a(?:ge(?:DownGlyph|UpGlyph)|ragraphKoreanGlyph)|encilGlyph|o(?:pUpMsg|werGlyph)|ropertyPersistent)|R(?:eturn(?:Glyph|R2LGlyph)|ight(?:Arrow(?:DashedGlyph|Glyph)|DoubleQuotesJapaneseGlyph))|S(?:h(?:ift(?:Glyph|Modifier)|rinkIconType)|izeMsg|mallIconType|outheastArrowGlyph|paceGlyph|tdMenu(?:BarProc|Proc)|ystemIconSelectorType)|T(?:ab(?:LeftGlyph|RightGlyph)|hemeSavvyMsg|ra(?:ckingMode(?:Keyboard|Mouse)|demarkJapaneseGlyph))|UpArrow(?:DashedGlyph|Glyph))|i(?:crosecondScale|llisecondScale|ni(?:1BitMask|4BitData|8BitData))|o(?:d(?:DateKCItemAttr|al(?:DialogVariantCode|WindowClass)|em(?:OutOfMemory|PreferencesMissing|Script(?:Missing|sFolderType)))|nospaced(?:NumbersSelector|TextSelector)|u(?:nted(?:BadgeIcon|Folder(?:AliasType|Icon(?:Resource)?))|se(?:Params(?:ClickAndHold|DragInitiation|ProxyIcon|Sticky)|Tracking(?:ClientEvent|KeyModifiersChanged|Mouse(?:D(?:own|ragged)|E(?:ntered|xited)|Moved|Pressed|Released|Up)|ScrollWheel|TimedOut|UserCancelled)|UpOutOfSlop))|v(?:able(?:Alert(?:VariantCode|WindowClass)|Modal(?:DialogVariantCode|WindowClass))|ieDocumentsFolderType))|u(?:lti(?:ChannelMixerParam_(?:Enable|P(?:an|ost(?:AveragePower|PeakHoldLevel)|re(?:AveragePower|PeakHoldLevel))|Volume)|band(?:CompressorParam_(?:AttackTime|C(?:ompressionAmount(?:1|2|3|4)|rossover(?:1|2|3))|EQ(?:1|2|3|4)|Headroom(?:1|2|3|4)|InputAmplitude(?:1|2|3|4)|OutputAmplitude(?:1|2|3|4)|P(?:ostgain|regain)|ReleaseTime|Threshold(?:1|2|3|4))|Filter_(?:Bandwidth(?:1|2|3)|Center(?:Freq(?:1|2|3)|Gain(?:1|2|3))|High(?:F(?:ilterType|requency)|Gain)|Low(?:F(?:ilterType|requency)|Gain)))|processingFolderType)|sic(?:D(?:evice(?:MIDIEventSelect|P(?:aram_(?:ReverbVolume|Tuning|Volume)|r(?:epareInstrumentSelect|operty_(?:BankName|DualSchedulingMode|GroupOutputBus|Instrument(?:Count|N(?:ame|umber))|MIDIXMLNames|PartGroup|S(?:oundBank(?:Data|FS(?:Ref|Spec)|URL)|treamFromDisk|upportsStartStopNote)|UsesInternalReverb)))|R(?:ange|eleaseInstrumentSelect)|S(?:ampleFrameMask_(?:IsScheduled|SampleOffset)|t(?:artNoteSelect|opNoteSelect)|ysExSelect))|ocumentsFolderType)|EventType_(?:AUPreset|Extended(?:Control|Note|Tempo)|M(?:IDI(?:ChannelMessage|NoteMessage|RawData)|eta)|NULL|Parameter|User)|NoteEvent_U(?:nused|seGroupInstrument)|Sequence(?:File(?:Flags_(?:Default|EraseFile)|_(?:AnyType|MIDIType|iMelodyType))|LoadSMF_(?:ChannelsToTracks|PreserveTracks)|Type_(?:Beats|S(?:amples|econds))))))|N(?:LCCharactersSelector|S(?:L(?:68kContextNotSupported|B(?:ad(?:ClientInfoPtr|DataTypeErr|NetConnection|ProtocolTypeErr|ReferenceErr|ServiceTypeErr|URLSyntax)|ufferTooSmallForData)|CannotContinueLookup|ErrNullPtrError|In(?:itializationFailed|sufficient(?:OTVer|SysVer)|validPluginSpec)|N(?:o(?:C(?:arbonLib|ontextAvailable)|ElementsInList|PluginsFo(?:rSearch|und)|SupportForService|tI(?:mplementedYet|nitialized))|ull(?:ListPtr|NeighborhoodPtr))|PluginLoadFailed|RequestBufferAlreadyInList|S(?:chedulerError|earchAlreadyInProgress|omePluginsFailedToLoad)|UILibraryNotAvailable)|p(?:A(?:dd(?:PlayerFailedErr|ressInUseErr)|lready(?:AdvertisingErr|InitializedErr))|C(?:antBlockErr|onnectFailedErr|reateGroupFailedErr)|F(?:eatureNotImplementedErr|reeQExhaustedErr)|GameTerminatedErr|HostFailedErr|In(?:itializationFailedErr|valid(?:AddressErr|DefinitionErr|G(?:ameRefErr|roupIDErr)|P(?:arameterErr|layerIDErr|rotocol(?:ListErr|RefErr))))|JoinFailedErr|Me(?:mAllocationErr|ssageTooBigErr)|N(?:ameRequiredErr|o(?:GroupsErr|HostVolunteersErr|PlayersErr|tAdvertisingErr))|OT(?:NotPresentErr|VersionTooOldErr)|P(?:ipeFullErr|rotocolNotAvailableErr)|RemovePlayerFailedErr|SendFailedErr|T(?:imeoutErr|opologyNotSupportedErr)))|a(?:meLocked|nosecondScale|v(?:CustomControlMessageFailedErr|Invalid(?:CustomControlMessageErr|SystemConfigErr)|MissingKindStringErr|WrongDialog(?:ClassErr|StateErr)))|e(?:gativeKCItemAttr|twork(?:Domain|PPDDomain)|ut(?:er|ralScript)|verAuthenticate|w(?:DebugHeap|S(?:izeParameter|tyleHeap|uspend)|TimePitchParam_(?:EnablePeakLocking|Overlap|Pitch|Rate))|xt(?:Body|WindowGroup))|o(?:A(?:lternatesSelector|nnotationSelector)|ByteCode|C(?:JK(?:ItalicRomanSelector|SymbolAlternativesSelector)|ard(?:BusCISErr|E(?:nablersFoundErr|rr)|SevicesSocketsErr)|lientTableErr|o(?:mpatibleNameErr|nstraint))|En(?:ablerForCardErr|dingProsody)|F(?:ilesIcon|olderIcon|ractionsSelector)|I(?:OWindowRequestedErr|deographicAlternativesSelector)|More(?:I(?:nterruptSlotsErr|temsErr)|TimerClientsErr)|OrnamentsSelector|Process|RubyKanaSelector|S(?:peechInterrupt|tyl(?:eOptionsSelector|isticAlternatesSelector)|uchPowerSource)|T(?:hreadID|imeOut|rans(?:form|literationSelector))|UserAuthentication|WriteIcon|n(?:BreakingSpaceCharCode|FinalSwashesO(?:ffSelector|nSelector)|eKCStopOn)|rmalPositionSelector|t(?:Paged|ReadyErr|ZVCapableErr|eIcon))|u(?:llCharCode|m(?:AUNBandEQFilterTypes|ber(?:C(?:aseType|tlCTabEntries)|OfResponseFrequencies|SpacingType))))|O(?:CRInputMethodClass|PBD(?:C(?:ontrolPointFormat|urrentVersion)|DistanceFormat|Tag)|S(?:A(?:C(?:anGetSource|omponentType)|DontUsePhac|Error(?:A(?:pp|rgs)|BriefMessage|ExpectedType|Message|Number|OffendingObject|PartialResult|Range)|FileType|GenericScriptingComponentSubtype|Mode(?:A(?:lwaysInteract|ugmentContext)|C(?:an(?:Interact|tSwitchLayer)|ompileIntoContext)|D(?:isp(?:atchToDirectObject|layForHumans)|o(?:Record|nt(?:Define|GetDataForArguments|Reconnect|StoreParent)))|FullyQualifyDescriptors|N(?:everInteract|ull)|PreventGetSource)|N(?:oDispatch|ull(?:Mode|Script))|RecordedText|S(?:cript(?:BestType|Is(?:Modified|Type(?:CompiledScript|Script(?:Context|Value)))|ResourceType)|elect(?:AvailableDialect(?:CodeList|s)|Co(?:erce(?:FromDesc|ToDesc)|mp(?:ile(?:Execute)?|onentSpecificStart)|py(?:DisplayString|ID|S(?:cript|ourceString)))|D(?:isp(?:lay|ose)|o(?:Event|Script))|Execute(?:Event)?|Get(?:ActiveProc|C(?:reateProc|urrentDialect)|DialectInfo|ResumeDispatchProc|S(?:criptInfo|endProc|ource))|Load(?:Execute)?|MakeContext|S(?:cript(?:Error|ingComponentName)|et(?:ActiveProc|C(?:reateProc|urrentDialect)|DefaultTarget|ResumeDispatchProc|S(?:criptInfo|endProc))|t(?:artRecording|o(?:pRecording|re))))|u(?:ite|pports(?:AE(?:Coercion|Sending)|Co(?:mpiling|nvenience)|Dialects|EventHandling|GetSource|Recording)))|UseStandardDispatch|sync(?:CompleteMessageID|Ref(?:64(?:Count|Size)|Count|Size)))|IZ(?:CodeInSharedLibraries|DontOpenResourceFile|OpenWithReadPermission|dontAcceptRemoteEvents)|NotificationMessageID)|T(?:A(?:ccessErr|ddressBusyErr)|B(?:ad(?:AddressErr|ConfigurationErr|DataErr|FlagErr|NameErr|OptionErr|QLenErr|ReferenceErr|S(?:equenceErr|yncErr))|ufferOverflowErr)|C(?:anceledErr|lientNotInittedErr|onfigurationChangedErr)|DuplicateFoundErr|FlowErr|IndOutErr|LookErr|No(?:AddressErr|D(?:ataErr|isconnectErr)|Error|ReleaseErr|StructureTypeErr|UDErrErr|t(?:FoundErr|SupportedErr))|Out(?:OfMemoryErr|StateErr)|P(?:ort(?:HasDiedErr|LostConnection|WasEjectedErr)|ro(?:tocolErr|viderMismatchErr))|QFullErr|Res(?:AddressErr|QLenErr)|S(?:tateChangeErr|ysErrorErr)|UserRequestedErr)|ff(?:linePreflight_(?:NotRequired|Optional|Required)|set2Pos)|ld68kRTA|n(?:AppropriateDisk|SystemDisk|eByteCode)|p(?:aque(?:A(?:ddressSpaceID|nyID|reaID)|C(?:o(?:herenceID|nsoleID)|puID|riticalRegionID)|EventID|NotificationID|ProcessID|QueueID|SemaphoreID|T(?:askID|imerID))|en(?:D(?:oc(?:EditorsFolderType|FolderType|LibrariesFolderType|ShellPlugInsFolderType)|ropIconVariant)|FolderIcon(?:Resource)?|IconVariant)|tionUnicode)|r(?:Connections|dinalsSelector|namentSetsType)|therPluginFormat_(?:AU|Undefined|k(?:MAS|VST))|ut(?:OfResourceErr|putTextInUnicodeEncoding(?:Bit|Mask))|verla(?:ppingCharactersType|yWindowClass)|wne(?:dFolderIcon(?:Resource)?|r(?:I(?:D2Name|con)|Name2ID)))|P(?:CSTo(?:Device|PCS)|EF(?:AbsoluteExport|Co(?:deS(?:ection|ymbol)|nstantSection)|D(?:ataSymbol|ebugSection)|Ex(?:ceptionSection|ecDataSection|pSym(?:ClassShift|MaxNameOffset|NameOffsetMask))|FirstSectionHeaderOffset|Gl(?:obalShare|ueSymbol)|Hash(?:LengthShift|MaxLength|Slot(?:FirstKeyMask|Max(?:KeyIndex|SymbolCount)|SymCountShift)|ValueMask)|I(?:mpSym(?:ClassShift|MaxNameOffset|NameOffsetMask)|nitLibBeforeMask)|LoaderSection|P(?:ackedDataSection|kData(?:Block|Count5Mask|MaxCount5|OpcodeShift|Repeat(?:Block|Zero)?|VCount(?:EndMask|Mask|Shift)|Zero)|ro(?:cessShare|tectedShare))|Re(?:exportedImport|loc(?:B(?:asicOpcodeRange|ySect(?:C|D(?:WithSkip)?))|I(?:mportRun|ncrPosition(?:MaxOffset)?)|Lg(?:By(?:Import(?:MaxIndex)?|SectionSubopcode)|Repeat(?:Max(?:ChunkCount|RepeatCount))?|Set(?:OrBySection(?:MaxIndex)?|Sect(?:CSubopcode|DSubopcode)))|RunMaxRunLength|S(?:etPos(?:MaxOffset|ition)|m(?:By(?:Import|Section)|IndexMaxIndex|Repeat(?:Max(?:ChunkCount|RepeatCount))?|SetSect(?:C|D)))|TVector(?:12|8)|UndefinedOpcode|VTable8|WithSkipMax(?:RelocCount|SkipCount)))|T(?:OCSymbol|VectorSymbol|ag(?:1|2)|racebackSection)|Un(?:definedSymbol|packedDataSection)|Version|WeakImport(?:LibMask|SymMask))|M(?:AllocationFailure|Border(?:Double(?:Hairline|Thickline)|Single(?:Hairline|Thickline))|C(?:MYKColorSpaceModel|VMSymbolNotFound|ancel|loseFailed|overPage(?:After|Before|None)|reateMessageFailed)|D(?:ataFormatXML(?:Compressed|Default|Minimal)|e(?:leteSubTicketFailed|stination(?:F(?:ax|ile)|Invalid|Pr(?:eview|inter|ocessPDF))|vNColorSpaceModel)|o(?:cumentNotFound|ntSwitchPDEError)|uplex(?:No(?:Tumble|ne)|Tumble))|EditRequestFailed|F(?:eatureNotInstalled|ileOrDirOperationFailed|ontN(?:ameTooLong|otFound))|G(?:eneral(?:CGError|Error)|rayColorSpaceModel)|HideInlineItems|I(?:O(?:AttrNotAvailable|MSymbolNotFound)|n(?:ternalError|valid(?:Allocator|C(?:VMContext|alibrationTarget|onnection)|FileType|I(?:OMContext|ndex|tem)|Job(?:ID|Template)|Key|LookupSpec|Object|P(?:BMRef|DEContext|MContext|a(?:geFormat|per|rameter)|r(?:eset|int(?:Se(?:ssion|ttings)|er(?:Address|Info)?)))|Reply|S(?:tate|ubTicket)|T(?:icket|ype)|Value))|temIsLocked)|Job(?:Busy|Canceled|GetTicket(?:BadFormatError|ReadError)|ManagerAborted|NotFound|Stream(?:EndError|OpenFailed|ReadFailed))|Key(?:Not(?:Found|Unique)|OrValueNotFound)|La(?:ndscape|stErrorCodeToMakeMaintenanceOfThisListEasier|yout(?:BottomTop(?:LeftRight|RightLeft)|LeftRight(?:BottomTop|TopBottom)|RightLeft(?:BottomTop|TopBottom)|TopBottom(?:LeftRight|RightLeft)))|MessagingError|No(?:Default(?:Item|Printer|Settings)|Error|PrinterJobID|S(?:electedPrinters|uchEntry)|tImplemented)|O(?:bjectInUse|penFailed|utOfScope)|P(?:MSymbolNotFound|a(?:geToPaperMapping(?:None|ScaleToFit)|perType(?:Coated|Glossy|P(?:lain|remium)|T(?:Shirt|ransparency)|Unknown))|ermissionError|lugin(?:NotFound|RegisterationFailed)|ortrait|r(?:BrowserNoUI|int(?:AllPages|er(?:Idle|Processing|Stopped))))|Qu(?:ality(?:Best|Draft|Highest|InkSaver|Lowest|Normal|Photo)|eue(?:AlreadyExists|JobFailed|NotFound))|R(?:GBColorSpaceModel|e(?:ad(?:Failed|GotZeroData)|verse(?:Landscape|Portrait)))|S(?:caling(?:CenterOn(?:ImgArea|Paper)|Pin(?:Bottom(?:Left|Right)|Top(?:Left|Right)))|erver(?:A(?:lreadyRunning|ttributeRestricted)|CommunicationFailed|NotFound|Suspended)|how(?:DefaultInlineItems|Inline(?:Copies|Orientation|Pa(?:geRange(?:WithSelection)?|perSize)|Scale)|PageAttributesPDE)|implexTumble|t(?:atusFailed|ringConversionFailure)|ubTicketNotFound|yncRequestFailed)|T(?:emplateIsLocked|icket(?:IsLocked|TypeNotFound))|U(?:n(?:ableToFindProcess|expectedImagingError|known(?:ColorSpaceModel|DataType|Message)|locked|supportedConnection)|pdateTicketFailed|serOrGroupNotFound)|Val(?:idateTicketFailed|ueOutOfRange)|WriteFailed|XMLParseError)|OSIXError(?:Base|E(?:2BIG|A(?:CCES|DDR(?:INUSE|NOTAVAIL)|FNOSUPPORT|GAIN|LREADY|UTH)|B(?:AD(?:ARCH|EXEC|F|M(?:ACHO|SG)|RPC)|USY)|C(?:ANCELED|HILD|ONN(?:ABORTED|RE(?:FUSED|SET)))|D(?:E(?:ADLK|STADDRREQ|VERR)|OM|QUOT)|EXIST|F(?:AULT|BIG|TYPE)|HOST(?:DOWN|UNREACH)|I(?:DRM|LSEQ|N(?:PROGRESS|TR|VAL)|O|S(?:CONN|DIR))|LOOP|M(?:FILE|LINK|SGSIZE|ULTIHOP)|N(?:AMETOOLONG|E(?:EDAUTH|T(?:DOWN|RESET|UNREACH))|FILE|O(?:ATTR|BUFS|D(?:ATA|EV)|E(?:NT|XEC)|L(?:CK|INK)|M(?:EM|SG)|PROTOOPT|S(?:PC|R|TR|YS)|T(?:BLK|CONN|DIR|EMPTY|S(?:OCK|UP)|TY))|XIO)|O(?:PNOTSUPP|VERFLOW)|P(?:ERM|FNOSUPPORT|IPE|RO(?:C(?:LIM|UNAVAIL)|G(?:MISMATCH|UNAVAIL)|TO(?:NOSUPPORT|TYPE)?)|WROFF)|R(?:ANGE|EMOTE|OFS|PCMISMATCH)|S(?:H(?:LIBVERS|UTDOWN)|OCKTNOSUPPORT|PIPE|RCH|TALE)|T(?:IME(?:DOUT)?|OOMANYREFS|XTBSY)|USERS|XDEV))|ROP(?:A(?:LDirectionClass|NDirectionClass)|BNDirectionClass|C(?:SDirectionClass|anHang(?:LTMask|RBMask)|urrentVersion)|DirectionMask|E(?:NDirectionClass|SDirectionClass|TDirectionClass)|IsFloaterMask|L(?:DirectionClass|R(?:EDirectionClass|ODirectionClass))|N(?:SMDirectionClass|umDirectionClasses)|ONDirectionClass|P(?:DFDirectionClass|SDirectionClass|airOffset(?:Mask|S(?:hift|ign)))|R(?:DirectionClass|L(?:EDirectionClass|ODirectionClass)|ightConnectMask)|S(?:DirectionClass|ENDirectionClass)|Tag|UseRLPairMask|WSDirectionClass|ZeroReserved)|a(?:ckageAliasType|ge(?:DownCharCode|InMemory|OnDisk|UpCharCode)|nn(?:erParam_(?:Azimuth|CoordScale|Distance|Elevation|Gain|RefDistance)|ingMode_(?:SoundField|VectorBasedPanning))|r(?:amet(?:erEvent_(?:Immediate|Ramped)|ricEQParam_(?:CenterFreq|Gain|Q))|enthesisAnnotationSelector|tiallyConnectedSelector)|s(?:calStackBased|s(?:CallToChainErr|Selector|word(?:ChangedKCEvent(?:Mask)?)?)|teboard(?:ClientIsOwner|Flavor(?:No(?:Flags|tSaved)|Promised|RequestOnly|S(?:ender(?:Only|Translated)|ystemTranslated))|Modified|StandardLocation(?:Trash|Unknown)))|thKCItemAttr)|e(?:ncil(?:LeftUnicode|Unicode)|riod(?:AnnotationSelector|sToEllipsisO(?:ffSelector|nSelector)))|i(?:CharactersSelector|ctureD(?:ialogItem|ocumentsFolderType))|l(?:ain(?:DialogVariantCode|WindowClass)|otIconRefNo(?:Image|Mask|rmalFlags))|o(?:licyKCStopOn|rtKCItemAttr|s(?:2Offset|tCardEventErr)|wer(?:Handler(?:ExistsForDeviceErr|NotFoundFor(?:DeviceErr|ProcErr))|Mgt(?:MessageNotHandled|RequestDenied)|PC(?:ISA|RTA)))|r(?:e(?:MacOS91(?:A(?:ppl(?:eExtrasFolderType|icationsFolderType)|ssistantsFolderType|utomountedServersFolderType)|In(?:stallerLogsFolderType|ternetFolderType)|MacOSReadMesFolderType|StationeryFolderType|UtilitiesFolderType)|emptiveThread|f(?:erence(?:PanesFolderType|sFolder(?:AliasType|Icon(?:Resource)?|Type))|lightThenPause)|v(?:entOverlapO(?:ffSelector|nSelector)|ious(?:Body|WindowGroup)))|i(?:nt(?:Monitor(?:DocsFolder(?:AliasType|Type)|FolderIcon(?:Resource)?)|er(?:D(?:escriptionFolder(?:Icon|Type)|riverFolder(?:Icon|Type))|sFolderType)|ingPlugInsFolderType)|v(?:ateF(?:olderIcon(?:Resource)?|rameworksFolderType)|ilegeViolationException))|o(?:c(?:DescriptorIs(?:Absolute|Index|ProcPtr|Relative)|ess(?:DictionaryIncludeAllInformationMask|TransformTo(?:BackgroundApplication|ForegroundApplication|UIElementApplication)|orTempRoutineRequiresMPLib2))|gramTargetLevel_(?:Minus(?:2(?:0dB|3dB)|31dB)|None)|portional(?:CJKRomanSelector|IdeographsSelector|KanaSelector|NumbersSelector|TextSelector)|t(?:ected(?:ApplicationFolderIcon|SystemFolderIcon)|ocolKCItemAttr)))|ublic(?:Folder(?:Icon|Type)|KeyHashKCItemAttr|ThemeFontCount))|Q(?:D(?:C(?:orruptPICTDataErr|ursor(?:AlreadyRegistered|NotRegistered))|No(?:ColorHWCursorSupport|Palette))|LPreviewPDF(?:PagesWithThumbnailsOn(?:LeftStyle|RightStyle)|StandardStyle)|TSSUnknownErr|u(?:arterWidth(?:NumbersSelector|TextSelector)|estionMarkIcon|i(?:ck(?:LookFolderType|Time(?:ComponentsFolderType|ExtensionsFolderType))|t(?:AtNormalTimeMask|Before(?:FBAsQuitMask|NormalTimeMask|ShellQuitsMask|TerminatorAppQuitsMask)|N(?:everMask|otQuitDuring(?:InstallMask|LogoutMask))|OptionsMask))))|R(?:A(?:ATalkInactive|C(?:allBackFailed|on(?:figurationDBInitErr|nectionCanceled))|DuplicateIPAddr|ExtAuthenticationFailed|In(?:compatiblePrefs|itOpenTransportFailed|stallationDamaged|ternalError|valid(?:P(?:a(?:rameter|ssword)|ort(?:State)?)|SerialProtocol))|MissingResources|N(?:CPRejectedbyPeer|ot(?:Connected|Enabled|PrimaryInterface|Supported))|OutOfMemory|P(?:PP(?:AuthenticationFailed|NegotiationFailed|P(?:eerDisconnected|rotocolRejected)|UserDisconnected)|eerNotResponding|ort(?:Busy|SetupFailed))|RemoteAccessNotReady|StartupFailed|TCPIP(?:Inactive|NotConfigured)|U(?:nknown(?:PortState|User)|ser(?:InteractionRequired|LoginDisabled|Pwd(?:ChangeRequired|EntryRequired))))|a(?:dioButtonDialogItem|ndomParam_(?:Bound(?:A|B)|Curve)|reLigaturesO(?:ffSelector|nSelector))|dPermKCStatus|e(?:ad(?:ExtensionTermsMask|FailureErr|OnlyMemoryException|Reference|yThreadState)|busPicturesO(?:ffSelector|nSelector)|cent(?:ApplicationsFolder(?:Icon|Type)|DocumentsFolder(?:Icon|Type)|ItemsIcon|ServersFolder(?:Icon|Type))|d(?:irectedRelativeFolder|rawHighlighting)|gister(?:A(?:0|1|2|3|4|5|6)|Based|D(?:0|1|2|3|4|5|6|7)|Parameter(?:Mask|Phase|Size(?:Phase|Width)|W(?:hich(?:Phase|Width)|idth))|ResultLocation(?:Phase|Width))|lativeFolder|nderQuality_(?:High|Low|M(?:ax|edium|in))|quiredLigaturesO(?:ffSelector|nSelector)|s(?:FileNotOpened|o(?:lveAlias(?:FileNoUI|TryFileIDFirst)|urceControlDialogItem)|ultSize(?:Mask|Phase|Width))|turn(?:CharCode|Next(?:Group|U(?:G|ser)))|verb(?:2Param_(?:D(?:ecayTimeAt(?:0Hz|Nyquist)|ryWetMix)|Gain|M(?:axDelayTime|inDelayTime)|RandomizeReflections)|Param_(?:DryWetMix|Filter(?:Bandwidth|Enable|Frequency|Gain|Type)|Large(?:Brightness|De(?:lay(?:Range)?|nsity)|Size)|Modulation(?:Depth|Rate)|PreDelay|Small(?:Brightness|De(?:layRange|nsity)|LargeMix|Size))|RoomType_(?:Cathedral|Large(?:Chamber|Hall(?:2)?|Room(?:2)?)|Medium(?:Chamber|Hall(?:2|3)?|Room)|Plate|SmallRoom)))|ight(?:ArrowCharCode|ContainerArrowIcon|ToLeft)|o(?:gerBeepParam_(?:InGateThreshold(?:Time)?|OutGateThreshold(?:Time)?|Roger(?:Gain|Type)|Sensitivity)|lloverIconVariant|man(?:NumeralAnnotationSelector|izationTo(?:HiraganaSelector|KatakanaSelector))|otFolder|u(?:nd(?:TripAACParam_(?:BitRate|CompressedFormatSampleRate|EncodingStrategy|Format|Quality|RateOrQuality)|WindowDefinition|edBoxAnnotationSelector)|tin(?:e(?:DescriptorVersion|Is(?:DispatchedDefaultRoutine|NotDispatchedDefaultRoutine))|gResource(?:ID|Type))))|srcChain(?:AboveA(?:llMaps|pplicationMap)|Below(?:ApplicationMap|SystemMap))|u(?:byKana(?:O(?:ffSelector|nSelector)|Selector|Type)|nningThreadState))|S(?:C(?:BondStatus(?:LinkInvalid|No(?:Partner|tInActiveGroup)|OK|Unknown)|Network(?:Connection(?:Connect(?:ed|ing)|Disconnect(?:ed|ing)|Invalid|PPP(?:Authenticating|Connect(?:ed|ingLink)|Di(?:alOnTraffic|sconnect(?:ed|ingLink))|HoldingLinkOff|Initializing|Negotiating(?:Link|Network)|Suspended|Terminating|WaitingFor(?:CallBack|Redial)))|Flags(?:Connection(?:Automatic|Required)|I(?:nterventionRequired|s(?:Direct|LocalAddress))|Reachable|TransientConnection)|ReachabilityFlags(?:Connection(?:Automatic|On(?:Demand|Traffic)|Required)|I(?:nterventionRequired|s(?:Direct|LocalAddress|WWAN))|Reachable|TransientConnection))|PreferencesNotification(?:Apply|Commit)|Status(?:AccessError|Connection(?:Ignore|NoService)|Failed|InvalidArgument|KeyExists|Locked|MaxLink|N(?:eedLock|o(?:ConfigFile|Key|Link|PrefsSession|StoreSe(?:rver|ssion)|tifierActive))|OK|PrefsBusy|ReachabilityUnknown|Stale))|FNTLookup(?:S(?:egment(?:Array|Single)|i(?:mpleArray|ngleTable))|TrimmedArray|Vector)|K(?:DocumentState(?:AddPending|DeletePending|Indexed|NotIndexed)|Index(?:Inverted(?:Vector)?|Unknown|Vector)|Search(?:BooleanRanked|Option(?:Default|FindSimilar|NoRelevanceScores|SpaceMeansOR)|PrefixRanked|R(?:anked|equiredRanked)))|MPTETime(?:Running|Type(?:2(?:398|4|5|997(?:Drop)?)|30(?:Drop)?|5(?:0|994(?:Drop)?)|60(?:Drop)?)|Unknown|Valid)|O(?:AP(?:1999Schema|2001Schema)|CKS5NoAcceptableMethod)|R(?:A(?:lready(?:Finished|Listening|Released)|utoFinishingParam)|B(?:ad(?:Parameter|Selector)|lock(?:Background|Modally)|ufferTooSmall)|C(?:a(?:llBackParam|n(?:celOnSoundOut|ned22kHzSpeechSource|t(?:Add|GetProperty|ReadLanguageObject|Set(?:DuringRecognition|Property))))|leanupOnClientExit|omponentNotFound)|Default(?:Re(?:cognitionSystemID|jectionLevel)|SpeechSource)|E(?:nabled|xpansionTooDeep)|F(?:eedback(?:AndListeningModes|NotAvail)|oregroundOnly)|Has(?:FeedbackHasListenModes|NoSubItems)|I(?:dleRecognizer|nternalError)|Key(?:Expected|Word)|L(?:MObjType|anguageModel(?:Format|T(?:ooBig|ype))|i(?:stenKey(?:Combo|Mode|Name)|veDesktopSpeechSource))|M(?:odelMismatch|ustCancelSearch)|No(?:ClientLanguageModel|Feedback(?:HasListenModes|NoListenModes)|PendingUtterances|t(?:A(?:RecSystem|SpeechObject|vailable)|FinishedWithRejection|ImplementedYet|ListeningState|if(?:icationParam|yRecognition(?:Beginning|Done))))|O(?:ptional|therRecAlreadyModal|utOfMemory)|P(?:a(?:ramOutOfRange|th(?:Format|Type))|endingSearch|hrase(?:Format|Type))|Re(?:adAudio(?:FSSpec|URL)|cognition(?:Canceled|Done)|fCon|ject(?:able|edWord|ionLevel)|peatable)|S(?:earch(?:InProgress|StatusParam|WaitForAllClients)|ndInSourceDisconnected|oundInVolume|pe(?:edVsAccuracyParam|lling)|ubItemNotFound)|T(?:EXTFormat|ooManyElements)|Use(?:PushToTalk|ToggleListen)|W(?:ants(?:AutoFBGestures|ResultTextDrawn)|ord(?:NotFound|Type)))|S(?:LCiphersuiteGroup(?:ATS(?:Compatibility)?|Compatibility|Default|Legacy)|p(?:CantInstallErr|InternalErr|ParallelUpVectorErr|ScaleToZeroErr|VersionErr))|T(?:Class(?:DeletedGlyph|EndOf(?:Line|Text)|OutOfBounds)|KCrossStreamReset|LigActionMask|MarkEnd|NoAdvance|RearrVerbMask|SetMark|XHasLigAction)|c(?:heduledAudioSliceFlag_(?:BeganToRender(?:Late)?|Complete|Interrupt(?:AtLoop)?|Loop)|ientificInferiorsSelector|r(?:ap(?:ClearNamedScrap|Flavor(?:Mask(?:None|SenderOnly|Translated)|SizeUnknown|Type(?:Movie|Picture|Sound|Text(?:Style)?|U(?:TF16External|nicode(?:Style)?)))|GetNamedScrap|ReservedFlavorType)|eenSaversFolderType|ipt(?:CodeKCItemAttr|ingAdditionsFolder(?:Icon|Type)|sFolder(?:Icon|Type))|oll(?:Bars(?:AlwaysActive|SyncWithFocus)|Window(?:EraseToPortBackground|Invalidate|NoOptions))))|e(?:c(?:3DES192|A(?:ES(?:1(?:28|92)|256)|ccountItemAttr|dd(?:Event(?:Mask)?|ressItemAttr)|lias|uthenticationType(?:Any|D(?:PA|efault)|HT(?:MLForm|TP(?:Basic|Digest))|ItemAttr|MSN|NTLM|RPA))|C(?:S(?:BasicValidateOnly|C(?:alculateCMSDigest|heck(?:AllArchitectures|GatekeeperArchitectures|NestedCode|TrustedAnchors)|on(?:siderExpiration|tentInformation))|D(?:e(?:dicatedHost|faultFlags)|oNotValidate(?:Executable|Resources)|ynamicInformation)|EnforceRevocationChecks|FullReport|GenerateGuestHash|InternalInformation|NoNetworkAccess|QuickCheck|Re(?:portProgress|quirementInformation|strict(?:S(?:idebandData|ymlinks)|ToAppLike))|S(?:i(?:gningInformation|ngleThreaded)|kipResourceDirectory|trictValidate)|Use(?:AllArchitectures|SoftwareSigningCert)|ValidatePEH)|ert(?:EncodingItemAttr|TypeItemAttr|ificate(?:Encoding|ItemClass|Type))|o(?:deS(?:ignature(?:Adhoc|Enforcement|Force(?:Expiration|Hard|Kill)|H(?:ashSHA(?:1|256(?:Truncated)?|384|512)|ost)|LibraryValidation|NoHash|R(?:estrict|untime))|tatus(?:Debugged|Hard|Kill|Platform|Valid))|mmentItemAttr)|r(?:e(?:at(?:ionDateItemAttr|orItemAttr)|dentialType(?:Default|NoUI|WithUI))|l(?:Encoding|Type))|ustomIconItemAttr)|De(?:fault(?:ChangedEvent(?:Mask)?|KeySize)|leteEvent(?:Mask)?|s(?:criptionItemAttr|ignatedRequirementType))|EveryEventMask|Format(?:BSAFE|NetscapeCertSequence|OpenSSL|P(?:EMSequence|KCS(?:12|7))|RawKey|SSH(?:v2)?|Unknown|Wrapped(?:LSH|OpenSSL|PKCS8|SSH)|X509Cert)|G(?:eneric(?:ItemAttr|PasswordItemClass)|uestRequirementType)|Ho(?:norRoot|stRequirementType)|I(?:n(?:ternetPasswordItemClass|v(?:alidRequirementType|isibleItemAttr))|ssuerItemAttr|tem(?:PemArmour|Type(?:Aggregate|Certificate|P(?:rivateKey|ublicKey)|SessionKey|Unknown)))|Key(?:A(?:l(?:ias|waysSensitive)|pplicationTag)|De(?:crypt|rive)|E(?:ffectiveKeySize|n(?:crypt|dDate)|xtractable)|ImportOnlyOne|Key(?:C(?:lass|reator)|SizeInBits|Type)|Label|Modifiable|N(?:everExtractable|oAccessControl)|P(?:ermanent|ri(?:ntName|vate))|S(?:e(?:curePassphrase|nsitive)|ign(?:Recover)?|tartDate)|U(?:nwrap|sage(?:All|C(?:RLSign|ontentCommitment|ritical)|D(?:ataEncipherment|ecipherOnly|igitalSignature)|EncipherOnly|Key(?:Agreement|CertSign|Encipherment)|NonRepudiation|Unspecified))|Verify(?:Recover)?|Wrap|chain(?:ListChanged(?:Event|Mask)|Prompt(?:Invalid(?:Act)?|RequirePassphase|Unsigned(?:Act)?)))|L(?:abelItemAttr|ibraryRequirementType|ockEvent(?:Mask)?)|M(?:atchBits|odDateItemAttr)|N(?:egativeItemAttr|oGuest)|OptionReserved|P(?:a(?:dding(?:None|OAEP|PKCS1(?:MD(?:2|5)|SHA(?:1|2(?:24|56)|384|512))?|SigRaw)|sswordChangedEvent(?:Mask)?|thItemAttr)|luginRequirementType|ortItemAttr|r(?:eferencesDomain(?:Common|Dynamic|System|User)|ivateKeyItemClass|otocol(?:ItemAttr|Type(?:A(?:FP|ny|ppleTalk)|C(?:IFS|VSpserver)|DAAP|EPPC|FTP(?:Account|Proxy|S)?|HTTP(?:Proxy|S(?:Proxy)?)?|I(?:MAP(?:S)?|PP|RC(?:S)?)|LDAP(?:S)?|NNTP(?:S)?|POP3(?:S)?|RTSP(?:Proxy)?|S(?:M(?:B|TP)|OCKS|SH|VN)|Telnet(?:S)?)))|ublicKey(?:HashItemAttr|ItemClass))|R(?:SAM(?:ax|in)|e(?:adPermStatus|quirementTypeCount|vocation(?:CRLMethod|NetworkAccessDisabled|OCSPMethod|PreferCRL|RequirePositiveResponse|UseAnyAvailableMethod)))|S(?:criptCodeItemAttr|e(?:curityDomainItemAttr|r(?:ialNumberItemAttr|v(?:erItemAttr|iceItemAttr)))|ignatureItemAttr|ubject(?:ItemAttr|KeyIdentifierItemAttr)|ymmetricKeyItemClass)|T(?:r(?:ansform(?:Error(?:A(?:bort(?:InProgress|ed)|ttributeNotFound)|Invalid(?:Algorithm|Connection|Input(?:Dictionary)?|Length|Operation|Type)|M(?:issingParameter|oreThanOneOutput)|N(?:ameAlreadyRegistered|otInitializedCorrectly)|UnsupportedAttribute)|Invalid(?:Argument|Override)|MetaAttribute(?:CanCycle|Deferred|Externalize|Has(?:InboundConnection|OutboundConnections)|Name|Re(?:f|quire(?:d|sOutboundConnection))|Stream|Value)|OperationNotSupportedOnGroup|TransformIs(?:Executing|NotRegistered))|ust(?:Option(?:AllowExpired(?:Root)?|FetchIssuerFromNet|ImplicitAnchors|LeafIsCA|RequireRevPerCert|UseTrustSettings)|Result(?:Deny|FatalTrustFailure|Invalid|OtherError|Proceed|RecoverableTrustFailure|Unspecified)|Settings(?:ChangedEvent(?:Mask)?|Domain(?:Admin|System|User)|KeyUse(?:Any|EnDecrypt(?:Data|Key)|KeyExchange|Sign(?:Cert|Revocation|ature))|Result(?:Deny|Invalid|Trust(?:AsRoot|Root)|Unspecified))))|ypeItemAttr)|U(?:nlock(?:Event(?:Mask)?|StateStatus)|pdateEvent(?:Mask)?|seOnly(?:GID|UID))|VolumeItemAttr|WritePermStatus|ondScale|p(?:192r1|256r1|384r1|521r1)|urityDomainKCItemAttr)|lector(?:All(?:1BitData|32BitData|4BitData|8BitData|AvailableData|HugeData|LargeData|MiniData|SmallData)|Huge(?:1Bit|32Bit|4Bit|8Bit(?:Mask)?)|Large(?:1Bit|32Bit|4Bit|8Bit(?:Mask)?)|Mini(?:1Bit|4Bit|8Bit)|Small(?:1Bit|32Bit|4Bit|8Bit(?:Mask)?)|sAre(?:Indexable|NotIndexable))|quenceTrackProperty_(?:AutomatedParameters|LoopInfo|MuteStatus|OffsetTime|SoloStatus|T(?:imeResolution|rackLength))|r(?:ialNumberKCItemAttr|v(?:erKCItemAttr|ice(?:KCItemAttr|sFolderType)))|t(?:CLUT(?:ByValue|Immediately|WithLuminance)|DebugOption|FrontProcess(?:CausedByUser|FrontWindowOnly)|PowerLevel))|h(?:a(?:dowDialogVariantCode|r(?:ed(?:BadgeIcon|Folder(?:AliasType|Icon(?:Resource)?)|LibrariesFolder(?:Icon|Type)|UserDataFolderType)|ingPrivs(?:NotApplicableIcon|Read(?:OnlyIcon|WriteIcon)|UnknownIcon|WritableIcon)))|eet(?:AlertWindowClass|WindowClass)|ift(?:JIS_(?:BasicVariant|DOSVariant|MusicCDVariant)|Unicode)|o(?:rtcutIcon|w(?:DiacriticsSelector|HideInputWindow))|utdown(?:FolderType|Items(?:DisabledFolder(?:Icon|Type)|FolderIcon)))|i(?:deFloaterVariantCode|gn(?:KCItemAttr|atureKCItemAttr)|mpl(?:eWindowClass|ifiedCharactersSelector))|l(?:ash(?:ToDivideO(?:ffSelector|nSelector)|edZeroO(?:ffSelector|nSelector))|eep(?:De(?:mand|ny)|Now|Re(?:quest|voke)|Unlock|WakeUp))|ma(?:ll(?:1BitMask|32BitData|4Bit(?:Data|IconSize)|8Bit(?:Data|IconSize|Mask)|CapsSelector|IconSize)|rt(?:QuotesO(?:ffSelector|nSelector)|SwashType))|o(?:rt(?:AscendingIcon|DescendingIcon)|und(?:FileIcon|SetsFolderType))|p(?:a(?:ceCharCode|tial(?:Mixer(?:AttenuationCurve_(?:Exponential|Inverse|Linear|Power)|Param_(?:Azimuth|Distance|E(?:levation|nable)|G(?:ain|lobalReverbGain)|M(?:axGain|inGain)|O(?:bstructionAttenuation|cclusionAttenuation)|PlaybackRate|ReverbBlend)|RenderingFlags_(?:DistanceAttenuation|InterAuralDelay))|izationAlgorithm_(?:EqualPowerPanning|HRTF(?:HQ)?|S(?:oundField|phericalHead|tereoPassThrough)|VectorBasedPanning)))|e(?:ak(?:ableItemsFolder(?:Type)?|erConfiguration_(?:5_(?:0|1)|HeadPhones|Quad|Stereo))|cial(?:Case(?:CaretHook|DrawHook|EOLHook|GNEFilterProc|Hi(?:ghHook|tTestHook)|MBarHook|NWidthHook|ProtocolHandler|S(?:elector(?:Mask|Phase|Width)|ocketListener)|T(?:E(?:DoText|FindWord|Recalc)|extWidthHook)|WidthHook)?|Folder)|ech(?:FolderType|GenerateTune|InputMethodClass|Relative(?:Duration|Pitch)|ShowSyllables))|otlight(?:ImportersFolderType|MetadataCacheFolderType|SavedSearchesFolderType))|quaredLigaturesO(?:ffSelector|nSelector)|t(?:a(?:ck(?:DispatchedPascalStackBased|OverflowException|Parameter(?:Mask|Phase|Width))|ndardWindowDefinition|rt(?:DateKCItemAttr|up(?:Folder(?:AliasType|IconResource|Type)|Items(?:DisabledFolder(?:Icon|Type)|FolderIcon)))|ti(?:cTextDialogItem|oneryFolderType))|d(?:AlertDoNot(?:AnimateOn(?:Cancel|Default|Other)|CloseOnHelp|DisposeSheet)|C(?:FStringAlertVersion(?:One|Two)|ancelItemIndex)|OkItemIndex)|ereoMixerParam_(?:P(?:an|ost(?:AveragePower|PeakHoldLevel)|re(?:AveragePower|PeakHoldLevel))|Volume)|illIdle|o(?:p(?:Icon|pedThreadState)|red(?:BasicWindowDescriptionID|Window(?:PascalTitleID|SystemTag|TitleCFStringID)))|yl(?:eOptionsType|isticAlt(?:E(?:ight(?:O(?:ffSelector|nSelector)|eenO(?:ffSelector|nSelector))|levenO(?:ffSelector|nSelector))|F(?:i(?:fteenO(?:ffSelector|nSelector)|veO(?:ffSelector|nSelector))|our(?:O(?:ffSelector|nSelector)|teenO(?:ffSelector|nSelector)))|Nine(?:O(?:ffSelector|nSelector)|teenO(?:ffSelector|nSelector))|OneO(?:ffSelector|nSelector)|S(?:even(?:O(?:ffSelector|nSelector)|teenO(?:ffSelector|nSelector))|ix(?:O(?:ffSelector|nSelector)|teenO(?:ffSelector|nSelector)))|T(?:enO(?:ffSelector|nSelector)|h(?:irteenO(?:ffSelector|nSelector)|reeO(?:ffSelector|nSelector))|w(?:e(?:lveO(?:ffSelector|nSelector)|ntyO(?:ffSelector|nSelector))|oO(?:ffSelector|nSelector)))|ernativesType)))|u(?:b(?:jectKCItemAttr|stituteVerticalFormsO(?:ffSelector|nSelector))|p(?:eriorsSelector|ports(?:FileTranslation|ScrapTranslation))|spend(?:Demand|Re(?:quest|voke)|Wake(?:ToDoze|Up)))|washAlternatesO(?:ffSelector|nSelector)|y(?:m(?:Link(?:Creator|FileType)|bolLigaturesO(?:ffSelector|nSelector))|s(?:SWTooOld|tem(?:ControlPanelFolderType|D(?:esktopFolderType|omain)|E(?:ventKCEventMask|xtensionDisabledFolder(?:Icon|Type))|Folder(?:AliasType|Icon(?:Resource)?|Type)|IconsCreator|KCEvent|P(?:PDDomain|r(?:eferencesFolderType|ocess))|ResFile|S(?:ound(?:ID_(?:FlashScreen|UserPreferredAlert|Vibrate)|sFolderType)|uitcaseIcon)|TrashFolderType))))|T(?:EC(?:A(?:dd(?:F(?:allbackInterrupt(?:Bit|Mask)|orceASCIIChanges(?:Bit|Mask))|TextRunHeuristics(?:Bit|Mask))|rrayFullErr|vailable(?:EncodingsResType|SniffersResType))|B(?:adTextRunErr|ufferBelowMinimumSizeErr)|C(?:hinesePluginSignature|o(?:nversionInfoResType|rruptConverterErr))|Di(?:rectionErr|sable(?:Fallbacks(?:Bit|Mask)|LooseMappings(?:Bit|Mask)))|FallbackTextLengthFix(?:Bit|Mask)|GlobalsUnavailableErr|I(?:n(?:completeElementErr|foCurrentFormat|ternetName(?:DefaultUsageMask|StrictUsageMask|TolerantUsageMask|sResType))|temUnavailableErr)|JapanesePluginSignature|K(?:eepInfoFix(?:Bit|Mask)|oreanPluginSignature)|M(?:ailEncodingsResType|issingTableErr)|N(?:eedFlushStatus|oConversionPathErr)|OutputBufferFullStatus|P(?:artialCharErr|lugin(?:Creator|DispatchTable(?:CurrentVersion|Version1(?:_(?:1|2))?)|ManyToOne|OneTo(?:Many|One)|SniffObj|Type)|referredEncodingFix(?:Bit|Mask))|ResourceID|S(?:ignature|ubTextEncodingsResType)|T(?:able(?:ChecksumErr|FormatErr)|ext(?:RunBitClearFix(?:Bit|Mask)|ToUnicodeScanFix(?:Bit|Mask)))|U(?:n(?:icodePluginSignature|mappableElementErr)|sedFallbacksStatus)|WebEncodingsResType|_MIBEnumDontCare)|MTaskActive|RAK(?:CurrentVersion|Tag|UniformFormat)|SM(?:15Version|2(?:0Version|2Version|3Version|4Version)|Doc(?:Access(?:EffectiveRangeAttribute(?:Bit)?|FontSizeAttribute(?:Bit)?)|ument(?:EnabledInputSourcesPropertyTag|Input(?:ModePropertyTag|SourceOverridePropertyTag)|Property(?:SupportGlyphInfo|UnicodeInputWindow)|RefconPropertyTag|Support(?:DocumentAccessPropertyTag|GlyphInfoPropertyTag)|T(?:SMTEPropertyTag|extServicePropertyTag)|U(?:nicode(?:InputWindowPropertyTag|PropertyTag)|seFloatingWindowPropertyTag)|WindowLevelPropertyTag))|Hilite(?:BlockFillText|C(?:aretPosition|onvertedText)|NoHilite|OutlineText|RawText|Selected(?:ConvertedText|RawText|Text))|InsideOf(?:ActiveInputArea|Body)|OutsideOfBody|TEDocumentInterfaceType|Version)|XN(?:A(?:IFFFile|TSUI(?:Font(?:FeaturesAttribute|VariationsAttribute)|IsNotInstalledErr|Style(?:Continuous(?:Bit|Mask)|Size)?)|l(?:ign(?:CenterAction|LeftAction|RightAction)|lCountMask|readyInitializedErr|waysWrapAtViewEdge(?:Bit|Mask))|ttributeTagInvalidForRunErr|uto(?:Indent(?:O(?:ff|n)|StateTag)|Scroll(?:BehaviorTag|InsertionIntoView|Never|WhenInsertionVisible)|Wrap))|Ba(?:ckgroundTypeRGB|dDefaultFileTypeWarning)|C(?:annot(?:AddFrameErr|SetAutoIndentErr|TurnTSMOffWhenUsingUnicodeErr)|enter(?:Tab)?|hange(?:Font(?:Action|ColorAction|SizeAction)|StyleAction)|lear(?:Action|Th(?:eseFontFeatures|isControl))|o(?:lorContinuous(?:Bit|Mask)|pyNotAllowedInEchoModeErr)|utAction)|D(?:ataTypeNotAllowedErr|e(?:crementTypeSize|stinationRectKey)|isable(?:DragAndDrop(?:Bit|Mask|Tag)?|LayoutAndDraw(?:Tag)?|dFunctionalityErr)|o(?:FontSubstitution(?:Bit|Mask)?|NotInstallDragProcs(?:Bit|Mask)|nt(?:CareTypeS(?:ize|tyle)|Draw(?:CaretWhenInactive(?:Bit|Mask)?|SelectionWhenInactive(?:Bit|Mask)?)))|r(?:aw(?:CaretWhenInactive(?:Tag)?|GrowIcon(?:Bit|Mask)|Item(?:AllMask|Scrollbars(?:Bit|Mask)|Text(?:AndSelection(?:Bit|Mask)|Bit|Mask))|SelectionWhenInactive(?:Tag)?)|opAction))|En(?:able(?:DragAndDrop|LayoutAndDraw)|d(?:IterationErr|Offset)|tireWord(?:Bit|Mask))|F(?:l(?:attenMoviesTag|ush(?:Default|Left|Right))|o(?:nt(?:Continuous(?:Bit|Mask)|FeatureAction|SizeAttributeSize|VariationAction)|rceFullJust)|ullJust)|Horizontal(?:ScrollBarRectKey)?|I(?:OPrivilegesTag|gnoreCase(?:Bit|Mask)|llegalToCrossDataBoundariesErr|mageWithQD(?:Bit|Mask)|n(?:crementTypeSize|lineStateTag|valid(?:FrameIDErr|RunIndex)))|JustificationTag|L(?:eftT(?:ab|oRight)|in(?:eDirectionTag|k(?:NotPressed|Tracking|WasPressed)))|M(?:a(?:cOSEncoding|rginsTag)|o(?:nostyledText(?:Bit|Mask)|veAction)|ultiple(?:FrameType|StylesPerTextDocumentResType))|No(?:A(?:ppleEventHandlers(?:Bit|Mask)|utoWrap)|FontVariations|MatchErr|Selection(?:Bit|Mask)|TSMEver(?:Bit|Mask)|UserIOTag)|O(?:perationNotAllowedErr|utsideOf(?:FrameErr|LineErr))|Pa(?:geFrameType|steAction)|QDFont(?:ColorAttribute(?:Size)?|FamilyIDAttribute(?:Size)?|NameAttribute(?:Size)?|S(?:izeAttribute(?:Size)?|tyleAttribute(?:Size)?))|R(?:e(?:ad(?:Only(?:Bit|Mask)?|Write)|fConTag|startAppleEventHandlers(?:Bit|Mask))|i(?:chTextFormatData|ghtT(?:ab|oLeft))|un(?:Count(?:Bit|Mask)|IndexOutofBoundsErr))|S(?:aveStylesAsSTYLResource(?:Bit|Mask)|crollUnitsIn(?:Lines|Pixels|ViewRects)|election(?:O(?:ff|n)|StateTag)|how(?:End|Start|Window(?:Bit|Mask))|i(?:ngle(?:L(?:evelUndoTag|ineOnly(?:Bit|Mask))|StylePerTextDocumentResType)|zeContinuous(?:Bit|Mask))|omeOrAllTagsInvalidForRunErr|t(?:artOffset|yleContinuous(?:Bit|Mask))|upport(?:EditCommand(?:Processing|Updating)|FontCommand(?:Processing|Updating)|SpellCheckCommand(?:Processing|Updating))|ystemDefaultEncoding)|T(?:abSettingsTag|ext(?:Data|E(?:ditStyleFrameType|ncodingAttribute(?:Size)?)|File|InputCount(?:Bit|Mask)|RectKey|ensionFile)|ypingAction)|U(?:RLAttribute|n(?:doLastAction|icode(?:Encoding|Text(?:Data|File)))|se(?:Bottomline|C(?:arbonEvents|urrentSelection)|EncodingWordRules(?:Bit|Mask)|Inline|QDforImaging(?:Bit|Mask)|ScriptDefaultValue|rCanceledOperationErr))|V(?:ertical(?:ScrollBarRectKey)?|i(?:ewRectKey|sibilityTag))|W(?:ant(?:HScrollBar(?:Bit|Mask)|VScrollBar(?:Bit|Mask))|illDefaultTo(?:ATSUI(?:Bit|Mask)|CarbonEvent(?:Bit|Mask))|ordWrapStateTag))|a(?:bCharCode|llCapsSelector|sk(?:CreationException|TerminationException))|e(?:mporary(?:FolderType|ItemsIn(?:CacheDataFolderType|UserDomainFolderType))|xt(?:Center|Encoding(?:ANSEL|B(?:aseName|ig5(?:_(?:E|HKSCS_1999))?)|CNS_11643_92_P(?:1|2|3)|D(?:OS(?:Arabic|BalticRim|C(?:anadianFrench|hinese(?:Simplif|Trad)|yrillic)|Greek(?:1|2)?|Hebrew|Icelandic|Japanese|Korean|Latin(?:1|2|US)|Nordic|Portuguese|Russian|T(?:hai|urkish))|efault(?:Format|Variant))|E(?:BCDIC_(?:CP037|LatinCore|US)|UC_(?:CN|JP|KR|TW))|F(?:ormatName|ullName)|GB(?:K_95|_(?:18030_200(?:0|5)|2312_80))|HZ_GB_2312|ISO(?:10646_1993|Latin(?:1(?:0)?|2|3|4|5|6|7|8|9|Arabic|Cyrillic|Greek|Hebrew)|_2022_(?:CN(?:_EXT)?|JP(?:_(?:1|2|3))?|KR))|JIS_(?:C6226_78|X02(?:0(?:1_76|8_(?:83|90))|1(?:2_90|3_MenKuTen)))|K(?:OI8_(?:R|U)|SC_5601_(?:87|92_Johab))|M(?:ac(?:Ar(?:abic|menian)|B(?:engali|urmese)|C(?:e(?:ltic|ntralEurRoman)|hinese(?:Simp|Trad)|roatian|yrillic)|D(?:evanagari|ingbats)|E(?:astEurRoman|thiopic|xtArabic)|Farsi|G(?:aelic|e(?:ez|orgian)|reek|u(?:jarati|rmukhi))|H(?:FS|ebrew)|I(?:celandic|nuit)|Japanese|K(?:annada|eyboardGlyphs|hmer|orean)|Laotian|M(?:alayalam|ongolian)|Oriya|R(?:Symbol|oman(?:Latin1|ian)?)|S(?:i(?:mpChinese|nhalese)|ymbol)|T(?:amil|elugu|hai|ibetan|radChinese|urkish)|U(?:krainian|ni(?:code|nterp))|V(?:T100|ietnamese))|ultiRun)|NextStep(?:Japanese|Latin)|ShiftJIS(?:_X0213(?:_00)?)?|U(?:S_ASCII|n(?:icode(?:Default|V(?:1(?:0_0|1_0|2_1|_1)|2_(?:0|1)|3_(?:0|1|2)|4_0|5_(?:0|1)|6_(?:0|1|3)|7_0|8_0|9_0))|known))|V(?:ISCII|ariantName)|Windows(?:A(?:NSI|rabic)|BalticRim|Cyrillic|Greek|Hebrew|KoreanJohab|Latin(?:1|2|5)|Vietnamese)|sFolder(?:Icon|Type))|Flush(?:Default|Left|Right)|LanguageDontCare|MalformedInputErr|RegionDontCare|S(?:criptDontCare|ervice(?:Class|DocumentInterfaceType|InputModePropertyTag|JaTypingMethodPropertyTag)?|pacingType)|ToSpeech(?:SynthType|Voice(?:BundleType|FileType|Type))|Un(?:definedElementErr|supportedEncodingErr)))|h(?:eme(?:A(?:ctive(?:Alert(?:BackgroundBrush|TextColor)|BevelButtonTextColor|D(?:ialog(?:BackgroundBrush|TextColor)|ocumentWindowTitleTextColor)|M(?:enuItemTextColor|o(?:delessDialog(?:BackgroundBrush|TextColor)|vableModalWindowTitleTextColor))|P(?:lacardTextColor|opup(?:ArrowBrush|ButtonTextColor|LabelTextColor|WindowTitleColor)|ushButtonTextColor)|RootMenuTextColor|ScrollBarDelimiterBrush|UtilityWindow(?:BackgroundBrush|TitleTextColor)|WindowHeaderTextColor)|dornment(?:Arrow(?:Do(?:ubleArrow|wnArrow)|LeftArrow|RightArrow|UpArrow)|D(?:efault|rawIndicatorOnly)|Focus|Header(?:Button(?:LeftNeighborSelected|NoS(?:hadow|ortArrow)|RightNeighborSelected|S(?:hadowOnly|ortUp))|MenuButton)|No(?:Shadow|ne)|RightToLeft|ShadowOnly)|l(?:ert(?:HeaderFont|Window)|iasArrowCursor)|pp(?:earanceFileNameTag|l(?:eGuideCoachmarkBrush|icationFont))|rrow(?:3pt|5pt|7pt|9pt|Button(?:Mini|Small)?|Cursor|Down|Left|Right|Up))|B(?:ackground(?:ListViewWindowHeader|Metal|Placard|SecondaryGroupBox|TabPane|WindowHeader)|evelButton(?:Inset|Large|Medium|Small)?|ottom(?:InsideArrowPressed|OutsideArrowPressed|TrackPressed)|rush(?:A(?:ctiveAreaFill|l(?:ertBackground(?:Active|Inactive)|ternatePrimaryHighlightColor)|ppleGuideCoachmark)|B(?:evel(?:Active(?:Dark|Light)|Inactive(?:Dark|Light))|lack|utton(?:Active(?:Dark(?:Highlight|Shadow)|Light(?:Highlight|Shadow))|F(?:ace(?:Active|Inactive|Pressed)|rame(?:Active|Inactive))|Inactive(?:Dark(?:Highlight|Shadow)|Light(?:Highlight|Shadow))|Pressed(?:Dark(?:Highlight|Shadow)|Light(?:Highlight|Shadow))))|ChasingArrows|D(?:ialogBackground(?:Active|Inactive)|ocumentWindowBackground|ra(?:gHilite|werBackground))|F(?:inderWindowBackground|ocusHighlight)|IconLabelBackground(?:Selected)?|ListView(?:Background|ColumnDivider|EvenRowBackground|OddRowBackground|S(?:eparator|ortColumnBackground))|M(?:enuBackground(?:Selected)?|o(?:delessDialogBackground(?:Active|Inactive)|vableModalBackground))|NotificationWindowBackground|P(?:assiveAreaFill|opupArrow(?:Active|Inactive|Pressed)|rimaryHighlightColor)|S(?:crollBarDelimiter(?:Active|Inactive)|econdaryHighlightColor|heetBackground(?:Opaque|Transparent)?|taticAreaFill)|ToolbarBackground|UtilityWindowBackground(?:Active|Inactive)|White)|utton(?:Mixed|O(?:ff|n)))|C(?:h(?:asingArrowsBrush|eckBox(?:C(?:heckMark|lassicX)|Mini|Small)?)|losedHandCursor|o(?:mboBox(?:Mini|Small)?|nt(?:extualMenuArrowCursor|rolSoundsMask)|pyArrowCursor|unting(?:DownHandCursor|Up(?:AndDownHandCursor|HandCursor)))|rossCursor|u(?:rrentPortFont|stomThemesFileType))|D(?:ataFileType|blClickCollapseTag|e(?:faultAdornment|sktopP(?:attern(?:NameTag|Tag)|icture(?:Ali(?:asTag|gnmentTag)|NameTag)))|i(?:alogWindow|s(?:abled(?:MenuItemTextColor|RootMenuTextColor)|closure(?:Button|Down|Left|Right|Triangle)))|ocumentWindow(?:BackgroundBrush)?|ra(?:g(?:HiliteBrush|Sound(?:Dragging|Grow(?:UtilWindow|Window)|Move(?:Alert|Dialog|Icon|UtilWindow|Window)|None|S(?:crollBar(?:Arrow(?:Decreasing|Increasing)|Ghost|Thumb)|lider(?:Ghost|Thumb))))|w(?:IndicatorOnly|erWindow)))|E(?:mphasizedSystemFont|xamplePictureIDTag)|F(?:inder(?:SoundsMask|WindowBackgroundBrush)|ocus(?:Adornment|HighlightBrush))|Grow(?:Down|Left|Right|Up)|HighlightColor(?:NameTag|Tag)|I(?:BeamCursor|conLabel(?:BackgroundBrush|TextColor)|n(?:active(?:Alert(?:BackgroundBrush|TextColor)|BevelButtonTextColor|D(?:ialog(?:BackgroundBrush|TextColor)|ocumentWindowTitleTextColor)|Mo(?:delessDialog(?:BackgroundBrush|TextColor)|vableModalWindowTitleTextColor)|P(?:lacardTextColor|opup(?:ArrowBrush|ButtonTextColor|LabelTextColor|WindowTitleColor)|ushButtonTextColor)|ScrollBarDelimiterBrush|UtilityWindow(?:BackgroundBrush|TitleTextColor)|WindowHeaderTextColor)|cDecButton(?:Mini|Small)?|determinateBar(?:Large|M(?:edium|ini))?))|L(?:a(?:belFont|rge(?:BevelButton|IndeterminateBar|ProgressBar|RoundButton|TabHeight(?:Max)?))|eft(?:InsideArrowPressed|OutsideArrowPressed|TrackPressed)|ist(?:HeaderButton|View(?:BackgroundBrush|S(?:eparatorBrush|ortColumnBackgroundBrush)|TextColor)))|M(?:e(?:dium(?:BevelButton|IndeterminateBar|ProgressBar|S(?:crollBar|lider))|nu(?:Active|Bar(?:Inactive|Normal|Selected)|Disabled|Item(?:A(?:lignRight|t(?:Bottom|Top))|CmdKeyFont|Font|H(?:asIcon|ier(?:Background|archical))|MarkFont|NoBackground|P(?:lain|opUpBackground)|Scroll(?:DownArrow|UpArrow))|S(?:elected|oundsMask|quareMenuBar)|T(?:itleFont|ype(?:Hierarchical|Inactive|P(?:opUp|ullDown))))|tric(?:B(?:estListHeaderHeight|uttonRounded(?:Height|RecessedHeight))|C(?:heckBox(?:GlyphHeight|Height|Width)|omboBox(?:Large(?:BottomShadowOffset|DisclosureWidth|RightShadowOffset)|Mini(?:BottomShadowOffset|DisclosureWidth|RightShadowOffset)|Small(?:BottomShadowOffset|DisclosureWidth|RightShadowOffset)))|Disclosure(?:Button(?:Height|Size|Width)|Triangle(?:Height|Width))|EditText(?:FrameOutset|Whitespace)|FocusRectOutset|HSlider(?:Height|Tick(?:Height|Offset))|ImageWellThickness|L(?:arge(?:ProgressBarThickness|RoundButtonSize|Tab(?:CapsWidth|Height))|i(?:st(?:BoxFrameOutset|HeaderHeight)|ttleArrows(?:Height|Mini(?:Height|Width)|Small(?:Height|Width)|Width)))|M(?:enu(?:ExcludedMarkColumnWidth|I(?:conTrailingEdgeMargin|ndentWidth)|Mark(?:ColumnWidth|Indent)|Text(?:LeadingEdgeMargin|TrailingEdgeMargin))|ini(?:CheckBox(?:Height|Width)|DisclosureButton(?:Height|Width)|HSlider(?:Height|MinThumbWidth|Tick(?:Height|Offset))|P(?:opupButtonHeight|u(?:llDownHeight|shButtonHeight))|RadioButton(?:Height|Width)|Tab(?:CapsWidth|FrameOverlap|Height|Overlap)|VSlider(?:MinThumbHeight|Tick(?:Offset|Width)|Width)))|NormalProgressBarThickness|P(?:aneSplitterHeight|opupButtonHeight|r(?:imaryGroupBoxContentInset|ogressBar(?:ShadowOutset|Thickness))|u(?:llDownHeight|shButtonHeight))|R(?:adioButton(?:GlyphHeight|Height|Width)|e(?:levanceIndicatorHeight|sizeControlHeight)|ound(?:ButtonSize|TextField(?:Content(?:Height|Inset(?:Bottom|Left|Right|Top|WithIcon(?:Left|Right)))|MiniContent(?:Height|Inset(?:Bottom|Left|Right|Top|WithIcon(?:Left|Right)))|SmallContent(?:Height|Inset(?:Bottom|Left|Right|Top|WithIcon(?:Left|Right))))))|S(?:crollBar(?:MinThumb(?:Height|Width)|Overlap|Width)|e(?:condaryGroupBoxContentInset|paratorSize)|liderMinThumb(?:Height|Width)|mall(?:CheckBox(?:Height|Width)|DisclosureButton(?:Height|Width)|HSlider(?:Height|MinThumbWidth|Tick(?:Height|Offset))|P(?:aneSplitterHeight|opupButtonHeight|rogressBar(?:ShadowOutset|Thickness)|u(?:llDownHeight|shButtonHeight))|R(?:adioButton(?:Height|Width)|esizeControlHeight)|ScrollBar(?:MinThumb(?:Height|Width)|Width)|Tab(?:CapsWidth|FrameOverlap|Height|Overlap)|VSlider(?:MinThumbHeight|Tick(?:Offset|Width)|Width)))|T(?:ab(?:FrameOverlap|IndentOrStyle|Overlap)|extured(?:PushButtonHeight|SmallPushButtonHeight)|itleBarControlsHeight)|VSlider(?:Tick(?:Offset|Width)|Width)))|ini(?:CheckBox|IndeterminateBar|ProgressBar|RadioButton|S(?:crollBar|lider|ystemFont))|ovable(?:AlertWindow|DialogWindow))|N(?:ameTag|o(?:Adornment|Sounds|rmal(?:CheckBox|RadioButton)|tAllowedCursor))|OpenHandCursor|P(?:l(?:a(?:inDialogWindow|tinumFileType)|usCursor)|o(?:intingHandCursor|ofCursor|pup(?:Button(?:Mini|Normal|Small)?|Tab(?:CenterOn(?:Offset|Window)|NormalPosition)|Window))|r(?:essed(?:BevelButtonTextColor|P(?:lacardTextColor|opup(?:ArrowBrush|ButtonTextColor)|ushButtonTextColor))|ogressBar(?:Large|M(?:edium|ini))?)|ushButton(?:Font|Inset(?:Small)?|Mini|Normal|Small|Textured(?:Small)?)?)|R(?:adioButton(?:Mini|Small)?|e(?:levanceBar|size(?:DownCursor|Left(?:Cursor|RightCursor)|RightCursor|Up(?:Cursor|DownCursor)))|ight(?:InsideArrowPressed|OutsideArrowPressed|T(?:oLeftAdornment|rackPressed))|ound(?:Button(?:Help|Large)?|edBevelButton))|S(?:avvyMenuResponse|crollBar(?:Arrow(?:StyleTag|s(?:LowerRight|Single))|M(?:edium|ini)|Small|Thumb(?:Normal|Proportional|StyleTag))?|elected(?:MenuItemTextColor|RootMenuTextColor)|h(?:adowDialogWindow|eetWindow)|lider(?:M(?:edium|ini)|Small)?|m(?:all(?:BevelButton|CheckBox|EmphasizedSystemFont|RadioButton|S(?:crollBar|lider|ystemFont(?:Tag)?)|TabHeight(?:Max)?)|oothFont(?:EnabledTag|MinSizeTag))|ound(?:Alert(?:Close|Open)|B(?:alloon(?:Close|Open)|evel(?:E(?:nter|xit)|Press|Release)|utton(?:E(?:nter|xit)|Press|Release))|C(?:ancelButton(?:E(?:nter|xit)|Press|Release)|heckbox(?:E(?:nter|xit)|Press|Release)|opyDone)|D(?:efaultButton(?:E(?:nter|xit)|Press|Release)|i(?:alog(?:Close|Open)|s(?:closure(?:E(?:nter|xit)|Press|Release)|k(?:Eject|Insert)))|ragTarget(?:Drop|Hilite|Unhilite))|EmptyTrash|FinderDragO(?:ffIcon|nIcon)|L(?:aunchApp|ittleArrow(?:Dn(?:Press|Release)|E(?:nter|xit)|Up(?:Press|Release)))|M(?:askTag|enu(?:Close|Item(?:Hilite|Release)|Open))|N(?:ewItem|one)|Popup(?:E(?:nter|xit)|Press|Release|Window(?:Close|Open))|R(?:adio(?:E(?:nter|xit)|Press|Release)|e(?:ceiveDrop|solveAlias))|S(?:croll(?:Arrow(?:E(?:nter|xit)|Press|Release)|EndOfTrack|TrackPress)|electItem|lider(?:EndOfTrack|TrackPress))|T(?:ab(?:E(?:nter|xit)|Pressed|Release)|rack(?:FileType|NameTag))|UtilWin(?:C(?:lose(?:E(?:nter|xit)|Press|Release)|ollapse(?:E(?:nter|xit)|Press|Release))|DragBoundary|Zoom(?:E(?:nter|xit)|Press|Release)|dow(?:Activate|C(?:lose|ollapse(?:Down|Up))|Open|Zoom(?:In|Out)))|Window(?:Activate|C(?:lose(?:E(?:nter|xit)|Press|Release)?|ollapse(?:Down|E(?:nter|xit)|Press|Release|Up))|DragBoundary|Open|Zoom(?:E(?:nter|xit)|In|Out|Press|Release))|sEnabledTag)|p(?:ecifiedFont|inningCursor)|tate(?:Active|Disabled|Inactive|Pressed(?:Down|Up)?|Rollover|Unavailable(?:Inactive)?)|ystemFont(?:Detail(?:Emphasized)?|Tag)?)|T(?:ab(?:East|Front(?:Inactive|Unavailable)?|No(?:nFront(?:Inactive|Pressed|Unavailable)?|rth)|PaneOverlap|South|West)|extColor(?:Alert(?:Active|Inactive)|B(?:evelButton(?:Active|Inactive|Pressed|Sticky(?:Active|Inactive))|lack)|D(?:ialog(?:Active|Inactive)|ocumentWindowTitle(?:Active|Inactive))|IconLabel(?:Selected)?|ListView|M(?:enuItem(?:Active|Disabled|Selected)|o(?:delessDialog(?:Active|Inactive)|vableModalWindowTitle(?:Active|Inactive)))|Notification|P(?:lacard(?:Active|Inactive|Pressed)|opup(?:Button(?:Active|Inactive|Pressed)|Label(?:Active|Inactive)|WindowTitle(?:Active|Inactive))|ushButton(?:Active|Inactive|Pressed))|RootMenu(?:Active|Disabled|Selected)|SystemDetail|Tab(?:Front(?:Active|Inactive)|NonFront(?:Active|Inactive|Pressed))|UtilityWindowTitle(?:Active|Inactive)|W(?:hite|indowHeader(?:Active|Inactive)))|humb(?:Downward|P(?:lain|ressed)|Upward)|o(?:olbarFont|p(?:InsideArrowPressed|OutsideArrowPressed|TrackPressed))|rack(?:Active|Disabled|H(?:asFocus|ideTrack|orizontal)|Inactive|No(?:ScrollBarArrows|thingToScroll)|RightToLeft|ShowThumb|ThumbRgnIsNotGhost))|U(?:serDefinedTag|tility(?:SideWindow|Window(?:TitleFont)?))|V(?:ariant(?:BaseTintTag|NameTag)|iewsFont(?:SizeTag|Tag)?)|W(?:atchCursor|i(?:dget(?:C(?:loseBox|ollapseBox)|DirtyCloseBox|ToolbarButton|ZoomBox)|ndow(?:Has(?:C(?:loseBox|ollapseBox)|Dirty|FullZoom|Grow|HorizontalZoom|T(?:itleText|oolbarButton)|VerticalZoom)|IsCollapsed|SoundsMask|TitleFont)))|sFolderType)|i(?:nkCStackBased|rdWidth(?:NumbersSelector|TextSelector))|umbnail(?:32BitData|8BitMask))|i(?:ckScale|le(?:IconVariant|dOnScreen)|mePitchParam_(?:EffectBlend|Pitch|Rate)|tlingCapsSelector)|oo(?:ManyIOWindowsErr|lbar(?:A(?:dvancedIcon|pplicationsFolderIcon)|CustomizeIcon|D(?:e(?:leteIcon|sktopFolderIcon)|o(?:cumentsFolderIcon|wnloadsFolderIcon))|FavoritesIcon|HomeIcon|InfoIcon|L(?:abelsIcon|ibraryFolderIcon)|M(?:ovieFolderIcon|usicFolderIcon)|P(?:icturesFolderIcon|ublicFolderIcon)|SitesFolderIcon|UtilitiesFolderIcon|WindowClass))|r(?:a(?:c(?:eException|kMouseLocationOption(?:DontConsumeMouseUp|IncludeScrollWheel))|ditional(?:Alt(?:F(?:iveSelector|ourSelector)|OneSelector|T(?:hreeSelector|woSelector))|CharactersSelector|NamesCharactersSelector)|ns(?:codingCompositionO(?:ffSelector|nSelector)|form(?:Disabled|Label(?:1|2|3|4|5|6|7)|None|O(?:ffline|pen)|Selected(?:Disabled|O(?:ffline|pen))?)|l(?:at(?:e(?:Get(?:FileTranslationList|ScrapTranslationList(?:ConsideringData)?|TranslatedFilename)|Identify(?:File|Scrap)|Translate(?:File|Scrap))|ion(?:DataTranslation|FileTranslation|ScrapProgressDialogID)|orCanGenerateFilename)|iterationType)|parentEncod(?:edPixel|ing(?:Shift)?))|pException|sh(?:FolderType|Icon(?:Resource)?))|ueType(?:F(?:latFontIcon|ontIcon)|MultiFlatFontIcon)|yAuthenticate)|wo(?:ByteCode|WayEncryptPassword)|yp(?:eKCItemAttr|ographicExtrasType))|U(?:AZoomFocusType(?:InsertionPoint|Other)|C(?:BidiCat(?:ArabicNumber|B(?:lockSeparator|oundaryNeutral)|CommonNumberSeparator|EuroNumber(?:Separator|Terminator)?|FirstStrongIsolate|LeftRight(?:Embedding|Isolate|Override)?|No(?:nSpacingMark|tApplicable)|OtherNeutral|PopDirectional(?:Format|Isolate)|RightLeft(?:Arabic|Embedding|Isolate|Override)?|SegmentSeparator|Whitespace)|C(?:harPropType(?:BidiCategory|CombiningClass|DecimalDigitValue|GenlCategory)|ollate(?:C(?:aseInsensitiveMask|omposeInsensitiveMask)|Di(?:acritInsensitiveMask|gits(?:AsNumberMask|OverrideMask))|PunctuationSignificantMask|StandardOptions|Type(?:HFSExtended|Mask|S(?:hiftBits|ourceMask))|WidthInsensitiveMask))|GenlCat(?:Letter(?:Lowercase|Modifier|Other|Titlecase|Uppercase)|Mark(?:Enclosing|NonSpacing|SpacingCombining)|Number(?:DecimalDigit|Letter|Other)|Other(?:Control|Format|NotAssigned|PrivateUse|Surrogate)|Punct(?:C(?:lose|onnector)|Dash|FinalQuote|InitialQuote|O(?:pen|ther))|S(?:eparator(?:Line|Paragraph|Space)|ymbol(?:Currency|M(?:ath|odifier)|Other)))|HighSurrogateRange(?:End|Start)|Key(?:Action(?:AutoKey|D(?:isplay|own)|Up)|Layout(?:FeatureInfoFormat|HeaderFormat)|ModifiersToTableNumFormat|Output(?:GetIndexMask|S(?:equenceIndexMask|tateIndexMask)|TestForIndexMask)|S(?:equenceDataIndexFormat|tate(?:Entry(?:RangeFormat|TerminalFormat)|RecordsIndexFormat|TerminatorsFormat))|T(?:oCharTableIndexFormat|ranslateNoDeadKeys(?:Bit|Mask)))|LowSurrogateRange(?:End|Start)|OutputBufferTooSmall|T(?:S(?:Direction(?:Next|Previous)|NoKeysAddedToObjectErr|Options(?:DataIsOrderedMask|NoneMask|ReleaseStringMask)|SearchListErr)|extBreak(?:C(?:harMask|lusterMask)|GoBackwardsMask|IterateMask|L(?:eadingEdgeMask|ineMask|ocatorMissingType)|ParagraphMask|WordMask)|oken(?:NotFound|izer(?:IterationFinished|UnknownLang))|ypeSelectMaxListSize))|I(?:Mode(?:All(?:Hidden|Suppressed)|Content(?:Hidden|Suppressed)|Normal)|Option(?:A(?:nimateMenuBar|utoShowMenuBar)|Disable(?:AppleMenu|ForceQuit|Hide|MenuBarTransparency|ProcessSwitch|SessionTerminate)))|RL(?:68kNotSupportedError|A(?:bort(?:Initiated(?:Event|Mask)|ingState)|ccessNotAvailableError|ll(?:BufferEventsMask|EventsMask|NonBufferEventsMask)|uthenticationError)|BinHexFileFlag|Co(?:mpleted(?:Event(?:Mask)?|State)|nnectingState)|D(?:ataAvailable(?:Event(?:Mask)?|State)|e(?:binhexOnlyFlag|stinationExistsError)|i(?:rectoryListingFlag|splay(?:AuthFlag|ProgressFlag))|o(?:Not(?:DeleteOnErrorFlag|TryAnonymousFlag)|wnloading(?:Event|Mask|State)))|E(?:rrorOccurred(?:Event(?:Mask)?|State)|x(?:pand(?:AndVerifyFlag|FileFlag)|tensionFailureError))|FileEmptyError|I(?:n(?:itiat(?:edEvent(?:Mask)?|ingState)|valid(?:C(?:allError|onfigurationError)|URL(?:Error|ReferenceError)))|sDirectoryHintFlag)|LookingUpHostState|N(?:oAutoRedirectFlag|ullState)|P(?:er(?:centEvent(?:Mask)?|iodicEvent(?:Mask)?)|ro(?:gressAlreadyDisplayedError|perty(?:BufferTooSmallError|ChangedEvent(?:Mask)?|NotYetKnownError)))|Re(?:placeExistingFlag|s(?:ervedFlag|ourceFound(?:Event(?:Mask)?|State)|umeDownloadFlag))|S(?:erverBusyError|ystemEvent(?:Mask)?)|TransactionComplete(?:Event(?:Mask)?|State)|U(?:n(?:knownPropertyError|s(?:ettablePropertyError|upportedSchemeError))|pload(?:Flag|ing(?:Event|Mask|State))))|SB(?:A(?:bortedError|lreadyOpenErr)|B(?:adDispatchTable|itstufErr|uf(?:OvrRunErr|UnderRunErr))|C(?:RCErr|ompletionError)|D(?:ataToggleErr|evice(?:Busy|Disconnected|Err|NotSuspended|PowerProblem|Suspended))|EndpointStallErr|FlagsError|In(?:correctTypeErr|ternal(?:Err|Reserved(?:1(?:0)?|2|3|4|5|6|7|8|9))|validBuffer)|LinkErr|No(?:BandwidthError|De(?:lay|viceErr)|Err|Tran|t(?:Found|Handled|RespondingErr|Sent(?:1Err|2Err)))|O(?:utOfMemoryErr|verRunErr)|P(?:B(?:LengthError|VersionError)|IDCheckErr|ending|ipe(?:IdleError|StalledError)|ortDisabled)|Queue(?:Aborted|Full)|R(?:es(?:1Err|2Err)|qErr)|T(?:imedOut|ooMany(?:PipesErr|TransactionsErr))|Un(?:derRunErr|known(?:DeviceErr|InterfaceErr|Notification|PipeErr|RequestErr))|WrongPIDErr)|TC(?:DefaultOptions|OverflowErr|UnderflowErr)|YVY422PixelFormat|n(?:connectedSelector|icode(?:16BitFormat|32BitFormat|ByteOrderMark|C(?:anonical(?:CompVariant|DecompVariant)|ollationClass)|D(?:e(?:compositionType|faultDirection(?:Mask)?)|irectionality(?:Bits|Mask)|ocument(?:InterfaceType)?)|F(?:allback(?:Custom(?:First|Only)|Default(?:First|Only)|InterruptSafeMask|Sequencing(?:Bits|Mask))|orceASCIIRange(?:Bit|Mask))|HFSPlus(?:CompVariant|DecompVariant)|Keep(?:Info(?:Bit|Mask)|SameEncoding(?:Bit|Mask))|L(?:eftToRight(?:Mask)?|ooseMappings(?:Bit|Mask))|Ma(?:pLineFeedToReturn(?:Bit|Mask)|tch(?:Other(?:Base(?:Bit|Mask)|Format(?:Bit|Mask)|Variant(?:Bit|Mask))|Unicode(?:Base(?:Bit|Mask)|Format(?:Bit|Mask)|Variant(?:Bit|Mask)))|xDecomposedVariant)|No(?:Co(?:mp(?:atibilityVariant|osedVariant)|rporateVariant)|HalfwidthChars(?:Bit|Mask)|Subset|rmalizationForm(?:C|D)|t(?:AChar|FromInputMethod))|ObjectReplacement|R(?:eplacementChar|ightToLeft(?:Mask)?)|S(?:CSUFormat|tringUnterminated(?:Bit|Mask)|wappedByteOrderMark)|Text(?:BreakClass|Run(?:Bit|Heuristics(?:Bit|Mask)|Mask))|U(?:TF(?:16(?:BEFormat|Format|LEFormat)|32(?:BEFormat|Format|LEFormat)|7Format|8Format)|se(?:ExternalEncodingForm(?:Bit|Mask)|Fallbacks(?:Bit|Mask)|HFSPlusMapping|LatestMapping))|VerticalForm(?:Bit|Mask))|known(?:Exception|FSObjectIcon|Language|Script)|lock(?:KCEvent(?:Mask)?|StateKCStatus|edIcon)|mappedMemoryException|resolvablePageFaultException|supported(?:CardErr|FunctionErr|ModeErr|VsErr)|wrapKCItemAttr)|p(?:ArrowCharCode|date(?:A(?:E(?:TE|UT)|ctiveInputArea)|KCEvent(?:Mask)?)|per(?:AndLowerCaseSelector|Case(?:NumbersSelector|PetiteCapsSelector|SmallCapsSelector|Type)))|se(?:AtoB|B(?:estGuess|to(?:A|B))|CurrentISA|NativeISA|Pr(?:emadeThread|ofileIntent)|WidePositioning|r(?:D(?:ialogItem|omain)|FolderIcon|I(?:DiskIcon|con)|NameAndPasswordFlag|P(?:PDDomain|referredAlert)|SpecificTmpFolderType|sFolder(?:Icon|Type)))|tilit(?:iesFolder(?:Icon|Type)|yWindowClass))|V(?:CBFlags(?:H(?:FSPlusAPIs(?:Bit|Mask)|ardwareGone(?:Bit|Mask))|IdleFlush(?:Bit|Mask)|VolumeDirty(?:Bit|Mask))|K_(?:ANSI_(?:0|1|2|3|4|5|6|7|8|9|A|B(?:ackslash)?|C(?:omma)?|D|E(?:qual)?|F|G(?:rave)?|H|I|J|K(?:eypad(?:0|1|2|3|4|5|6|7|8|9|Clear|D(?:ecimal|ivide)|E(?:nter|quals)|M(?:inus|ultiply)|Plus))?|L(?:eftBracket)?|M(?:inus)?|N|O|P(?:eriod)?|Q(?:uote)?|R(?:ightBracket)?|S(?:emicolon|lash)?|T|U|V|W|X|Y|Z)|C(?:apsLock|o(?:mmand|ntrol))|D(?:elete|ownArrow)|E(?:nd|scape)|F(?:1(?:0|1|2|3|4|5|6|7|8|9)?|2(?:0)?|3|4|5|6|7|8|9|orwardDelete|unction)|H(?:elp|ome)|ISO_Section|JIS_(?:Eisu|K(?:ana|eypadComma)|Underscore|Yen)|LeftArrow|Mute|Option|Page(?:Down|Up)|R(?:eturn|ight(?:Arrow|Co(?:mmand|ntrol)|Option|Shift))|S(?:hift|pace)|Tab|UpArrow|Volume(?:Down|Up))|LibTag2|arispeedParam_Playback(?:Cents|Rate)|er(?:ifyKCItemAttr|tical(?:Constraint|FractionsSelector|PositionType|SubstitutionType|TabCharCode))|o(?:icesFolder(?:Icon|Type)|lume(?:KCItemAttr|RootFolderType|SettingsFolderType)))|W(?:akeToDoze|hereToEmptyTrashFolderType|i(?:d(?:ePosOffsetBit|getsFolderType)|ndow(?:A(?:ctivationScope(?:All|Independent|None)|lertP(?:osition(?:MainScreen|On(?:MainScreen|ParentWindow(?:Screen)?)|ParentWindow(?:Screen)?)|roc)|syncDragAttribute)|BoundsChange(?:OriginChanged|SizeChanged|User(?:Drag|Resize)|Zoom)|C(?:a(?:n(?:BeVisibleWithoutLoginAttribute|Collapse|DrawInCurrentPort|G(?:etWindowRegion|row)|MeasureTitle|SetupProxyDragImage|Zoom)|scade(?:On(?:MainScreen|ParentWindow(?:Screen)?)|StartAtParentWindowScreen))|enter(?:MainScreen|On(?:MainScreen|ParentWindow(?:Screen)?)|ParentWindow(?:Screen)?)|loseBox(?:Attribute|Rgn)|o(?:llapseBox(?:Attribute|Rgn)|mpositingAttribute|n(?:strain(?:AllowPartial|CalcOnly|M(?:ayResize|ove(?:Minimum|RegardlessOfFit))|StandardOptions|Use(?:SpecifiedBounds|TransitionWindow))|tentRgn)))|D(?:ef(?:HIView|ObjectClass|Proc(?:ID|Ptr|Type)|SupportsColorGrafPort|aultPosition|initionVersion(?:One|Two))|ialogDefProcResID|o(?:cument(?:DefProcResID|Proc)|esNotCycleAttribute)|ra(?:gRgn|wer(?:Clos(?:ed|ing)|Open(?:ing)?)))|Edge(?:Bottom|Default|Left|Right|Top)|F(?:adeTransitionEffect|loat(?:FullZoom(?:GrowProc|Proc)|GrowProc|HorizZoom(?:GrowProc|Proc)|Proc|Side(?:FullZoom(?:GrowProc|Proc)|GrowProc|HorizZoom(?:GrowProc|Proc)|Proc|VertZoom(?:GrowProc|Proc))|VertZoom(?:GrowProc|Proc))|rameworkScaledAttribute|ullZoom(?:Attribute|DocumentProc|GrowDocumentProc))|G(?:enieTransitionEffect|lobalPortRgn|ro(?:up(?:Attr(?:FixedLevel|HideOnCollapse|LayerTogether|MoveTogether|PositionFixed|S(?:elect(?:AsLayer|able)|haredActivation)|ZOrderFixed)|Contents(?:Re(?:curse|turnWindows)|Visible)|Level(?:Active|Inactive|Promoted))|w(?:DocumentProc|Rgn)))|H(?:as(?:RoundBottomBarCornersAttribute|TitleBar)|i(?:de(?:On(?:FullScreenAttribute|SuspendAttribute)|TransitionAction)|ghResolutionCapableAttribute)|oriz(?:Zoom(?:DocumentProc|GrowDocumentProc)|ontalZoomAttribute))|I(?:gnoreClicksAttribute|nWindowMenuAttribute|s(?:Alert|CollapsedState|Modal|Opaque))|L(?:atentVisible(?:AppHidden|Collapsed(?:Group|Owner)|F(?:loater|ullScreen)|Suspend)|iveResizeAttribute)|M(?:e(?:nuIncludeRotate|tal(?:Attribute|NoContentSeparatorAttribute))|o(?:dal(?:DialogProc|ity(?:AppModal|None|SystemModal|WindowModal))|v(?:able(?:AlertProc|Modal(?:DialogProc|GrowProc))|eTransitionAction))|sg(?:C(?:alculateShape|leanUp)|Dra(?:gHilite|w(?:Grow(?:Box|Outline)|InCurrentPort)?)|Get(?:Features|GrowImageRegion|Region)|HitTest|Initialize|M(?:easureTitle|odified)|S(?:etupProxyDragImage|tateChanged)))|No(?:A(?:ctivatesAttribute|ttributes)|ConstrainAttribute|Position|ShadowAttribute|TitleBarAttribute|UpdatesAttribute)|O(?:paque(?:ForEventsAttribute|Rgn)|verlayProc)|P(?:aintProcOptionsNone|lainDialogProc|ropertyPersistent)|Resiz(?:ableAttribute|eTransitionAction)|S(?:h(?:adowDialogProc|eet(?:Alert(?:DefProcResID|Proc)|DefProcResID|Proc|TransitionEffect)|owTransitionAction)|i(?:deTitlebarAttribute|mple(?:DefProcResID|FrameProc|Proc))|lideTransitionEffect|t(?:a(?:gger(?:MainScreen|ParentWindow(?:Screen)?)|ndard(?:DocumentAttributes|FloatingAttributes|HandlerAttribute)|teTitleChanged)|ructureRgn)|upports(?:DragHilite|GetGrowImageRegion|ModifiedBit))|T(?:exturedSquareCornersAttribute|itle(?:BarRgn|ProxyIconRgn|TextRgn)|oolbarButton(?:Attribute|Rgn))|U(?:nifiedTitleAndToolbarAttribute|pdateRgn|tility(?:DefProcResID|SideTitleDefProcResID))|Vert(?:Zoom(?:DocumentProc|GrowDocumentProc)|icalZoomAttribute)|WantsDisposeAtProcessDeath|Zoom(?:BoxRgn|TransitionEffect)|sLatin1(?:PalmVariant|StandardVariant)))|or(?:d(?:FinalSwashesO(?:ffSelector|nSelector)|InitialSwashesO(?:ffSelector|nSelector))|kgroupFolderIcon)|r(?:PermKCStatus|apKCItemAttr|ite(?:FailureErr|ProtectedErr|Reference)))|X(?:86(?:ISA|RTA)|Lib(?:Tag1|Version))|Y(?:UV(?:211PixelFormat|411PixelFormat|SPixelFormat|UPixelFormat)|V(?:U9PixelFormat|YU422PixelFormat))|Zoom(?:Accelerate|Decelerate|NoAcceleration)|administratorUser|e(?:rnel(?:A(?:lreadyFreeErr|sync(?:ReceiveLimitErr|SendLimitErr)|ttributeErr)|CanceledErr|DeletePermissionErr|Ex(?:ceptionErr|ecut(?:ePermissionErr|ionLevelErr))|I(?:DErr|n(?:UseErr|completeErr))|O(?:bjectExistsErr|ptionsErr)|PrivilegeErr|Re(?:adPermissionErr|turnValueErr)|T(?:erminatedErr|imeoutErr)|Un(?:recoverableErr|supportedErr)|WritePermissionErr)|y(?:32BitIcon|4BitIcon|8Bit(?:Icon|Mask)|A(?:E(?:A(?:djustMarksProc|ngle|rcAngle|ttaching)|B(?:aseAddr|estType|gnd(?:Color|Pattern)|ounds|ufferSize)|C(?:ellList|la(?:ssID|useOffsets)|o(?:lor(?:Table)?|mp(?:Operator|areProc)|ntainer|untProc)|ur(?:rentPoint|ve(?:Height|Width)))|D(?:a(?:shStyle|ta)|e(?:f(?:aultType|initionRect)|s(?:cType|iredClass|tination))|o(?:AntiAlias|Dithered|Rotate|Scale|Translate)|ragging)|E(?:ditionFileLoc|lements|ndPoint|rrorObject|vent(?:Class|ID))|F(?:i(?:l(?:e(?:Type)?|l(?:Color|Pattern))|xLength)|lip(?:Horizontal|Vertical)|o(?:nt|rmula))|G(?:etErrDescProc|raphicObjects)|H(?:iliteRange|omograph(?:Accent|DicInfo|Weight))|I(?:D|mageQuality|n(?:dex|sertHere))|Key(?:Data|Form(?:s)?|word)|L(?:A(?:Homograph|Morpheme(?:Bundle|Path)?)|aunchedAs(?:LogInItem|ServiceItem)|e(?:ftSide|vel)|ineArrow|ogical(?:Operator|Terms))|M(?:ark(?:Proc|TokenProc)|o(?:rpheme(?:PartOfSpeechCode|TextRange)|veView))|N(?:ame|e(?:wElementLoc|xtBody)|oAutoRouting)|O(?:bject(?:1|2|Class)?|ff(?:Styles|set)|nStyles)|P(?:MTable|OSTHeaderData|aram(?:Flags|eters)|en(?:Color|Pattern|Width)|i(?:nRange|x(?:MapMinus|elDepth))|o(?:int(?:List|Size)?|sition)|ro(?:p(?:Data|Flags|ID|ert(?:ies|y))|tection))|R(?:angeSt(?:art|op)|e(?:corderCount|gionClass|nderAs|pl(?:acing|yHeaderData)|questedType|sult(?:Info)?)|o(?:t(?:Point|ation)|wList))|S(?:aveOptions|c(?:ale|riptTag)|e(?:archText|rverInstance)|howWhere|t(?:art(?:Angle|Point)|yles)|uiteID)|T(?:SM(?:DocumentRefcon|EventRe(?:cord|f)|GlyphInfoArray|ScriptTag|Text(?:F(?:MFont|ont)|PointSize))|arget|e(?:st|xt(?:Color|Font|Line(?:Ascent|Height)|PointSize|S(?:ervice(?:Encoding|MacEncoding)|tyles))?)|he(?:Data|Text)|r(?:ans(?:ferMode|lation)|yAsStructGraf))|U(?:niformStyles|pdate(?:On|Range)|s(?:erTerm|ing))|Version|W(?:hoseRangeSt(?:art|op)|indow|ritingCode)|XMLRe(?:plyData|questData))|S(?:Arg|P(?:ositionalArgs|reposition(?:A(?:bo(?:ut|ve)|gainst|partFrom|round|sideFrom|t)|B(?:e(?:low|neath|side|tween)|y)|F(?:or|rom)|Given|Has|In(?:steadOf|to)?|O(?:n(?:to)?|utOf|ver)|Since|T(?:hr(?:ough|u)|o)|Un(?:der|til)|With(?:out)?))|Returning|SubroutineName|UserRecordFields)|c(?:ceptTimeoutAttr|tualSenderAuditToken)|dd(?:itionalHTTPHeaders|ressAttr)|ll|pp(?:HandledCoercion|leEventAttributesAttr))|C(?:loseAllWindows|o(?:deMask|ntextualMenu(?:Attributes|CommandID|Modifiers|Name|Submenu)))|D(?:CM(?:Field(?:Attributes|DefaultData|FindMethods|Name|T(?:ag|ype))|MaxRecordSize)|i(?:rectObject|s(?:ableAuthenticationAttr|poseTokenProc))|own(?:Mask)?|riveNumber)|E(?:rror(?:Code|Number|String)|v(?:ent(?:ClassAttr|IDAttr|SourceAttr)|tDev))|GlobalPositionList|HighLevel(?:Class|ID)|I(?:CEditPreferenceDestination|conAndMask|nteractLevelAttr)|Key(?:Code|board)?|Local(?:PositionList|Where)|M(?:enuI(?:D|tem)|i(?:ni(?:1BitMask|4BitIcon|8BitIcon)|s(?:cellaneous|sedKeywordAttr))|odifiers)|NewBounds|O(?:SA(?:Dialect(?:Code|LangCode|Name|ScriptCode)|Source(?:End|Start))|ldFinderItems|ptionalKeywordAttr|riginal(?:AddressAttr|Bounds))|Pr(?:eDispatch|ocessSerialNumber)|R(?:PCMethod(?:Name|Param(?:Order)?)|e(?:directedDocumentList|ply(?:PortAttr|RequestedAttr)|turnIDAttr))|S(?:OAP(?:Action|MethodNameSpace(?:URI)?|S(?:MD(?:Namespace(?:URI)?|Type)|chemaVersion|tructureMetaData))|R(?:Recognizer|Speech(?:Result|Status))|cszResource|e(?:lect(?:Proc|ion)|nder(?:A(?:ppl(?:escriptEntitlementsAttr|ication(?:IdentifierEntitlementAttr|Sandboxed))|uditTokenAttr)|E(?:GIDAttr|UIDAttr)|GIDAttr|PIDAttr|UIDAttr))|mall(?:32BitIcon|4BitIcon|8Bit(?:Icon|Mask)|IconAndMask)|ubjectAttr)|T(?:imeoutAttr|ransactionIDAttr)|U(?:p(?:Mask)?|ser(?:NameAttr|PasswordAttr))|W(?:he(?:n|re)|indow)|XMLDebuggingAttr))|fullPrivileges|i(?:Movie(?:FolderType|PlugInsFolderType|SoundEffectsFolderType)|o(?:AC(?:Access(?:BlankAccess(?:Bit|Mask)|Everyone(?:Read(?:Bit|Mask)|Search(?:Bit|Mask)|Write(?:Bit|Mask))|Group(?:Read(?:Bit|Mask)|Search(?:Bit|Mask)|Write(?:Bit|Mask))|Owner(?:Bit|Mask|Read(?:Bit|Mask)|Search(?:Bit|Mask)|Write(?:Bit|Mask))|User(?:Read(?:Bit|Mask)|Search(?:Bit|Mask)|Write(?:Bit|Mask)))|UserNo(?:MakeChanges(?:Bit|Mask)|SeeF(?:iles(?:Bit|Mask)|older(?:Bit|Mask))|tOwner(?:Bit|Mask)))|F(?:CB(?:FileLocked(?:Bit|Mask)|LargeFile(?:Bit|Mask)|Modified(?:Bit|Mask)|OwnClump(?:Bit|Mask)|Resource(?:Bit|Mask)|SharedWrite(?:Bit|Mask)|Write(?:Bit|Locked(?:Bit|Mask)|Mask))|lAttrib(?:CopyProt(?:Bit|Mask)|D(?:ataOpen(?:Bit|Mask)|ir(?:Bit|Mask))|FileOpen(?:Bit|Mask)|InShared(?:Bit|Mask)|Locked(?:Bit|Mask)|Mounted(?:Bit|Mask)|ResOpen(?:Bit|Mask)|SharePoint(?:Bit|Mask)))|VAtrb(?:DefaultVolume(?:Bit|Mask)|FilesOpen(?:Bit|Mask)|HardwareLocked(?:Bit|Mask)|SoftwareLocked(?:Bit|Mask))))|no(?:Group|User)|ownerPrivileges)|l(?:CloseMsg|D(?:o(?:HAutoscroll(?:Bit)?|VAutoscroll(?:Bit)?)|raw(?:Msg|ingModeOff(?:Bit)?))|ExtendDrag(?:Bit)?|HiliteMsg|InitMsg|No(?:Disjoint(?:Bit)?|Extend(?:Bit)?|NilHilite(?:Bit)?|Rect(?:Bit)?)|OnlyOne(?:Bit)?|UseSense(?:Bit)?|a(?:Dictionary(?:NotOpenedErr|TooManyErr|UnknownErr)|En(?:gineNotFoundErr|vironment(?:BusyErr|ExistErr|NotFoundErr))|FailAnalysisErr|InvalidPathErr|NoMoreMorphemeErr|Property(?:Err|IsReadOnlyErr|NotFoundErr|UnknownErr|ValueErr)|T(?:extOverFlowErr|ooSmallBufferErr)|ng(?:A(?:fri(?:caans|kaans)|lbanian|mharic|r(?:abic|menian)|ssamese|ymara|zerbaijan(?:Ar|Roman|i))|B(?:asque|e(?:lorussian|ngali)|reton|u(?:lgarian|rmese)|yelorussian)|C(?:atalan|h(?:ewa|inese)|roatian|zech)|D(?:anish|utch|zongkha)|E(?:nglish|s(?:peranto|tonian))|F(?:a(?:eroese|r(?:oese|si))|innish|lemish|rench)|G(?:al(?:ician|la)|e(?:orgian|rman)|ree(?:k(?:Ancient|Poly)?|nlandic)|u(?:arani|jarati))|H(?:ebrew|indi|ungarian)|I(?:celandic|n(?:donesian|uktitut)|rish(?:Gaelic(?:Script)?)?|talian)|Ja(?:panese|vaneseRom)|K(?:a(?:nnada|shmiri|zakh)|hmer|i(?:nyarwanda|rghiz)|orean|urdish)|L(?:a(?:o|pp(?:ish|onian)|t(?:in|vian))|ettish|ithuanian)|M(?:a(?:cedonian|l(?:a(?:gasy|y(?:Arabic|Roman|alam))|t(?:a|ese))|nxGaelic|rathi)|o(?:ldavian|ngolian(?:Cyr)?))|N(?:epali|orwegian|y(?:anja|norsk))|Or(?:iya|omo)|P(?:ashto|ersian|o(?:lish|rtug(?:ese|uese))|unjabi)|Quechua|R(?:omanian|u(?:anda|ndi|ssian))|S(?:a(?:amisk|mi|nskrit)|cottishGaelic|erbian|i(?:mpChinese|n(?:dhi|halese))|lov(?:ak|enian)|omali|panish|undaneseRom|w(?:ahili|edish))|T(?:a(?:galog|jiki|mil|tar)|elugu|hai|i(?:betan|grinya)|ongan|radChinese|urk(?:ish|men))|U(?:ighur|krainian|nspecified|rdu|zbek)|Vietnamese|Welsh|Y(?:iddish|ugoslavian))|pProtErr|rge(?:1BitMask|4BitData|8BitData)|stDskErr|unch(?:Allow24Bit|Continue|DontSwitch|InhibitDaemon|NoFileFlags|UseMinimum))|eft(?:OverChars|SingGuillemet)|imitReachedErr|o(?:c(?:alOnlyErr|kPortBits(?:Bad(?:PortErr|SurfaceErr)|SurfaceLostErr|W(?:indow(?:ClippedErr|MovedErr|ResizedErr)|rongGDeviceErr)))|ng(?:Da(?:te(?:Found)?|y)|Month|Week|Year)))|m(?:BarNFnd|CalcItemMsg|D(?:ownMask|rawMsg)|FulErr|PopUpMsg|SizeMsg|UpMask|a(?:c(?:Dev|ron)|p(?:C(?:hanged(?:Bit)?|ompact(?:Bit)?)|Read(?:Err|Only(?:Bit)?))|trixErr|x(?:Country|DateField|SizeToGrowTooSmall))|ct(?:AllItems|LastIDIndic)|dy|e(?:diaTypesDontMatch|m(?:A(?:ZErr|drErr)|BCErr|F(?:ragErr|ullErr)|LockedErr|P(?:CErr|urErr)|ROZ(?:Err(?:or)?|Warn)|SCErr|WZErr)|nu(?:I(?:nvalidErr|temNotFoundErr)|NotFoundErr|Pr(?:gErr|operty(?:Invalid(?:Err)?|NotFoundErr))|UsesSystemDefErr))|i(?:di(?:DupIDErr|InvalidCmdErr|ManagerAbsentOSErr|N(?:ameLenErr|o(?:C(?:lientErr|onErr)|PortErr))|TooMany(?:ConsErr|PortsErr)|VConnect(?:Err|Made|Rmvd)|WriteErr)|n(?:Country|LeadingZ|i(?:1BitMask|4BitData|8BitData)|ute(?:Field|Mask))|ssingRequiredParameterErr)|mInternalError|ntLdingZ|o(?:de(?:32BitCompatible|C(?:anBackground|ontrolPanel)|D(?:eskAccessory|isplayManagerAware|oesActivateOnFGSwitch)|Get(?:AppDiedMsg|FrontClicks)|HighLevelEventAware|L(?:aunchDontSwitch|iteral|ocalAndRemoteHLEvents)|MultiLaunch|N(?:eedSuspendResume|ormal)|OnlyBackground|Phonemes|Reserved|StationeryAware|T(?:ext|une)|UseTextEditServices)|nth(?:Field|Mask)|u(?:ntedFolderIconResource|se(?:Down|MovedMessage|Up))|v(?:ableDBoxProc|ieT(?:extNotFoundErr|oolboxUninitialized)))|pWorkFlag(?:CopyWorkBlock|Do(?:Completion|Work|ntBlock)|Get(?:IsRunning|ProcessorCount))|ultiplePublisherWrn|yd)|n(?:WIDTHHook|ame(?:FontTableTag|TypeErr)|bp(?:BuffOvr|ConfDiff|Duplicate|N(?:ISErr|o(?:Confirm|tFound)))|e(?:edClearScrapErr|gZcbFreeErr|twork(?:E(?:rr|vt)|Mask)|wLine(?:Bit|CharMask|Mask))|il(?:HandleErr|ScrapFlavorDataErr)|mTyp(?:Err|e)|o(?:AdrMkErr|BridgeErr|C(?:a(?:che(?:Bit|Mask)|lls)|o(?:decErr|nstraint))|D(?:MAErr|ata(?:Area|Handler)|e(?:fault(?:DataRef|UserErr)|viceForChannel)|riveErr|taMkErr)|ExportProcAvailableErr|G(?:lobalsErr|rowDocProc)|H(?:ardware(?:Err)?|elpForItem)|I(?:conDataAvailableErr|nformErr)|M(?:MUErr|PPErr|a(?:c(?:DskErr|hineNameErr)|rk|skFoundErr)|e(?:diaHandler|m(?:ForPictPlaybackErr|oryNodeFailedInitialize))|o(?:re(?:FolderDescErr|KeyColorsErr|RealTime)|vieFound))|NybErr|OutstandingHLE|P(?:a(?:steboardPromiseKeeperErr|thMappingErr)|ortErr|refAppErr)|Re(?:cordOfApp|lErr|quest|sponseErr)|S(?:crap(?:Err|PromiseKeeperErr)|e(?:curitySession|ndResp|ssionErr)|ou(?:ndTrackInMovieErr|rceTreeFoundErr)|u(?:chIconErr|itableDisplaysErr)|ynthFound)|T(?:humbnailFoundErr|oolboxNameErr|ranslationPathErr|ypeErr)|User(?:InteractionAllowed|NameErr|Re(?:cErr|fErr))|VideoTrackInMovieErr|n(?:DragOriginatorErr|GlyphID|MatchingEditState)|t(?:A(?:FileErr|QTVRMovieErr|RemountErr|llowedToSaveMovieErr|ppropriateForClassic)|BTree|E(?:nough(?:BufferSpace|D(?:ataErr|iskSpaceToGrab)|Hardware(?:Err)?|Memory(?:Err|ToGrab))|xact(?:MatrixErr|SizeErr))|HeldErr|I(?:mplementedMusicOSErr|nitErr)|L(?:eafAtomErr|o(?:ckedErr|ggedInErr))|OpenErr|PasteboardOwnerErr|RegisteredSectionErr|ThePublisherWrn|e(?:ChannelNotAllocatedOSErr|Icon)))|r(?:CallNotSupported|DataTruncatedErr|ExitedIteratorScope|I(?:nvalid(?:EntryIterationOp|NodeErr)|terationDone)|LockedErr|N(?:ameErr|ot(?:CreatedErr|EnoughMemoryErr|FoundErr|ModifiedErr|SlotDeviceErr))|OverrunErr|P(?:ath(?:BufferTooSmall|NotFound)|ower(?:Err|SwitchAbortErr)|ropertyAlreadyExists)|ResultCodeBase|T(?:ransactionAborted|ypeMismatchErr))|s(?:DrvErr|StackErr|vErr)|u(?:l(?:Dev|lEvent)|mberFor(?:matting(?:Bad(?:CurrencyPositionErr|FormatErr|NumberFormattingObjectErr|OptionsErr|TokenErr)|DelimiterMissingErr|EmptyFormatErr|LiteralMissingErr|NotA(?:DigitErr|NumberErr)|OverflowInDestinationErr|SpuriousCharErr|UnOrd(?:eredCurrencyRangeErr|redCurrencyRangeErr))|tmattingNotADigitErr)))|o(?:ffLinErr|gonek|k|p(?:WrErr|en(?:Err|FolderIconResource)|tionKey(?:Bit)?)|s(?:2FontTableTag|Evt(?:MessageMask)?|Mask)|ver(?:Dot|layDITL)|wnedFolderIconResource)|p(?:A(?:RADialIn|S(?:Da(?:teString|y(?:s)?)|Hours|It|M(?:e|inutes|onth)|P(?:arent|i|rint(?:Depth|Length))|Quote|Re(?:quiredImportItems|sult|turn)|S(?:econds|pace)|T(?:ab|ime(?:String)?|opLevelScript)|Week(?:day|s)|Year)|T(?:Machine|Type|Zone)|boutMacintosh|pp(?:Partition|l(?:eMenuItemsFolder|icationFile))|r(?:cAngle|ePrivilegesInherited))|B(?:ackground(?:Color|Pattern)|estType|ounds|uttonViewArrangement|y(?:CreationDateArrangement|KindArrangement|LabelArrangement|ModificationDateArrangement|NameArrangement|SizeArrangement))|C(?:a(?:llBackNumber|n(?:C(?:hangePassword|onnect)|DoProgramLinking)|pacity)|l(?:ass|ipboard)|o(?:lor(?:Table)?|m(?:ment|pletelyExpanded)|n(?:duit|t(?:ainer(?:Window)?|ent(?:Space|s)|rolPanelsFolder))|rnerCurve(?:Height|Width))|reationDate(?:Old)?)|D(?:CM(?:AccessMethod|C(?:lass|opyright)|L(?:isting|ocale)|Maintenance|Permission)|NS(?:Form)?|ashStyle|e(?:f(?:ault(?:ButtonViewIconSize|IconViewIconSize|ListViewIconSize|Type)|initionRect)|layBeforeSpringing|s(?:cription|k(?:AccessoryFile|top))|vice(?:Address|Type))|isk|ottedDecimal)|E(?:jectable|n(?:abled|dPoint|tireContents)|x(?:p(?:and(?:able|ed)|orted)|tensionsFolder))|F(?:TPKind|i(?:l(?:e(?:Creator|Share(?:On|StartingUp)|Type(?:Old)?)?|l(?:Color|Pattern))|nderPreferences)|o(?:lder(?:Old)?|nt(?:sFolder(?:PreAllegro)?)?|rmula)|reeSpace)|G(?:r(?:aphicObjects|id(?:Icons)?|oup(?:Privileges)?)|uestPrivileges)|H(?:as(?:CloseBox|ScriptingTerminology|TitleBar)|ost)|I(?:D|con(?:Bitmap|Size|ViewArrangement)|n(?:dex|fo(?:Panel|Window)|herits|sertionLoc|ternetLocation)|s(?:Collapsed|F(?:loating|rontProcess)|Locked(?:Old)?|Mod(?:al|ified)|Owner|P(?:opup|ulledOpen)|Resizable|S(?:criptable|elected|ta(?:rtup|tioneryPad))|Zoom(?:able|ed(?:Full)?))|temNumber)|Justification|K(?:e(?:epArranged(?:By)?|y(?:Kind|strokeKey))|ind)|L(?:a(?:bel(?:1|2|3|4|5|6|7|Index)|ngCode|rge(?:Button|stFreeBlock))|ength|i(?:neArrow|stViewIconSize)|ocal(?:AndRemoteEvents)?)|M(?:akeChanges|enuID|inAppPartition|o(?:difi(?:cationDate(?:Old)?|ers)|unted))|N(?:ame|e(?:twork|wElementLoc)|o(?:Arrangement|de))|O(?:bject|riginalItem|wner(?:Privileges)?)|P(?:a(?:rtitionSpaceUsed|th)|en(?:Color|Pattern|Width)|hysicalSize|ixelDepth|o(?:int(?:List|Size)|rt|sition)|r(?:e(?:ferences(?:Folder|Window)|viousView)|o(?:ductVersion|gramLinkingOn|perties|t(?:ection|ocol))))|R(?:e(?:st|verse)|otation)|S(?:CSI(?:Bus|LUN)|c(?:ale|heme|ript(?:Code|Tag)?)|e(?:eF(?:iles|olders)|lect(?:ed|ion))|h(?:ar(?:ableContainer|ing(?:Protection|Window)?)|o(?:rtCuts|uldCallBack|w(?:C(?:omment|reationDate)|D(?:ate|iskInfo)|FolderSize|Kind|Label|ModificationDate|Size|Version))|utdownFolder)|ize|mall(?:Button|Icon)|napToGridArrangement|o(?:cket|rtDirection|und)|pringOpenFolders|ta(?:ggerIcons|rt(?:Angle|Point|ingUp|up(?:Disk|ItemsFolder)))|uggestedAppPartition|ystemFolder)|T(?:e(?:mporaryFolder|xt(?:Color|Encoding|Font|ItemDelimiters|PointSize|Styles))|ra(?:ns(?:ferMode|lation)|sh))|U(?:RL|niformStyles|pdateOn|se(?:RelativeDate|ShortMenus|WideGrid|r(?:Name|Password|Selection)))|V(?:ersion|i(?:ew(?:Font(?:Size)?|Preferences)?|sible))|W(?:arnOnEmpty|indow)|a(?:ramErr|steDev|th(?:NotVerifiedErr|TooLongErr))|er(?:Thousand|mErr)|i(?:c(?:Item|ker(?:CantLive|ResourceError)|t(?:Info(?:IDErr|Ver(?:bErr|sionErr))|ureDataErr))|xMapTooDeepErr)|l(?:a(?:inDBox|tform(?:68k|AIXppc|I(?:A32NativeEntryPoint|RIXmips|nterpreted)|Linux(?:intel|ppc)|MacOSx86|NeXT(?:68k|Intel|ppc|sparc)|PowerPC(?:64NativeEntryPoint|NativeEntryPoint)?|SunOS(?:intel|sparc)|Win32|X86_64NativeEntryPoint))|easeCache(?:Bit|Mask))|m(?:BusyErr|Field|Mask|Re(?:cv(?:EndErr|StartErr)|plyTOErr)|Send(?:EndErr|StartErr))|o(?:pup(?:FixedWidth|MenuProc|Title(?:Bold|C(?:enterJust|ondense)|Extend|Italic|LeftJust|NoStyle|Outline|RightJust|Shadow|Underline)|Use(?:AddResMenu|WFont)|VariableWidth)|rt(?:ClosedErr|InUse|N(?:ameExistsErr|ot(?:Cf|Pwr)))|sErr)|r(?:InitErr|WrErr|eferencesFolderIconResource|i(?:nt(?:MonitorFolderIconResource|erStatusOpCodeNotSupportedErr)|vateFolderIconResource)|o(?:c(?:NotFound|essStateIncorrectErr)|gressProcAborted|pertyNotSupportedByNodeErr|tocolErr))|ushButProc)|q(?:Err|fcbNot(?:CreatedErr|FoundErr)|t(?:ActionNotHandledErr|NetworkAlreadyAllocatedErr|ParamErr|XML(?:ApplicationErr|ParseErr)|ml(?:Dll(?:EntryNotFoundErr|LoadErr)|Uninitialized)|s(?:AddressBusyErr|Bad(?:DataErr|S(?:electorErr|tateErr))|ConnectionFailedErr|T(?:imeoutErr|ooMuchDataErr)|Un(?:knownValueErr|supported(?:DataTypeErr|FeatureErr|RateErr)))|vr(?:LibraryLoadErr|Uninitialized))|ueueFull)|r(?:AliasType|ad(?:Ctrl|ioButProc)|c(?:DB(?:AsyncNotSupp|B(?:ad(?:AsyncPB|DDEV|Sess(?:ID|Num)|Type)|reak)|E(?:rror|xec)|N(?:oHandler|ull)|PackNotInited|Value|WrongVersion)|vrErr)|dVerify(?:Bit|Mask)?|e(?:ad(?:Err|QErr|Reference)|c(?:NotFnd|ordDataTooBigErr)|gisterComponent(?:A(?:fterExisting|liasesOnly)|Global|NoDuplicates)|q(?:Aborted|Failed|uiredFlagsDontMatch)|s(?:1Field|2Field|3Field|AttrErr|C(?:hanged(?:Bit)?|trl)|FNotFound|Locked(?:Bit)?|NotFound|P(?:r(?:eload(?:Bit)?|o(?:blem|tected(?:Bit)?))|urgeable(?:Bit)?)|Sys(?:Heap(?:Bit)?|RefBit)|ourceInMemory|umeFlag)|tryComponentRegistrationErr)|fNumErr|gn(?:OverflowErr|TooBigErr(?:or)?)|i(?:ght(?:ControlKey(?:Bit)?|OptionKey(?:Bit)?|S(?:hiftKey(?:Bit)?|ingGuillemet))|ngMark)|mvRe(?:fFailed|sFailed)|o(?:man(?:AppFond|Flags|SysFond)|utingNotFoundErr))|s(?:IQType|am(?:eFileErr|plesAlreadyInMediaErr)|c(?:TypeNotFoundErr|r(?:ap(?:Flavor(?:FlagsMismatchErr|NotFoundErr|SizeMismatchErr)|PromiseNotKeptErr)|ipt(?:CurLang|DefLang)|ollBarProc))|dm(?:InitErr|JTInitErr|P(?:RAMInitErr|riInitErr)|SRTInitErr)|e(?:NoDB|c(?:LeadingZ|ond(?:Field|Mask)|tNFErr)|ekErr|lectorNotSupportedByNodeErr|pNot(?:Consistent|IntlSep)|qGrabInfoNotAvailable|ss(?:ClosedErr|TableErr|ion(?:Has(?:GraphicAccess|TTY)|IsR(?:emote|oot)|KeepCurrentBootstrap))|ttingNotSupportedByNodeErr)|h(?:aredFolderIconResource|iftKey(?:Bit)?|ortDate|utDownAlert)|i(?:Bad(?:DeviceName|RefNum|SoundInDevice)|DeviceBusyErr|HardDriveTooSlow|In(?:it(?:S(?:DTblErr|PTblErr)|VBLQsErr)|putDeviceErr|valid(?:Compression|Sample(?:Rate|Size)))|No(?:BufferSpecified|SoundInHardware)|Unknown(?:InfoType|Quality)|VBRCompressionNotSupported|ze(?:Bit|of_sfnt(?:CMap(?:E(?:ncoding|xtendedSubHeader)|Header|SubHeader)|D(?:escriptorHeader|irectory)|Instance|Name(?:Header|Record)|Variation(?:Axis|Header))))|ktClosedErr|l(?:eepQType|otNumErr|pQType)|m(?:A(?:llScripts|mharic|r(?:abic|menian))|B(?:LFieldBad|ad(?:BoardId|RefId|Script|Verb|s(?:List|PtrErr))|engali|lkMoveErr|u(?:rmese|sErrTO)|yteLanesErr)|C(?:PUErr|RCFail|entralEuroRoman|h(?:ar(?:1byte|2byte|Ascii|B(?:idirect|opomofo)|ContextualLR|E(?:uro|xtAscii)|FIS(?:G(?:ana|reek)|Ideo|Kana|Russian)|GanaKana|H(?:angul|iragana|orizontal)|Ideographic|Jamo|Katakana|L(?:eft|ower)|NonContextualLR|Punct|Right|TwoByte(?:Greek|Russian)|Upper|Vertical)|inese)|kStatusErr|odeRevErr|urrentScript|yrillic)|D(?:evanagari|is(?:DrvrNamErr|abledSlot|posePErr))|E(?:astEurRoman|mptySlot|thiopic|xtArabic)|F(?:HBl(?:kDispErr|ockRdErr)|ISClass(?:Lvl(?:1|2)|User)|irstByte|o(?:nd(?:End|Start)|rmatErr))|G(?:e(?:ez|orgian|t(?:DrvrNamErr|PRErr))|reek|u(?:jarati|rmukhi))|Hebrew|I(?:deographic(?:Level(?:1|2)|User)|nit(?:StatVErr|TblVErr))|Ja(?:mo(?:Bog(?:Jaeum|Moeum)|Jaeum|Moeum)|panese)|K(?:CHRCache|an(?:a(?:HardOK|S(?:mall|oftOK))|nada)|ey(?:DisableKybd(?:Switch|s)|EnableKybds|ForceKeyScript(?:Bit|Mask)|Next(?:InputMethod|Kybd|Script)|Roman|S(?:cript|etDir(?:LeftRight|RightLeft)|wap(?:InputMethod|Kybd|Script)|ysScript)|Toggle(?:Direction|Inline))|hmer|lingon|orean)|La(?:o(?:tian)?|stByte)|M(?:a(?:layalam|sk(?:A(?:ll|scii(?:1|2)?)|Bopomofo2|Gana2|Hangul2|Jamo2|Kana(?:1|2)|Native))|iddleByte|ongolian)|N(?:ewPErr|ilsBlockErr|o(?:Board(?:Id|SRsrc)|Dir|GoodOpens|JmpTbl|MoresRsrcs|sInfoArray|tInstalled)|umberPartsTable)|O(?:ffsetErr|riya)|P(?:RAMInitErr|riInitErr|unct(?:Blank|Graphic|N(?:ormal|umber)|Repeat|Symbol))|R(?:Symbol|e(?:cNotFnd|gionCode|s(?:erved(?:Err|Slot)|rvErr)|visionErr)|oman|ussian)|S(?:DMInitErr|RT(?:InitErr|OvrFlErr)|elOOBErr|i(?:mpChinese|n(?:dhi|gleByte|halese))|l(?:avic|otOOBErr)|ys(?:Script|temScript))|T(?:amil|elugu|hai|ibetan|ra(?:dChinese|ns(?:Ascii(?:1|2)?|Bopomofo2|Case|Gana2|Hangul(?:2|Format)|Jamo2|Kana(?:1|2)|Lower|Native|Pre(?:DoubleByting|LowerCasing)|RuleBaseFormat|System|Upper)))|U(?:n(?:ExBusErr|TokenTable|i(?:codeScript|nterp))|prHalfCharSet)|Vietnamese|W(?:hiteSpaceList|ord(?:SelectTable|WrapTable))|all(?:1BitMask|4BitData|8BitData|DateBit)|c(?:ClassMask|DoubleMask|OrientationMask|R(?:eserved|ightMask)|TypeMask|UpperMask)|f(?:D(?:isableKeyScriptSync(?:Mask)?|ualCaret)|NameTagEnab|ShowIcon|UseAssocFontInfo)|s(?:GetDrvrErr|PointerNil|f(?:AutoInit|B0Digits|Context|Forms|IntellCP|Ligatures|N(?:atCase|oForceFont)|Reverse|S(?:ingByte|ynchUnstyledTE)|UnivExt)))|o(?:C(?:haracterMode|ommandDelimiter|urrent(?:A5|Voice))|Error(?:CallBack|s)|InputMode|NumberMode|OutputTo(?:AudioDevice|ExtAudioFile|FileWithCFURL)|P(?:honeme(?:CallBack|Options|Symbols)|itch(?:Base|Mod))|R(?:ate|e(?:centSync|fCon|set))|S(?:oundOutput|peechDoneCallBack|tatus|yn(?:cCallBack|th(?:Extension|Type)))|TextDoneCallBack|Vo(?:ice(?:Description|File)|lume)|WordCallBack|rts(?:After|Before|Equal)|u(?:ndSupportNotAvailableErr|rceNotFoundErr))|pdAdjErr|rcCopy|t(?:a(?:leEditState|rtupFolderIconResource|t(?:Text|usErr))|opIcon|r(?:UserBreak|eamingNodeNotReadyErr|ingOverflow))|u(?:p(?:Day|Month|Week|Year)|spendResumeMessage)|v(?:All(?:1BitData|4BitData|8BitData|AvailableData|LargeData|MiniData|SmallData)|Disabled|Large(?:1Bit|4Bit|8Bit)|Mini(?:1Bit|4Bit|8Bit)|Small(?:1Bit|4Bit|8Bit)|TempDisable)|y(?:nth(?:NotReady|OpenFailed|esizer(?:NotRespondingOSErr|OSErr))|stem(?:CurLang|DefLang|FolderIconResource)))|t(?:aDst(?:DocNeedsResourceFork|IsAppTranslation)|e(?:Bit(?:Clear|Set|Test)|C(?:aret|enter)|Draw|F(?:AutoScroll|I(?:dleWithEventLoopTimer|nlineInput(?:AutoScroll)?)|OutlineHilite|TextBuffering|Use(?:InlineInput|TextServices|WhiteBackground)|ind|lush(?:Default|Left|Right)|orceLeft|rom(?:Find|Recal))|Highlight|Just(?:Center|Left|Right)|ScrapSizeErr|Word(?:Drag|Select)|l(?:A(?:PattNotSupp|lreadyOpen|utoAnsNotOn)|Bad(?:APattErr|BearerType|C(?:AErr|odeResource)|D(?:N(?:DType|Err|Type)|isplayMode)|F(?:eatureID|unction|wdType)|H(?:TypeErr|andErr)|In(?:dex|t(?:Ext|ercomID))|LevelErr|P(?:a(?:geID|rkID)|ickupGroupID|roc(?:Err|ID))|Rate|S(?:WErr|ampleRate|elect|tateErr)|TermErr|VTypeErr)|C(?:A(?:Not(?:Acceptable|Deflectable|Rejectable)|Unavail)|BErr|onf(?:Err|LimitE(?:rr|xceeded)|NoLimit|Rej))|D(?:N(?:DTypeNotSupp|TypeNotSupp)|e(?:tAlreadyOn|viceNotFound)|isplayModeNotSupp)|F(?:eat(?:Active|Not(?:Avail|Su(?:b|pp)))|wdTypeNotSupp)|GenericError|HTypeNotSupp|In(?:dexNotSupp|itFailed|tExtNotSupp)|No(?:C(?:allbackRef|ommFolder)|Err|MemErr|OpenErr|SuchTool|Tools|tEnoughdspBW)|PBErr|St(?:ateNotSupp|illNeeded)|T(?:ermNotOpen|ransfer(?:Err|Rej))|UnknownErr|V(?:TypeNotSupp|alidateFailed))|xt(?:MenuProc|Parser(?:Bad(?:Par(?:amErr|serObjectErr)|T(?:ext(?:EncodingErr|LanguageErr)|okenValueErr))|No(?:MoreT(?:extErr|okensErr)|SuchTokenFoundErr)|ObjectNotFoundErr|ParamErr)))|h(?:eme(?:Bad(?:CursorIndexErr|TextColorErr)|HasNoAccentsErr|InvalidBrushErr|MonitorDepthNotSupportedErr|NoAppropriateBrushErr|Process(?:NotRegisteredErr|RegisteredErr)|ScriptFontNotFoundErr)|read(?:BadAppContextErr|NotFoundErr|ProtocolErr|TooManyReqsErr))|i(?:lde|me(?:Cycle(?:12|24|Zero)|NotIn(?:Media|Track|ViewErr)))|k0BadErr|ls_(?:ciphersuite_(?:AES_(?:128_GCM_SHA256|256_GCM_SHA384)|CHACHA20_POLY1305_SHA256|ECDHE_(?:ECDSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|CHACHA20_POLY1305_SHA256)|RSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:384)?|GCM_SHA384))|CHACHA20_POLY1305_SHA256))|RSA_WITH_(?:3DES_EDE_CBC_SHA|AES_(?:128_(?:CBC_SHA(?:256)?|GCM_SHA256)|256_(?:CBC_SHA(?:256)?|GCM_SHA384)))|group_(?:ats(?:_compatibility)?|compatibility|default|legacy))|protocol_version_(?:DTLSv1(?:0|2)|TLSv1(?:0|1|2|3)))|m(?:foErr|wdoErr)|o(?:g(?:Char(?:12HourBit|ZCycleBit)|Delta12HourBit|gle(?:B(?:ad(?:Char|Delta|Field|Num)|it)|Err(?:3|4|5)|O(?:K|utOfRange)|Un(?:defined|known)))|k(?:DecPoint|E(?:Minus|Plus|scape)|Le(?:ad(?:Placer|er)|ftQuote)|M(?:axSymbols|inusSign)|NonLeader|P(?:ercent|lusSign)|R(?:eserved|ightQuote)|Separator|Thousands|ZeroLead|en(?:1Quote|2(?:Equal|Quote)|A(?:l(?:pha|t(?:Num|Real))|mpersand|sterisk|tSign)|Ba(?:ckSlash|r)|C(?:a(?:pPi|r(?:at|et))|enterDot|o(?:lon(?:Equal)?|mma))|D(?:ivide|ollar)|E(?:llipsis|mpty|qual|rr|scape|xclam(?:Equal)?)|Fraction|Great(?:Equal(?:1|2))?|Hash|In(?:finity|t(?:egral|l(?:Currency)?))|L(?:e(?:ft(?:1Quote|2Quote|Bracket|C(?:omment|urly)|Enclose|Lit|Paren|SingGuillemet)|ss(?:Equal(?:1|2)|Great)?)|iteral)|Mi(?:cro|nus)|N(?:ewLine|il|o(?:BreakSpace|tEqual)|umeric)|O(?:K|verflow)|P(?:er(?:Thousand|cent|iod)|i|lus(?:Minus)?)|Question|R(?:e(?:alNum|serve(?:1|2))|ight(?:1Quote|2Quote|Bracket|C(?:omment|urly)|Enclose|Lit|Paren|SingGuillemet)|oot)|S(?:emicolon|igma|lash)|Tild(?:a|e)|Un(?:derline|known)|White))|oMany(?:Reqs|S(?:eps|kts)))|ra(?:ck(?:IDNotFound|NotInMovie)|shIconResource)|s(?:N(?:extSelectMode|ormalSelectMode)|PreviousSelectMode|m(?:AlreadyRegisteredErr|C(?:ant(?:ChangeForcedClassStateErr|OpenComponentErr)|omponent(?:AlreadyOpenErr|NoErr|Property(?:NotFoundErr|UnsupportedErr)))|D(?:efaultIsNotInputMethodErr|oc(?:NotActiveErr|Property(?:BufferTooSmallErr|NotFoundErr)|umentOpenErr))|In(?:putM(?:ethod(?:IsOldErr|NotFoundErr)|odeChangeFailedErr)|valid(?:Context|DocIDErr))|N(?:everRegisteredErr|o(?:Handler|MoreTokens|OpenTSErr|Stem|tAnAppErr))|ScriptHasNoIMErr|T(?:S(?:HasNoMenuErr|MDocBusyErr|NotOpenErr)|extServiceNotFoundErr)|U(?:n(?:knownErr|sup(?:ScriptLanguageErr|portedTypeErr))|seInputWindowErr)))|t(?:Disabled|Label(?:1|2|3|4|5|6|7)|None|O(?:ffline|pen)|Selected(?:Disabled|O(?:ffline|pen))?)|uneP(?:arseOSErr|layerFullOSErr)|woSideErr|ype(?:128BitFloatingPoint|32BitIcon|4BitIcon|8Bit(?:Icon|Mask)|A(?:E(?:Homograph(?:Accent|DicInfo|Weight)|List|Morpheme(?:PartOfSpeechCode|TextRange)|Record|T(?:E|ext)|UT)|SStorage|TS(?:FontRef|U(?:FontID|Size))|bsoluteOrdinal|lias|pp(?:Parameters|l(?:Signature|e(?:Event|Script)|ication(?:BundleID|URL)))|rc|uditToken)|B(?:est|oo(?:kmarkData|lean)|yte(?:Count|Offset))|C(?:F(?:A(?:bsoluteTime|rrayRef|ttributedStringRef)|BooleanRef|DictionaryRef|Index|Mutable(?:A(?:rrayRef|ttributedStringRef)|DictionaryRef|StringRef)|NumberRef|Range|StringRef|TypeRef)|G(?:ContextRef|Display(?:ChangeFlags|ID)|Float(?:72DPIGlobal|ScreenPixel)?|ImageRef)|String|T(?:Font(?:DescriptorRef|Ref)|GlyphInfoRef)|e(?:ll|ntimeters)|har|l(?:assInfo|ickActivationResult)|o(?:l(?:lection|orTable|umn)|mp(?:Descriptor|onentInstance)|n(?:ceptualTime|trol(?:ActionUPP|FrameMetrics|PartCode|Ref)))|u(?:bic(?:Centimeter|Feet|Inches|Meters|Yards)|rrentContainer))|D(?:CMFi(?:eldAttributes|ndMethod)|a(?:shStyle|ta)|e(?:cimalStruct|grees(?:C|F|K))|ra(?:gRef|wingArea))|E(?:PS|lemInfo|n(?:codedString|umerat(?:ed|ion))|vent(?:HotKeyID|Info|Re(?:cord|f)|Target(?:Options|Ref)))|F(?:MFont(?:Family|S(?:ize|tyle))|S(?:Ref|VolumeRefNum)|alse|eet|i(?:leURL|nderWindow|xed(?:Point|Rectangle)?)|ontColor)|G(?:DHandle|IF|WorldPtr|allons|lyph(?:InfoArray|Selector)|r(?:a(?:fPtr|ms|phic(?:Line|Text))|oupedGraphic))|HI(?:Command|Menu|ObjectRef|Point(?:72DPIGlobal|ScreenPixel)?|Rect(?:72DPIGlobal|ScreenPixel)?|S(?:hapeRef|ize(?:72DPIGlobal|ScreenPixel)?)|Toolbar(?:Display(?:Mode|Size)|ItemRef|Ref)|ViewTrackingAreaRef|Window)|I(?:EEE(?:32BitFloatingPoint|64BitFloatingPoint)|SO8601DateTime|con(?:AndMask|Family)|n(?:ches|d(?:exDescriptor|icatorDragConstraint)|sertionLoc|tl(?:Text|WritingCode)))|JPEG|K(?:e(?:rnelProcessID|yword)|ilo(?:grams|meters))|L(?:A(?:Homograph|Morpheme(?:Bundle|Path)?)|iters|o(?:gicalDescriptor|ng(?:DateTime|Fixed(?:Point|Rectangle)?|Point|Rectangle)|wLevelEventRecord))|M(?:ach(?:Port|ineLoc)|e(?:nu(?:Command|Direction|EventOptions|ItemIndex|Ref|TrackingMode)|ters)|iles|o(?:dalClickResult|use(?:Button|TrackingRef|WheelAxis)))|Null|O(?:S(?:A(?:DialectInfo|ErrorRange|GenericStorage)|LTokenList|Status)|bject(?:BeingExamined|Specifier)|ffsetArray|unces|val)|P(?:String|a(?:ramInfo|steboardRef)|i(?:ct|x(?:MapMinus|elMap))|o(?:lygon|unds)|ro(?:cessSerialNumber|p(?:Info|erty))|tr)|Q(?:D(?:Point|R(?:e(?:ctangle|gion)|gnHandle))|uarts)|R(?:GB(?:16|96|Color)|angeDescriptor|e(?:ctangle|fCon|lative(?:Descriptor|Time)|plyPortAttr)|o(?:tation|undedRectangle|w))|S(?:Int(?:16|32|64)|R(?:Recognizer|SpeechResult)|c(?:r(?:ap(?:Ref|Styles)|ipt)|szResource)|ec(?:IdentityRef|tionH)|ignedByte(?:Count|Offset)|mall(?:32BitIcon|4BitIcon|8Bit(?:Icon|Mask)|IconAndMask)|ound|quare(?:Feet|Kilometers|M(?:eters|iles)|Yards)|tyled(?:Text|UnicodeText)|uiteInfo)|T(?:IFF|able(?:tP(?:oint(?:Rec|erRec)|roximityRec))?|ext(?:Range(?:Array)?|Styles)?|hemeMenu(?:ItemType|State|Type)|oken|rue|ype)|U(?:Int(?:16|32|64)|TF(?:16ExternalRepresentation|8Text)|nicodeText|serRecordFields)|V(?:ersion|oidPtr)|W(?:hose(?:Descriptor|Range)|i(?:ldCard|ndow(?:DefPartCode|Modality|PartCode|Re(?:f|gionCode)|Transition(?:Action|Effect))))|Yards))|u(?:n(?:doDev|i(?:code(?:BufErr|C(?:h(?:arErr|ecksumErr)|ontextualErr)|DirectionErr|ElementErr|FallbacksErr|No(?:TableErr|tFoundErr)|PartConvertErr|T(?:ableFormatErr|extEncodingDataErr)|VariantErr)|mpErr|t(?:EmptyErr|TblFullErr))|known(?:FormatErr|InsertModeErr)|resolvedComponentDLLErr|supported(?:AuxiliaryImportData|ForPlatformErr|OSErr|ProcessorErr))|p(?:d(?:PixMemErr|ate(?:Dev|Evt|Mask))|p(?:C(?:allComponent(?:C(?:anDoProcInfo|loseProcInfo)|Get(?:MPWorkFunctionProcInfo|PublicResourceProcInfo)|OpenProcInfo|RegisterProcInfo|TargetProcInfo|UnregisterProcInfo|VersionProcInfo)|omponent(?:FunctionImplementedProcInfo|SetTargetProcInfo))|GetComponentVersionProcInfo))|rlDataH(?:FTP(?:Bad(?:NameListErr|PasswordErr|UserErr)|DataConnectionErr|FilenameErr|N(?:eedPasswordErr|o(?:DirectoryErr|NetDriverErr|PasswordErr))|P(?:ermissionsErr|rotocolErr)|QuotaErr|S(?:erver(?:DisconnectedErr|Err)|hutdownErr)|URLErr)|HTTP(?:NoNetDriverErr|ProtocolErr|RedirectErr|URLErr))|se(?:A(?:Talk|sync)|ExtClk|Free|MIDI|r(?:Break|CanceledErr|DataItemNotFound|Item|Kind|RejectErr)))|v(?:AxisOnly|LckdErr|Typ(?:Err|e)|a(?:lid(?:DateFields|InstancesExist)|riationFontTableTag)|er(?:A(?:frikaans|lternateGr|r(?:abi(?:a|c)|menia(?:n)?)|ustr(?:alia|ia(?:German)?))|B(?:e(?:l(?:arus|giumLux(?:Point)?)|ngali)|hutan|r(?:azil|eton|it(?:ain|tany))|ulgaria|yeloRussian)|C(?:a(?:nada(?:Comma|Point)|talonia)|hina|roatia|yprus|zech)|Denmark|E(?:astAsiaGeneric|ngCanada|rr|s(?:peranto|tonia))|F(?:a(?:eroeIsl|r(?:EastGeneric|oeIsl))|inland|lemish(?:Point)?|r(?:Belgium(?:Lux)?|Canada|Swiss|ance|enchUniversal))|G(?:e(?:nericFE|orgia(?:n)?|rman(?:Reformed|y))|r(?:Swiss|ee(?:ce(?:Alt|Poly)?|kAncient|nland))|ujarati)|Hungary|I(?:celand|n(?:dia(?:Hindi|Urdu)?|ternational)|r(?:an|eland(?:English)?|ishGaelicScript)|srael|tal(?:ianSwiss|y))|Japan|Korea|L(?:a(?:pland|tvia)|ithuania)|M(?:a(?:cedonia(?:n)?|gyar|lta|nxGaelic|rathi)|ultilingual)|N(?:e(?:pal|therlands(?:Comma)?)|orway|unavut|ynorsk)|P(?:akistan(?:Urdu)?|o(?:land|rtugal)|unjabi)|R(?:omania|u(?:mania|ssia))|S(?:ami|c(?:ottishGaelic|riptGeneric)|erbia(?:n)?|ingapore|lov(?:ak|enia(?:n)?)|p(?:LatinAmerica|ain)|weden)|T(?:aiwan|hailand|ibet(?:an)?|onga|urk(?:ey|ishModified))|U(?:S|kra(?:ine|nia)|nspecified|zbek)|Vietnam|W(?:ales|elsh)|Yugo(?:Croatian|slavia)|variant(?:Denmark|Norway|Portugal))|ideoOutputInUseErr|m(?:AddressNotInFileViewErr|B(?:adDriver|usyBackingFileErr)|FileViewAccessErr|Invalid(?:BackingFileIDErr|FileViewIDErr|OwningProcessErr)|KernelMMUInitErr|M(?:appingPrivilegesErr|emLckdErr|orePhysicalThanVirtualErr)|No(?:More(?:BackingFilesErr|FileViewsErr)|VectorErr)|OffErr)|o(?:iceNotFound|l(?:GoneErr|Mount(?:Changed(?:Bit|Mask)|ExtendedFlags(?:Bit|Mask)|FSReservedMask|Interact(?:Bit|Mask)|NoLoginMsgFlag(?:Bit|Mask)|SysReservedMask)|O(?:ffLinErr|nLinErr)|VMBusyErr)))|w(?:C(?:alcRgns|ontentColor)|D(?:ispose|raw(?:GIcon)?)|FrameColor|Grow|Hi(?:liteColor|t)|In(?:Co(?:llapseBox|ntent)|Drag|G(?:oAway|row)|ProxyIcon|Structure|ToolbarButton|Zoom(?:In|Out))|N(?:ew|oHit)|PrErr|T(?:extColor|itleBarColor)|ack(?:Bad(?:FileErr|MetaDataErr)|ForkNotFoundErr)|eekOfYear(?:Field|Mask)|fFileNotFound|indow(?:A(?:ppModalStateAlreadyExistsErr|ttribute(?:ImmutableErr|sConflictErr))|GroupInvalidErr|ManagerInternalErr|NoAppModalStateErr|WrongStateErr)|r(?:PermErr|Underrun|gVolTypErr|it(?:Err|eReference|ingPastEnd)|ongApplicationPlatform))|y(?:dm|ear(?:Field|Mask)|md)|z(?:eroCycle|oom(?:DocProc|NoGrow)))\\b", + "name": "support.constant.c" + }, { "match": "\\bkCFNumberFormatter(?:Currency(?:AccountingStyle|ISOCodeStyle|PluralStyle)|OrdinalStyle)\\b", "name": "support.constant.cf.10.11.c" @@ -57,6 +209,14 @@ "match": "\\bkCFISO8601DateFormatWith(?:ColonSeparatorInTime(?:Zone)?|Da(?:shSeparatorInDate|y)|Full(?:Date|Time)|InternetDateTime|Month|SpaceBetweenDateAndTime|Time(?:Zone)?|WeekOfYear|Year)\\b", "name": "support.constant.cf.10.12.c" }, + { + "match": "\\bkCFISO8601DateFormatWithFractionalSeconds\\b", + "name": "support.constant.cf.10.13.c" + }, + { + "match": "\\bkCFURLEnumeratorGenerateRelativePathURLs\\b", + "name": "support.constant.cf.10.15.c" + }, { "match": "\\bkCFFileSecurityClear(?:AccessControlList|Group(?:UUID)?|Mode|Owner(?:UUID)?)\\b", "name": "support.constant.cf.10.8.c" @@ -65,6 +225,10 @@ "match": "\\b(?:CF(?:ByteOrder(?:BigEndian|LittleEndian|Unknown)|NotificationSuspensionBehavior(?:Coalesce|D(?:eliverImmediately|rop)|Hold))|kCF(?:B(?:ookmarkResolutionWithout(?:MountingMask|UIMask)|undleExecutableArchitecture(?:I386|PPC(?:64)?|X86_64))|C(?:alendar(?:ComponentsWrap|Unit(?:Day|Era|Hour|M(?:inute|onth)|Quarter|Second|Week(?:Of(?:Month|Year)|day(?:Ordinal)?)|Year(?:ForWeekOfYear)?))|haracterSet(?:AlphaNumeric|C(?:apitalizedLetter|ontrol)|Dec(?:imalDigit|omposable)|Illegal|L(?:etter|owercaseLetter)|N(?:ewline|onBase)|Punctuation|Symbol|UppercaseLetter|Whitespace(?:AndNewline)?)|ompare(?:Anchored|Backwards|CaseInsensitive|DiacriticInsensitive|EqualTo|ForcedOrdering|GreaterThan|L(?:essThan|ocalized)|N(?:onliteral|umerically)|WidthInsensitive))|Dat(?:aSearch(?:Anchored|Backwards)|eFormatter(?:FullStyle|LongStyle|MediumStyle|NoStyle|ShortStyle))|FileDescriptor(?:ReadCallBack|WriteCallBack)|LocaleLanguageDirection(?:BottomToTop|LeftToRight|RightToLeft|TopToBottom|Unknown)|MessagePort(?:BecameInvalidError|IsInvalid|ReceiveTimeout|S(?:endTimeout|uccess)|TransportError)|N(?:otification(?:DeliverImmediately|PostToAllSessions)|umber(?:C(?:FIndexType|GFloatType|harType)|DoubleType|F(?:loat(?:32Type|64Type|Type)|ormatter(?:CurrencyStyle|DecimalStyle|NoStyle|P(?:a(?:d(?:After(?:Prefix|Suffix)|Before(?:Prefix|Suffix))|rseIntegersOnly)|ercentStyle)|Round(?:Ceiling|Down|Floor|Half(?:Down|Even|Up)|Up)|S(?:cientificStyle|pellOutStyle)))|IntType|Long(?:LongType|Type)|MaxType|NSIntegerType|S(?:Int(?:16Type|32Type|64Type|8Type)|hortType)))|PropertyList(?:BinaryFormat_v1_0|Immutable|MutableContainers(?:AndLeaves)?|OpenStepFormat|Read(?:CorruptError|StreamError|UnknownVersionError)|WriteStreamError|XMLFormat_v1_0)|RunLoop(?:A(?:fterWaiting|llActivities)|Before(?:Sources|Timers|Waiting)|E(?:ntry|xit)|Run(?:Finished|HandledSource|Stopped|TimedOut))|S(?:ocket(?:A(?:cceptCallBack|utomaticallyReenable(?:AcceptCallBack|DataCallBack|ReadCallBack|WriteCallBack))|C(?:loseOnInvalidate|onnectCallBack)|DataCallBack|Error|LeaveErrors|NoCallBack|ReadCallBack|Success|Timeout|WriteCallBack)|tr(?:eam(?:E(?:rrorDomain(?:Custom|MacOSStatus|POSIX)|vent(?:CanAcceptBytes|E(?:ndEncountered|rrorOccurred)|HasBytesAvailable|None|OpenCompleted))|Status(?:AtEnd|Closed|Error|NotOpen|Open(?:ing)?|Reading|Writing))|ing(?:Encoding(?:A(?:NSEL|SCII)|Big5(?:_(?:E|HKSCS_1999))?|CNS_11643_92_P(?:1|2|3)|DOS(?:Arabic|BalticRim|C(?:anadianFrench|hinese(?:Simplif|Trad)|yrillic)|Greek(?:1|2)?|Hebrew|Icelandic|Japanese|Korean|Latin(?:1|2|US)|Nordic|Portuguese|Russian|T(?:hai|urkish))|E(?:BCDIC_(?:CP037|US)|UC_(?:CN|JP|KR|TW))|GB(?:K_95|_(?:18030_2000|2312_80))|HZ_GB_2312|ISO(?:Latin(?:1(?:0)?|2|3|4|5|6|7|8|9|Arabic|Cyrillic|Greek|Hebrew|Thai)|_2022_(?:CN(?:_EXT)?|JP(?:_(?:1|2|3))?|KR))|JIS_(?:C6226_78|X02(?:0(?:1_76|8_(?:83|90))|12_90))|K(?:OI8_(?:R|U)|SC_5601_(?:87|92_Johab))|Mac(?:Ar(?:abic|menian)|B(?:engali|urmese)|C(?:e(?:ltic|ntralEurRoman)|hinese(?:Simp|Trad)|roatian|yrillic)|D(?:evanagari|ingbats)|E(?:thiopic|xtArabic)|Farsi|G(?:aelic|eorgian|reek|u(?:jarati|rmukhi))|H(?:FS|ebrew)|I(?:celandic|nuit)|Japanese|K(?:annada|hmer|orean)|Laotian|M(?:alayalam|ongolian)|Oriya|Roman(?:Latin1|ian)?|S(?:inhalese|ymbol)|T(?:amil|elugu|hai|ibetan|urkish)|Ukrainian|V(?:T100|ietnamese))|N(?:extStep(?:Japanese|Latin)|onLossyASCII)|ShiftJIS(?:_X0213(?:_(?:00|MenKuTen))?)?|U(?:TF(?:16(?:BE|LE)?|32(?:BE|LE)?|7(?:_IMAP)?|8)|nicode)|VISCII|Windows(?:Arabic|BalticRim|Cyrillic|Greek|Hebrew|KoreanJohab|Latin(?:1|2|5)|Vietnamese))|NormalizationForm(?:C|D|K(?:C|D))|Tokenizer(?:AttributeLa(?:nguage|tinTranscription)|Token(?:Has(?:DerivedSubTokensMask|HasNumbersMask|NonLettersMask|SubTokensMask)|IsCJWordMask|No(?:ne|rmal))|Unit(?:LineBreak|Paragraph|Sentence|Word(?:Boundary)?)))))|TimeZoneNameStyle(?:DaylightSaving|Generic|S(?:hort(?:DaylightSaving|Generic|Standard)|tandard))|U(?:RL(?:Bookmark(?:Creation(?:MinimalBookmarkMask|S(?:ecurityScopeAllowOnlyReadAccess|uitableForBookmarkFile)|WithSecurityScope)|ResolutionWith(?:SecurityScope|out(?:MountingMask|UIMask)))|Component(?:Fragment|Host|NetLocation|P(?:a(?:rameterString|ssword|th)|ort)|Query|ResourceSpecifier|Scheme|User(?:Info)?)|Enumerator(?:D(?:e(?:faultBehavior|scendRecursively)|irectoryPostOrderSuccess)|E(?:nd|rror)|GenerateFileReferenceURLs|IncludeDirectoriesP(?:ostOrder|reOrder)|S(?:kip(?:Invisibles|PackageContents)|uccess))|POSIXPathStyle|WindowsPathStyle)|serNotification(?:AlternateResponse|Ca(?:ncelResponse|utionAlertLevel)|DefaultResponse|No(?:DefaultButtonFlag|teAlertLevel)|OtherResponse|PlainAlertLevel|StopAlertLevel|UseRadioButtonsFlag))|XML(?:E(?:ntityType(?:Character|Par(?:ameter|sed(?:External|Internal))|Unparsed)|rror(?:E(?:lementlessDocument|ncodingConversionFailure)|Malformed(?:C(?:DSect|haracterReference|loseTag|omment)|D(?:TD|ocument)|Name|P(?:arsedCharacterData|rocessingInstruction)|StartTag)|NoData|Un(?:expectedEOF|knownEncoding)))|Node(?:CurrentVersion|Type(?:Attribute(?:ListDeclaration)?|C(?:DATASection|omment)|Document(?:Fragment|Type)?|E(?:lement(?:TypeDeclaration)?|ntity(?:Reference)?)|Notation|ProcessingInstruction|Text|Whitespace))|Parser(?:A(?:ddImpliedAttributes|llOptions)|NoOptions|Re(?:placePhysicalEntities|solveExternalEntities)|Skip(?:MetaData|Whitespace)|ValidateDocument)|StatusParse(?:InProgress|NotBegun|Successful))))\\b", "name": "support.constant.cf.c" }, + { + "match": "\\bDISPATCH_WALLTIME_NOW\\b", + "name": "support.constant.clib.10.14.c" + }, { "match": "\\b(?:FILESEC_(?:ACL(?:_(?:ALLOCSIZE|RAW))?|GR(?:OUP|PUUID)|MODE|OWNER|UUID)|P_(?:ALL|P(?:GID|ID)))\\b", "name": "support.constant.clib.c" @@ -86,23 +250,39 @@ "name": "support.constant.os.c" }, { - "match": "\\bkCGImageByteOrder(?:16(?:Big|Little)|32(?:Big|Little)|Mask)\\b", - "name": "support.constant.quartz.10.12.c" + "match": "\\bkCGImagePixelFormat(?:Mask|Packed|RGB(?:101010|5(?:55|65)|CIF10))\\b", + "name": "support.constant.quartz.10.14.c" }, { - "match": "\\b(?:CG(?:GlyphM(?:ax|in)|PDFDataFormat(?:JPEG(?:2000|Encoded)|Raw)|RectM(?:ax(?:XEdge|YEdge)|in(?:XEdge|YEdge)))|kCG(?:A(?:nnotatedSessionEventTap|ssistiveTechHighWindowLevelKey)|B(?:a(?:ck(?:ingStore(?:Buffered|Nonretained|Retained)|stopMenuLevelKey)|seWindowLevelKey)|itmap(?:AlphaInfoMask|ByteOrder(?:16(?:Big|Little)|32(?:Big|Little)|Default|Mask)|Float(?:Components|InfoMask))|lendMode(?:C(?:lear|o(?:lor(?:Burn|Dodge)?|py))|D(?:arken|estination(?:Atop|In|O(?:ut|ver))|ifference)|Exclusion|H(?:ardLight|ue)|L(?:ighten|uminosity)|Multiply|Normal|Overlay|Plus(?:Darker|Lighter)|S(?:aturation|creen|o(?:ftLight|urce(?:Atop|In|Out)))|XOR))|C(?:aptureNo(?:Fill|Options)|o(?:lor(?:ConversionTransform(?:ApplySpace|FromSpace|ToSpace)|SpaceModel(?:CMYK|DeviceN|Indexed|Lab|Monochrome|Pattern|RGB|Unknown))|nfigure(?:For(?:AppOnly|Session)|Permanently))|ursorWindowLevelKey)|D(?:esktop(?:IconWindowLevelKey|WindowLevelKey)|isplay(?:AddFlag|BeginConfigurationFlag|D(?:esktopShapeChangedFlag|isabledFlag)|EnabledFlag|M(?:irrorFlag|ovedFlag)|RemoveFlag|S(?:etM(?:ainFlag|odeFlag)|tream(?:FrameStatus(?:Frame(?:Blank|Complete|Idle)|Stopped)|Update(?:DirtyRects|MovedRects|Re(?:ducedDirtyRects|freshedRects))))|UnMirrorFlag)|ockWindowLevelKey|raggingWindowLevelKey)|E(?:rror(?:CannotComplete|Failure|I(?:llegalArgument|nvalid(?:Con(?:nection|text)|Operation))|No(?:neAvailable|tImplemented)|RangeCheck|Success|TypeCheck)|vent(?:F(?:ilterMaskPermit(?:Local(?:KeyboardEvents|MouseEvents)|SystemDefinedEvents)|lag(?:Mask(?:Al(?:phaShift|ternate)|Co(?:mmand|ntrol)|Help|N(?:onCoalesced|umericPad)|S(?:econdaryFn|hift))|sChanged))|Key(?:Down|Up)|LeftMouse(?:D(?:own|ragged)|Up)|Mouse(?:Moved|Subtype(?:Default|TabletP(?:oint|roximity)))|Null|OtherMouse(?:D(?:own|ragged)|Up)|RightMouse(?:D(?:own|ragged)|Up)|S(?:crollWheel|ource(?:GroupID|State(?:CombinedSessionState|HIDSystemState|ID|Private)|U(?:nixProcessID|ser(?:Data|ID)))|uppressionState(?:RemoteMouseDrag|SuppressionInterval))|Ta(?:bletP(?:ointer|roximity)|p(?:DisabledBy(?:Timeout|UserInput)|Option(?:Default|ListenOnly))|rget(?:ProcessSerialNumber|UnixProcessID))))|F(?:loatingWindowLevelKey|ontPostScriptFormatType(?:1|3|42))|G(?:esturePhase(?:Began|C(?:ancelled|hanged)|Ended|MayBegin|None)|radientDraws(?:AfterEndLocation|BeforeStartLocation))|H(?:IDEventTap|e(?:adInsertEventTap|lpWindowLevelKey))|I(?:mageAlpha(?:First|Last|None(?:Skip(?:First|Last))?|Only|Premultiplied(?:First|Last))|nterpolation(?:Default|High|Low|Medium|None))|KeyboardEvent(?:Autorepeat|Key(?:boardType|code))|Line(?:Cap(?:Butt|Round|Square)|Join(?:Bevel|Miter|Round))|M(?:a(?:inMenuWindowLevelKey|ximumWindowLevelKey)|inimumWindowLevelKey|o(?:dalPanelWindowLevelKey|mentumScrollPhase(?:Begin|Continue|End|None)|use(?:Button(?:Center|Left|Right)|Event(?:ButtonNumber|ClickState|Delta(?:X|Y)|InstantMouser|Number|Pressure|Subtype|WindowUnderMousePointer(?:ThatCanHandleThisEvent)?))))|N(?:ormalWindowLevelKey|umberOf(?:EventSuppressionStates|WindowLevelKeys))|OverlayWindowLevelKey|P(?:DF(?:ArtBox|BleedBox|CropBox|MediaBox|ObjectType(?:Array|Boolean|Dictionary|Integer|N(?:ame|ull)|Real|Str(?:eam|ing))|TrimBox)|at(?:h(?:E(?:OFill(?:Stroke)?|lement(?:Add(?:CurveToPoint|LineToPoint|QuadCurveToPoint)|CloseSubpath|MoveToPoint))|Fill(?:Stroke)?|Stroke)|ternTiling(?:ConstantSpacing(?:MinimalDistortion)?|NoDistortion))|opUpMenuWindowLevelKey)|RenderingIntent(?:AbsoluteColorimetric|Default|Perceptual|RelativeColorimetric|Saturation)|S(?:cr(?:een(?:SaverWindowLevelKey|UpdateOperation(?:Move|Re(?:ducedDirtyRectangleCount|fresh)))|oll(?:EventUnit(?:Line|Pixel)|Phase(?:Began|C(?:ancelled|hanged)|Ended|MayBegin)|WheelEvent(?:DeltaAxis(?:1|2|3)|FixedPtDeltaAxis(?:1|2|3)|I(?:nstantMouser|sContinuous)|MomentumPhase|PointDeltaAxis(?:1|2|3)|Scroll(?:Count|Phase))))|essionEventTap|tatusWindowLevelKey)|T(?:a(?:blet(?:Event(?:DeviceID|Point(?:Buttons|Pressure|X|Y|Z)|Rotation|T(?:angentialPressure|ilt(?:X|Y))|Vendor(?:1|2|3))|ProximityEvent(?:CapabilityMask|DeviceID|EnterProximity|Pointer(?:ID|Type)|SystemTabletID|TabletID|Vendor(?:ID|Pointer(?:SerialNumber|Type)|UniqueID)))|ilAppendEventTap)|ext(?:Clip|Fill(?:Clip|Stroke(?:Clip)?)?|Invisible|Stroke(?:Clip)?)|ornOffMenuWindowLevelKey)|UtilityWindowLevelKey|Window(?:Image(?:B(?:estResolution|oundsIgnoreFraming)|Default|NominalResolution|OnlyShadows|ShouldBeOpaque)|List(?:ExcludeDesktopElements|Option(?:All|IncludingWindow|OnScreen(?:AboveWindow|BelowWindow|Only)))|Sharing(?:None|Read(?:Only|Write)))))\\b", + "match": "\\bCGPDFTagType(?:A(?:nnotation|rt)|B(?:ibliography|lockQuote)|C(?:aption|ode)|D(?:iv|ocument)|F(?:igure|orm(?:ula)?)|Header(?:1|2|3|4|5|6)?|Index|L(?:abel|i(?:nk|st(?:Body|Item)?))|No(?:nStructure|te)|P(?:ar(?:agraph|t)|rivate)|Quote|R(?:eference|uby(?:AnnotationText|BaseText|Punctuation)?)|S(?:ection|pan)|T(?:OC(?:I)?|able(?:Body|DataCell|Footer|Header(?:Cell)?|Row)?)|Warichu(?:Punctiation|Text)?)\\b", + "name": "support.constant.quartz.10.15.c" + }, + { + "match": "\\b(?:CG(?:GlyphM(?:ax|in)|PDFDataFormat(?:JPEG(?:2000|Encoded)|Raw)|RectM(?:ax(?:XEdge|YEdge)|in(?:XEdge|YEdge)))|kCG(?:A(?:nnotatedSessionEventTap|ssistiveTechHighWindowLevelKey)|B(?:a(?:ck(?:ingStore(?:Buffered|Nonretained|Retained)|stopMenuLevelKey)|seWindowLevelKey)|itmap(?:AlphaInfoMask|ByteOrder(?:16(?:Big|Little)|32(?:Big|Little)|Default|Mask)|Float(?:Components|InfoMask))|lendMode(?:C(?:lear|o(?:lor(?:Burn|Dodge)?|py))|D(?:arken|estination(?:Atop|In|O(?:ut|ver))|ifference)|Exclusion|H(?:ardLight|ue)|L(?:ighten|uminosity)|Multiply|Normal|Overlay|Plus(?:Darker|Lighter)|S(?:aturation|creen|o(?:ftLight|urce(?:Atop|In|Out)))|XOR))|C(?:aptureNo(?:Fill|Options)|o(?:lor(?:ConversionTransform(?:ApplySpace|FromSpace|ToSpace)|SpaceModel(?:CMYK|DeviceN|Indexed|Lab|Monochrome|Pattern|RGB|Unknown|XYZ))|nfigure(?:For(?:AppOnly|Session)|Permanently))|ursorWindowLevelKey)|D(?:esktop(?:IconWindowLevelKey|WindowLevelKey)|isplay(?:AddFlag|BeginConfigurationFlag|D(?:esktopShapeChangedFlag|isabledFlag)|EnabledFlag|M(?:irrorFlag|ovedFlag)|RemoveFlag|S(?:etM(?:ainFlag|odeFlag)|tream(?:FrameStatus(?:Frame(?:Blank|Complete|Idle)|Stopped)|Update(?:DirtyRects|MovedRects|Re(?:ducedDirtyRects|freshedRects))))|UnMirrorFlag)|ockWindowLevelKey|raggingWindowLevelKey)|E(?:rror(?:CannotComplete|Failure|I(?:llegalArgument|nvalid(?:Con(?:nection|text)|Operation))|No(?:neAvailable|tImplemented)|RangeCheck|Success|TypeCheck)|vent(?:F(?:ilterMaskPermit(?:Local(?:KeyboardEvents|MouseEvents)|SystemDefinedEvents)|lag(?:Mask(?:Al(?:phaShift|ternate)|Co(?:mmand|ntrol)|Help|N(?:onCoalesced|umericPad)|S(?:econdaryFn|hift))|sChanged))|Key(?:Down|Up)|LeftMouse(?:D(?:own|ragged)|Up)|Mouse(?:Moved|Subtype(?:Default|TabletP(?:oint|roximity)))|Null|OtherMouse(?:D(?:own|ragged)|Up)|RightMouse(?:D(?:own|ragged)|Up)|S(?:crollWheel|ource(?:GroupID|State(?:CombinedSessionState|HIDSystemState|ID|Private)|U(?:nixProcessID|ser(?:Data|ID)))|uppressionState(?:RemoteMouseDrag|SuppressionInterval))|Ta(?:bletP(?:ointer|roximity)|p(?:DisabledBy(?:Timeout|UserInput)|Option(?:Default|ListenOnly))|rget(?:ProcessSerialNumber|UnixProcessID))|UnacceleratedPointerMovement(?:X|Y)))|F(?:loatingWindowLevelKey|ontPostScriptFormatType(?:1|3|42))|G(?:esturePhase(?:Began|C(?:ancelled|hanged)|Ended|MayBegin|None)|radientDraws(?:AfterEndLocation|BeforeStartLocation))|H(?:IDEventTap|e(?:adInsertEventTap|lpWindowLevelKey))|I(?:mage(?:Alpha(?:First|Last|None(?:Skip(?:First|Last))?|Only|Premultiplied(?:First|Last))|ByteOrder(?:16(?:Big|Little)|32(?:Big|Little)|Default|Mask))|nterpolation(?:Default|High|Low|Medium|None))|KeyboardEvent(?:Autorepeat|Key(?:boardType|code))|Line(?:Cap(?:Butt|Round|Square)|Join(?:Bevel|Miter|Round))|M(?:a(?:inMenuWindowLevelKey|ximumWindowLevelKey)|inimumWindowLevelKey|o(?:dalPanelWindowLevelKey|mentumScrollPhase(?:Begin|Continue|End|None)|use(?:Button(?:Center|Left|Right)|Event(?:ButtonNumber|ClickState|Delta(?:X|Y)|InstantMouser|Number|Pressure|Subtype|WindowUnderMousePointer(?:ThatCanHandleThisEvent)?))))|N(?:ormalWindowLevelKey|umberOf(?:EventSuppressionStates|WindowLevelKeys))|OverlayWindowLevelKey|P(?:DF(?:A(?:llows(?:Co(?:mmenting|ntent(?:Accessibility|Copying))|Document(?:Assembly|Changes)|FormFieldEntry|HighQualityPrinting|LowQualityPrinting)|rtBox)|BleedBox|CropBox|MediaBox|ObjectType(?:Array|Boolean|Dictionary|Integer|N(?:ame|ull)|Real|Str(?:eam|ing))|TrimBox)|at(?:h(?:E(?:OFill(?:Stroke)?|lement(?:Add(?:CurveToPoint|LineToPoint|QuadCurveToPoint)|CloseSubpath|MoveToPoint))|Fill(?:Stroke)?|Stroke)|ternTiling(?:ConstantSpacing(?:MinimalDistortion)?|NoDistortion))|opUpMenuWindowLevelKey)|RenderingIntent(?:AbsoluteColorimetric|Default|Perceptual|RelativeColorimetric|Saturation)|S(?:cr(?:een(?:SaverWindowLevelKey|UpdateOperation(?:Move|Re(?:ducedDirtyRectangleCount|fresh)))|oll(?:EventUnit(?:Line|Pixel)|Phase(?:Began|C(?:ancelled|hanged)|Ended|MayBegin)|WheelEvent(?:DeltaAxis(?:1|2|3)|FixedPtDeltaAxis(?:1|2|3)|I(?:nstantMouser|sContinuous)|MomentumPhase|PointDeltaAxis(?:1|2|3)|Scroll(?:Count|Phase))))|essionEventTap|tatusWindowLevelKey)|T(?:a(?:blet(?:Event(?:DeviceID|Point(?:Buttons|Pressure|X|Y|Z)|Rotation|T(?:angentialPressure|ilt(?:X|Y))|Vendor(?:1|2|3))|ProximityEvent(?:CapabilityMask|DeviceID|EnterProximity|Pointer(?:ID|Type)|SystemTabletID|TabletID|Vendor(?:ID|Pointer(?:SerialNumber|Type)|UniqueID)))|ilAppendEventTap)|ext(?:Clip|Fill(?:Clip|Stroke(?:Clip)?)?|Invisible|Stroke(?:Clip)?)|ornOffMenuWindowLevelKey)|UtilityWindowLevelKey|Window(?:Image(?:B(?:estResolution|oundsIgnoreFraming)|Default|NominalResolution|OnlyShadows|ShouldBeOpaque)|List(?:ExcludeDesktopElements|Option(?:All|IncludingWindow|OnScreen(?:AboveWindow|BelowWindow|Only)))|Sharing(?:None|Read(?:Only|Write)))))\\b", "name": "support.constant.quartz.c" }, + { + "match": "\\bcl_device_id\\b", + "name": "support.type.10.10.c" + }, + { + "match": "\\b(?:JSTypedArrayType|SecKey(?:Algorithm|KeyExchangeParameter)|os_unfair_lock(?:_t)?)\\b", + "name": "support.type.10.12.c" + }, + { + "match": "\\b(?:A(?:E(?:A(?:ddressDesc|rray(?:Data(?:Pointer)?|Type))|BuildError(?:Code)?|Coerc(?:e(?:Desc(?:ProcPtr|UPP)|Ptr(?:ProcPtr|UPP))|ionHandlerUPP)|D(?:ataStorage(?:Type)?|esc(?:List|Ptr)?|isposeExternal(?:ProcPtr|UPP))|Event(?:Class|Handler(?:ProcPtr|UPP)|ID|Source)|Filter(?:ProcPtr|UPP)|I(?:dle(?:ProcPtr|UPP)|nteractAllowed)|Key(?:Desc|word)|Re(?:cord|moteProcessResolver(?:C(?:allback|ontext)|Ref)?|turnID)|S(?:end(?:Mode|Priority)|treamRef)|TransactionID)|FP(?:AlternateAddress|ServerSignature|TagData|VolMountInfo(?:Ptr)?|XVolMountInfo(?:Ptr)?)|HTOCType|IFFLoop|LMX(?:GlyphEntry|Header)|TS(?:Cu(?:bic(?:C(?:losePath(?:ProcPtr|UPP)|urveTo(?:ProcPtr|UPP))|LineTo(?:ProcPtr|UPP)|MoveTo(?:ProcPtr|UPP))|rveType)|F(?:SSpec|latData(?:Font(?:NameDataHeader|Spec(?:RawNameData(?:Header)?|iferType))|L(?:ayoutControlsDataHeader|ineInfo(?:Data|Header))|MainHeaderBlock|Style(?:List(?:FeatureData|Header|StyleDataHeader|VariationData)|RunDataHeader)|TextLayout(?:DataHeader|Header))|ont(?:A(?:pplierFunction|utoActivationSetting)|Cont(?:ainerRef|ext)|F(?:amily(?:ApplierFunction|Iterator(?:_)?|Ref)|ilter(?:Selector)?|ormat)|Iterator(?:_)?|Metrics|Notif(?:ication(?:InfoRef(?:_)?|Ref(?:_)?)|y(?:Action|Option))|Query(?:Callback|MessageID|SourceContext)|Ref|Size))|G(?:eneration|lyph(?:I(?:dealMetrics|nfoFlags)|Ref|ScreenMetrics|Vector))|Just(?:PriorityWidthDeltaOverrides|WidthDeltaEntryOverride)|L(?:ayoutRecord|ineLayoutOptions)|NotificationCallback|OptionFlags|Point|Quadratic(?:C(?:losePath(?:ProcPtr|UPP)|urve(?:ProcPtr|UPP))|Line(?:ProcPtr|UPP)|NewPath(?:ProcPtr|UPP))|StyleRenderingOptions|Trapezoid|U(?:Attribute(?:Info|Tag|ValuePtr)|Background(?:Color|Data(?:Type)?)|C(?:aret|ur(?:sorMovementType|vePath(?:s)?))|Direct(?:DataSelector|LayoutOperationOverride(?:ProcPtr|UPP))|F(?:latten(?:StyleRunOptions|edDataStreamFormat)|ont(?:F(?:allback(?:Method|s)|eature(?:Selector|Type))|ID|Variation(?:Axis|Value)))|Glyph(?:Info(?:Array)?|Selector)|HighlightMethod|L(?:ayoutOperation(?:CallbackStatus|OverrideSpecifier|Selector)|ine(?:Ref|Truncation))|RGBAlphaColor|Style(?:Comparison|LineCountType|RunInfo|SettingRef)?|T(?:ab(?:Type)?|ext(?:Layout|Measurement))|Un(?:FlattenStyleRunOptions|highlightData)|VerticalCharacterType))|U(?:3DMixer(?:AttenuationCurve|RenderingFlags)|ChannelInfo|D(?:ependentParameter|istanceAttenuationData)|EventListener(?:Block|Proc|Ref)|Graph|Host(?:Identifier|VersionIdentifier)|InputSamplesInOutputCallback(?:Struct)?|ListenerBase|MIDIOutputCallback(?:Struct)?|N(?:ode(?:Connection|Interaction|RenderCallback)?|umVersion)|P(?:arameter(?:EventType|Listener(?:Block|Proc|Ref)|MIDIMapping(?:Flags)?)|reset(?:Event)?)|Re(?:nderCallback(?:Struct)?|verbRoomType)|S(?:ampler(?:BankPresetData|InstrumentData)|cheduledAudioSliceFlags|patial(?:Mixer(?:AttenuationCurve|RenderingFlags)|izationAlgorithm)))|V(?:Audio(?:Integer|SessionErrorCode|UInteger)|L(?:CompareItems(?:ProcPtr|UPP)|DisposeItem(?:ProcPtr|UPP)|ItemSize(?:ProcPtr|UPP)|NodeType|Order|Tree(?:Ptr|Struct)|VisitStage|Walk(?:ProcPtr|UPP)))|X(?:CopyMultipleAttributeOptions|Error|MenuItemModifiers|Observer(?:Callback(?:WithInfo)?|Ref)|Priority|U(?:IElementRef|nderlineStyle)|Value(?:Ref|Type))|l(?:ert(?:Std(?:AlertParam(?:Ptr|Rec)|CFStringAlertParam(?:Ptr|Rec))|T(?:Hndl|Ptr|emplate|ype))|ias(?:Handle|InfoType|Ptr|Record))|n(?:chorPoint(?:Table)?|krTable)|pp(?:Parameters(?:Ptr)?|earance(?:PartCode|RegionCode)|l(?:eEvent(?:Ptr)?|icationSpecificChunk(?:Ptr)?))|reaID|sscEntry|u(?:dio(?:B(?:alanceFade(?:Type)?|uffer(?:List)?|ytePacketTranslation(?:Flags)?)|C(?:hannel(?:Bitmap|CoordinateIndex|Description|Flags|La(?:bel|yout(?:Tag)?))|lass(?:Description|ID)|o(?:dec(?:AppendInput(?:BufferListProc|DataProc)|GetProperty(?:InfoProc|Proc)|InitializeProc|MagicCookieInfo|Pr(?:imeInfo|o(?:duceOutput(?:BufferListProc|PacketsProc)|pertyID))|ResetProc|SetPropertyProc|UninitializeProc)?|mponent(?:Description|F(?:actoryFunction|lags)|Instan(?:ce|tiationOptions)|Method|PlugInInterface|ValidationResult)?|nverter(?:ComplexInputDataProc|InputDataProc|Pr(?:imeInfo|opertyID)|Ref)))|Device(?:I(?:D|O(?:Block|Proc(?:ID)?))|Property(?:ID|ListenerProc))|F(?:ile(?:Component(?:C(?:loseProc|ountUserDataProc|reateURLProc)|ExtensionIsThisFormatProc|FileDataIsThisFormatProc|Get(?:GlobalInfo(?:Proc|SizeProc)|Property(?:InfoProc|Proc)|UserData(?:Proc|SizeProc))|InitializeWithCallbacksProc|Op(?:en(?:URLProc|WithCallbacksProc)|timizeProc)|PropertyID|Re(?:ad(?:BytesProc|Packet(?:DataProc|sProc))|moveUserDataProc)|Set(?:PropertyProc|UserDataProc)|Write(?:BytesProc|PacketsProc))?|F(?:DFTable(?:Extended)?|lags)|ID|Marker(?:List)?|P(?:acketTableInfo|ermissions|ropertyID)|Region(?:Flags|List)?|Stream(?:ID|P(?:arseFlags|roperty(?:Flags|ID))|SeekFlags|_P(?:acketsProc|ropertyListenerProc))|Type(?:AndFormatID|ID)|_(?:GetSizeProc|ReadProc|S(?:MPTE_Time|etSizeProc)|WriteProc))|ormat(?:Flags|I(?:D|nfo)|ListItem|PropertyID)|ramePacketTranslation)|Hardware(?:IOProcStreamUsage|P(?:owerHint|roperty(?:ID|ListenerProc)))|IndependentPacketTranslation|LevelControlTransferFunction|O(?:bject(?:ID|Property(?:Address|Element|Listener(?:Block|Proc)|S(?:cope|elector)))|utputUnitSt(?:art(?:AtTimeParams|Proc)|opProc))|Pa(?:cket(?:DependencyInfoTranslation|R(?:angeByteCountTranslation|ollDistanceTranslation))|nning(?:Info|Mode))|Queue(?:Buffer(?:Ref)?|ChannelAssignment|InputCallback(?:Block)?|LevelMeterState|OutputCallback(?:Block)?|P(?:arameter(?:Event|ID|Value)|ro(?:cessingTap(?:Callback|Flags|Ref)|perty(?:ID|ListenerProc)))|Ref|TimelineRef)|RecordingChunk(?:Ptr)?|S(?:ampleType|e(?:rvices(?:PropertyID|SystemSoundCompletionProc)|ttingsFlags)|tream(?:BasicDescription|ID|P(?:acketDescription|ropertyListenerProc)|RangedDescription))|TimeStamp(?:Flags)?|Unit(?:Add(?:PropertyListenerProc|RenderNotifyProc)|Co(?:coaViewInfo|mplexRenderProc|nnection)|E(?:lement|vent(?:Type)?|xternalBuffer)|FrequencyResponseBin|GetP(?:arameterProc|roperty(?:InfoProc|Proc))|InitializeProc|M(?:IDIControlMapping|eterClipping)|NodeConnection|OtherPluginDesc|P(?:arameter(?:Event|HistoryInfo|I(?:D(?:Name)?|nfo)|NameInfo|Options|StringFromValue|Unit|Value(?:FromString|Name|Translation)?)?|r(?:esetMAS_Setting(?:Data|s)|o(?:cess(?:MultipleProc|Proc)|perty(?:ID|ListenerProc)?)))|Re(?:move(?:PropertyListener(?:Proc|WithUserDataProc)|RenderNotifyProc)|nder(?:ActionFlags|Proc)|setProc)|S(?:ampleType|c(?:heduleParametersProc|ope)|etP(?:arameterProc|ropertyProc))|UninitializeProc)?|Value(?:Range|Translation))|thorization(?:AsyncCallback|E(?:nvironment|xternalForm)|Flags|Item(?:Set)?|OpaqueRef|R(?:ef|ights)|String)))|B(?:T(?:HeaderRec|NodeDescriptor|reeKey(?:Limits)?)|asicWindowDescription|i(?:gEndian(?:Fixed|Long|OSType|Short|U(?:Int32|nsigned(?:Fixed|Long|Short)))|tMap(?:Handle|Ptr)?)|sln(?:Baseline(?:Class|Record)|Format(?:0Part|1Part|2Part|3Part|Union)|Table(?:Format|Ptr)?))|C(?:A(?:BarBeatTime|Clock(?:Beats|ListenerProc|Message|PropertyID|Ref|S(?:MPTEFormat|amples|econds|yncMode)|T(?:empo|ime(?:Format|base)?))|F(?:Audio(?:Description|FormatListItem)|ChunkHeader|DataChunk|F(?:ileHeader|ormatFlags)|In(?:foStrings|strumentChunk)|Marker(?:Chunk)?|Overview(?:Chunk|Sample)|P(?:acketTableHeader|eakChunk|ositionPeak)|Region(?:Chunk|Flags)?|String(?:ID|s)|UMIDChunk|_(?:SMPTE_Time|UUID_ChunkHeader))|MeterTrackEntry|T(?:empoMapEntry|ransform3D))|C(?:Tab(?:Handle|Ptr)|_(?:LONG(?:64)?|MD(?:2(?:_CTX|state_st)|4(?:_CTX|state_st)|5(?:_CTX|state_st))|SHA(?:1(?:_CTX|state_st)|256(?:_CTX|state_st)|512(?:_CTX|state_st))))|E_(?:CrlNumber|D(?:ataType|eltaCrl)|ExtendedKeyUsage|GeneralNameType)|F(?:H(?:TTP(?:AuthenticationRef|MessageRef)|ost(?:ClientC(?:allBack|ontext)|InfoType|Ref))|Net(?:Diagnostic(?:Ref|StatusValues)|Service(?:Browser(?:ClientCallBack|Flags|Ref)|ClientC(?:allBack|ontext)|Monitor(?:ClientCallBack|Ref|Type)|Re(?:f|gisterFlags)|sError)|workErrors)|ProxyAutoConfigurationResultCallback|StreamErrorHTTP(?:Authentication)?)|G(?:Image(?:AnimationStatus|Destination(?:Ref)?|Metadata(?:Errors|Ref|T(?:ag(?:Ref)?|ype))?|PropertyOrientation|Source(?:AnimationBlock|Ref|Status)?)|L(?:C(?:PContextPriorityRequest|ontext(?:Enable|Obj|Parameter))|Error|G(?:PURestartStatus|lobalOption)|OpenGLProfile|P(?:BufferObj|ixelFormat(?:Attribute|Obj))|Renderer(?:InfoObj|Property)|ShareGroup(?:Obj|Rec))|MutableImageMetadataRef|rafP(?:ort|tr))|M(?:2(?:Header|Profile(?:Ptr)?)|4Header|AdaptationMatrixType|B(?:itmap|ufferLocation)|C(?:MY(?:Color|KColor)|oncatProfileSet|urveType)|D(?:at(?:aType|eTime(?:Type)?)|evice(?:Class|Info|Profile(?:Array|Info)|Scope))|F(?:ixedXY(?:Color|ZColor)|l(?:atten(?:ProcPtr|UPP)|oatBitmap(?:Flags)?))|GrayColor|H(?:LSColor|SVColor|andleLocation)|IntentCRDVMSize|L(?:abColor|u(?:t(?:16Type|8Type)|vColor))|M(?:CreateTransformPropertyProc|Info|akeAndModel(?:Type)?|easurementType|ulti(?:Funct(?:CLUTType|Lut(?:A2BType|Type))|LocalizedUniCode(?:EntryRec|Type)|channel(?:5Color|6Color|7Color|8Color)))|Na(?:medColor(?:2(?:EntryType|Type)|Type)?|tiveDisplayInfo(?:Type)?)|P(?:S2CRDVMSizeType|a(?:rametricCurveType|thLocation)|rofile(?:IterateData|Location|SequenceDescType))|RGBColor|S(?:15Fixed16ArrayType|CertificateChainMode|DecoderRef|EncoderRef|Signe(?:dAttributes|rStatus)|creening(?:ChannelRec|Type)|ignatureType)|T(?:ag(?:ElemTable|Record)|ext(?:DescriptionType|Type))|U(?:16Fixed16ArrayType|Int(?:16ArrayType|32ArrayType|64ArrayType|8ArrayType)|crBgType|nicodeTextType)|Vi(?:deoCardGamma(?:Formula|T(?:able|ype))?|ewingConditionsType)|XYZ(?:Co(?:lor|mponent)|Type)|YxyColor)|QDProcs(?:Ptr)?|S(?:ComponentsThreadMode|DiskSpaceRecovery(?:Callback|Options)|Identity(?:AuthorityRef|Cl(?:ass|ientContext)|Flags|Query(?:ClientContext|Event|Flags|Re(?:ceiveEventCallback|f)|StringComparisonMethod)|Ref|StatusUpdatedCallback)|SM_(?:A(?:C(?:L_(?:AUTHORIZATION_TAG|EDIT_MODE|HANDLE|KEYCHAIN_PROMPT_SELECTOR|PR(?:EAUTH_TRACKING_STATE|OCESS_SUBJECT_SELECTOR)|SUBJECT_TYPE)|_HANDLE)|LGORITHMS|PPLE(?:CSPDL_DB_(?:CHANGE_PASSWORD_PARAMETERS(?:_PTR)?|IS_LOCKED_PARAMETERS(?:_PTR)?|SETTINGS_PARAMETERS(?:_PTR)?)|DL_OPEN_PARAMETERS(?:_PTR)?|_(?:CL_CSR_REQUEST|TP_(?:ACTION_(?:DATA|FLAGS)|C(?:ERT_REQUEST|RL_OPT(?:IONS|_FLAGS))|NAME_OID|S(?:MIME_OPTIONS|SL_OPTIONS))))|TT(?:ACH_FLAGS|RIBUTE_TYPE))|B(?:ER_TAG|ITMASK|OOL)|C(?:ALLOC|C_HANDLE|ERT(?:GROUP_TYPE(?:_PTR)?|_(?:BUNDLE_(?:ENCODING|TYPE)|ENCODING(?:_PTR)?|PARSE_FORMAT(?:_PTR)?|TYPE(?:_PTR)?))|L_(?:HANDLE|TEMPLATE_TYPE)|ONTEXT_(?:EVENT|TYPE)|RL(?:GROUP_TYPE(?:_PTR)?|_(?:ENCODING(?:_PTR)?|PARSE_FORMAT(?:_PTR)?|TYPE(?:_PTR)?))|SP(?:TYPE|_(?:FLAGS|HANDLE|READER_FLAGS)))|D(?:B_(?:A(?:CCESS_TYPE(?:_PTR)?|TTRIBUTE_(?:FORMAT(?:_PTR)?|NAME_FORMAT(?:_PTR)?))|CONJUNCTIVE(?:_PTR)?|HANDLE|INDEX(?:ED_DATA_LOCATION|_TYPE)|MODIFY_MODE|OPERATOR(?:_PTR)?|RE(?:CORDTYPE|TRIEVAL_MODES))|L(?:TYPE(?:_PTR)?|_(?:CUSTOM_ATTRIBUTES|FFS_ATTRIBUTES|HANDLE|LDAP_ATTRIBUTES|ODBC_ATTRIBUTES|PKCS11_ATTRIBUTE(?:_PTR)?)))|E(?:NCRYPT_MODE|VIDENCE_FORM)|FREE|H(?:ANDLE(?:_PTR)?|EADERVERSION)|INTPTR|K(?:EY(?:ATTR_FLAGS|BLOB_(?:FORMAT|TYPE)|CLASS|USE|_(?:HIERARCHY|TYPE))|R(?:SP_HANDLE|_POLICY_(?:FLAGS|TYPE)))|L(?:IST_(?:ELEMENT_(?:PTR|TYPE(?:_PTR)?)|TYPE(?:_PTR)?)|ONG_HANDLE(?:_PTR)?)|M(?:A(?:LLOC|NAGER_EVENT_TYPES)|ODULE_(?:EVENT(?:_PTR)?|HANDLE(?:_PTR)?))|NET_(?:ADDRESS_TYPE|PROTOCOL)|P(?:ADDING|KCS(?:5_PBKDF2_PRF|_OAEP_(?:MGF|PSOURCE))|R(?:IVILEGE(?:_SCOPE)?|OC_ADDR(?:_PTR)?)|VC_MODE)|QUERY_FLAGS|RE(?:ALLOC|TURN)|S(?:AMPLE_TYPE|C_FLAGS|ERVICE_(?:MASK|TYPE)|IZE|TRING)|T(?:IMESTRING|P_(?:A(?:CTION|PPLE_(?:CERT_STATUS|EVIDENCE_HEADER)|UTHORITY_REQUEST_TYPE(?:_PTR)?)|C(?:ERT(?:CHANGE_(?:ACTION|REASON|STATUS)|ISSUE_STATUS|NOTARIZE_STATUS|RECLAIM_STATUS|VERIFY_STATUS)|ONFIRM_STATUS(?:_PTR)?|RLISSUE_STATUS)|FORM_TYPE|HANDLE|S(?:ERVICES|TOP_ON)))|USEE_TAG|WORDID_TYPE|X509(?:EXT_DATA_FORMAT|_OPTION))|pecArray)|T(?:CharacterCollection|F(?:ont(?:Collection(?:CopyOptions|Ref|SortDescriptorsCallback)|Descriptor(?:MatchingState|Ref)|Format|Manager(?:AutoActivationSetting|Error|Scope)|O(?:ptions|rientation)|Priority|Ref|S(?:tylisticClass|ymbolicTraits)|Table(?:Options|Tag)|UIFontType)|rame(?:P(?:athFillRule|rogression)|Ref|setterRef))|GlyphInfoRef|Line(?:B(?:oundsOptions|reakMode)|Ref|TruncationType)|MutableFontCollectionRef|ParagraphStyle(?:Ref|S(?:etting|pecifier))|Ru(?:by(?:A(?:lignment|nnotationRef)|Overhang|Position)|n(?:Delegate(?:Callbacks|DeallocateCallback|Get(?:AscentCallback|DescentCallback|WidthCallback)|Ref)|Ref|Status))|T(?:ext(?:Alignment|TabRef)|ypesetterRef)|UnderlineStyle(?:Modifiers)?|WritingDirection|ab(?:Handle|Ptr))|V(?:AttachmentMode|BufferRef|DisplayLink(?:Output(?:Callback|Handler)|Ref)|FillExtendedPixelsCallBack(?:Data)?|ImageBufferRef|Op(?:enGL(?:Buffer(?:PoolRef|Ref)|Texture(?:CacheRef|Ref))|tionFlags)|P(?:ixelBuffer(?:LockFlags|Pool(?:FlushFlags|Ref)|Re(?:f|lease(?:BytesCallback|PlanarBytesCallback)))|lanar(?:ComponentInfo|PixelBufferInfo(?:_YCbCr(?:BiPlanar|Planar))?))|Return|SMPTETime(?:Flags|Type)?|Time(?:Flags|Stamp(?:Flags)?)?)|a(?:l(?:ibrat(?:e(?:Event(?:ProcPtr|UPP)|ProcPtr|UPP)|orInfo)|lingConventionType)|nCalibrate(?:ProcPtr|UPP)|retHook(?:ProcPtr|UPP)|tPositionRec)|ell|h(?:ar(?:ByteTable|s(?:Handle|Ptr)?)|unkHeader)|lickActivationResult|o(?:l(?:l(?:atorRef|ection(?:Exception(?:ProcPtr|UPP)|Flatten(?:ProcPtr|UPP)|Tag)?)|or(?:C(?:hangedUPP|omplement(?:ProcPtr|UPP))|S(?:earch(?:ProcPtr|UPP)|pec(?:Ptr)?|ync(?:AlphaInfo|CMM(?:Ref)?|Data(?:Depth|Layout)|M(?:D5|utableProfileRef)|Profile(?:Ref)?|Transform(?:Ref)?))|Table))|m(?:m(?:ent(?:Type|sChunk(?:Ptr)?)?|onChunk(?:Ptr)?)|ponent(?:AliasResource|Description|FunctionUPP|Instance(?:Record)?|MPWorkFunction(?:HeaderRecord(?:Ptr)?|ProcPtr|UPP)|P(?:arameters|latformInfo(?:Array)?)|R(?:e(?:cord|s(?:ource(?:Extension|Handle|Ptr)?|ult))|outine(?:ProcPtr|UPP)))?)|n(?:st(?:ATSUAttributeValuePtr|FS(?:EventStreamRef|SpecPtr)|HFSUniStr255Param|ScriptCodeRunPtr|Text(?:EncodingRunPtr|Ptr|ToUnicodeInfo)|Uni(?:CharArrayPtr|code(?:MappingPtr|ToTextInfo)))|t(?:ainerChunk|extualMenuInterfaceStruct|rol(?:Action(?:ProcPtr|UPP)|B(?:evel(?:Button(?:Behavior|Menu(?:Behavior|Placement))|Thickness)|utton(?:ContentInfo(?:Ptr)?|GraphicAlignment|Text(?:Alignment|Placement)))|C(?:lock(?:Flags|Type)|ontentType)|DisclosureTriangleOrientation|EditText(?:Selection(?:Ptr|Rec)|Validation(?:ProcPtr|UPP))|Fo(?:cusPart|ntStyle(?:Ptr|Rec))|Handle|I(?:D|mageContentInfo(?:Ptr)?)|K(?:ey(?:Filter(?:ProcPtr|Result|UPP)|ScriptBehavior)|ind)|P(?:artCode|opupArrow(?:Orientation|Size)|ushButtonIconAlignment)|R(?:ef|oundButtonSize)|S(?:ize|liderOrientation)|T(?:ab(?:Direction|Entry|InfoRec(?:V1)?|Size)|emplate(?:Handle|Ptr)?)|UserPane(?:Activate(?:ProcPtr|UPP)|Draw(?:ProcPtr|UPP)|Focus(?:ProcPtr|UPP)|HitTest(?:ProcPtr|UPP)|Idle(?:ProcPtr|UPP)|KeyDown(?:ProcPtr|UPP)|Tracking(?:ProcPtr|UPP))|Variant)))|reEndianFlipProc|untUserDataFDF)|tlCTab|ustomBadgeResource(?:Handle|Ptr)?)|D(?:A(?:ApprovalSessionRef|DiskRef|SessionRef)|C(?:M(?:AccessMethod(?:Feature|I(?:D|terator))|Dictionary(?:Header|I(?:D|terator)|Ref|StreamRef)|F(?:i(?:eld(?:Attributes|T(?:ag|ype))|ndMethod)|oundRecordIterator)|Object(?:I(?:D|terator)|Ref)|ProgressFilter(?:ProcPtr|UPP)|UniqueID)|SDictionaryRef)|ER(?:Byte|Item|Size)|I(?:TLMethod|nfo)|R(?:AudioTrackRef|BurnRef|CDTextBlockRef|DeviceRef|EraseRef|F(?:SObjectRef|ile(?:Fork(?:Index|Size(?:Info|Query))|Message|Pro(?:c|ductionInfo)|Ref|system(?:Mask|TrackRef))|olderRef)|LinkType|NotificationC(?:allback|enterRef)|RefCon(?:Callbacks|Re(?:leaseCallback|tainCallback))|T(?:rack(?:CallbackProc|Message|ProductionInfo|Ref)|ypeRef))|XInfo|at(?:a(?:Array|Browser(?:A(?:cce(?:ptDrag(?:ProcPtr|UPP)|ssibilityItemInfo(?:V(?:0|1))?)|ddDragItem(?:ProcPtr|UPP))|C(?:allbacks|ustomCallbacks)|Dra(?:gFlags|wItem(?:ProcPtr|UPP))|Edit(?:Command|Item(?:ProcPtr|UPP))|GetContextualMenu(?:ProcPtr|UPP)|HitTest(?:ProcPtr|UPP)|Item(?:AcceptDrag(?:ProcPtr|UPP)|Compare(?:ProcPtr|UPP)|D(?:ata(?:ProcPtr|Ref|UPP)|ragRgn(?:ProcPtr|UPP))|HelpContent(?:ProcPtr|UPP)|ID|Notification(?:ProcPtr|UPP|WithItem(?:ProcPtr|UPP))?|ProcPtr|ReceiveDrag(?:ProcPtr|UPP)|State|UPP)|ListView(?:ColumnDesc|HeaderDesc|PropertyFlags)|Metric|P(?:ostProcessDrag(?:ProcPtr|UPP)|roperty(?:Desc|Flags|ID|Part|Type))|Re(?:ceiveDrag(?:ProcPtr|UPP)|vealOptions)|S(?:e(?:lect(?:ContextualMenu(?:ProcPtr|UPP)|ion(?:AnchorDirection|Flags))|tOption)|ortOrder)|T(?:ableView(?:Column(?:Desc|I(?:D|ndex))|HiliteStyle|PropertyFlags|RowIndex)|racking(?:ProcPtr|Result|UPP))|ViewStyle)|Handle|Ptr)|e(?:Cache(?:Ptr|Record)|Delta|Form|Orders|TimeRec))|e(?:bug(?:AssertOutputHandler(?:ProcPtr|UPP)|ComponentCallback(?:ProcPtr|UPP)|ger(?:DisposeThread(?:ProcPtr|TPP|UPP)|NewThread(?:ProcPtr|TPP|UPP)|ThreadScheduler(?:ProcPtr|TPP|UPP)))|ferredTask(?:P(?:rocPtr|tr)|UPP)?|lim(?:Type|iterInfo)|s(?:cType|kHook(?:ProcPtr|UPP)))|ialog(?:Item(?:Index(?:ZeroBased)?|Type)|P(?:lacementSpec|tr)|Ref|T(?:Hndl|Ptr|emplate))|o(?:Get(?:FileTranslationListProcPtr|ScrapTranslationListProcPtr|TranslatedFilenameProcPtr)|Identify(?:FileProcPtr|ScrapProcPtr)|Translate(?:FileProcPtr|ScrapProcPtr)|cOpenMethod)|ra(?:g(?:A(?:ctions|ttributes)|Behaviors|Constraint|Drawing(?:ProcPtr|UPP)|GrayRgn(?:ProcPtr|UPP)|I(?:mageFlags|nput(?:ProcPtr|UPP)|temRef)|Re(?:ceiveHandler(?:ProcPtr|UPP)|f(?:erence)?|gionMessage)|SendData(?:ProcPtr|UPP)|Tracking(?:Handler(?:ProcPtr|UPP)|Message))|wHook(?:ProcPtr|UPP)))|E(?:OLHook(?:ProcPtr|UPP)|ditUnicodePostUpdate(?:ProcPtr|UPP)|v(?:Cmd|QEl(?:Ptr)?|ent(?:Attributes|C(?:lass(?:ID)?|omparator(?:ProcPtr|UPP))|H(?:andler(?:CallRef|ProcPtr|Ref|UPP)|otKey(?:ID|Ref))|Kind|Loop(?:IdleTimer(?:Message|ProcPtr|UPP)|Ref|Timer(?:ProcPtr|Ref|UPP))|M(?:ask|o(?:difiers|use(?:Button|WheelAxis)))|P(?:aram(?:Name|Type)|riority)|QueueRef|Re(?:cord|f)|T(?:argetRef|ime(?:out|rInterval)?|ype(?:Spec)?)))|x(?:ception(?:Handler(?:ProcPtr|TPP|UPP)?|Info(?:rmation(?:PowerPC)?)?|Kind)|t(?:AudioFile(?:PropertyID|Ref)|Com(?:monChunk(?:Ptr)?|ponentResource(?:Handle|Ptr)?)|ended(?:AudioFormatInfo|ControlEvent|F(?:ileInfo|olderInfo)|NoteOnEvent|TempoEvent))))|F(?:CFontDescriptorRef|I(?:LE|nfo)|KEY(?:ProcPtr|UPP)|M(?:F(?:ilter(?:Selector)?|ont(?:CallbackFilter(?:ProcPtr|UPP)|DirectoryFilter|Family(?:CallbackFilter(?:ProcPtr|UPP)|I(?:nstance(?:Iterator)?|terator))?|Iterator|S(?:ize|tyle))?)|Generation|Input)|N(?:Message|Subscription(?:ProcPtr|Ref|UPP))|P(?:RegIntel|UInformation(?:Intel64|PowerPC)?)|S(?:Al(?:ias(?:FilterProcPtr|Info(?:Bitmap|Ptr)?)|locationFlags)|Catalog(?:BulkParam(?:Ptr)?|Info(?:Bitmap|Ptr)?)|E(?:jectStatus|ventStream(?:C(?:allback|ontext|reateFlags)|Event(?:Flags|Id)|Ref))|F(?:ile(?:Operation(?:ClientContext|Ref|Sta(?:ge|tusProcPtr))|SecurityRef)|ork(?:CBInfoParam(?:Ptr)?|I(?:OParam(?:Ptr)?|nfo(?:Flags|Ptr)?)))|I(?:ORefNum|terator(?:Flags)?)|MountStatus|P(?:athFileOperationStatusProcPtr|ermissionInfo)|R(?:angeLockParam(?:Ptr)?|ef(?:ForkIOParam(?:Ptr)?|P(?:aram(?:Ptr)?|tr))?)|S(?:earchParams(?:Ptr)?|pec(?:ArrayPtr|Handle|Ptr)?)|UnmountStatus|Volume(?:Eject(?:ProcPtr|UPP)|Info(?:Bitmap|P(?:aram(?:Ptr)?|tr))?|Mount(?:ProcPtr|UPP)|Operation|RefNum|Unmount(?:ProcPtr|UPP)))|Vector|XInfo|amRec|ile(?:Info|T(?:ranslation(?:List(?:Handle|Ptr)?|Spec(?:Array(?:Handle|Ptr))?)|ype(?:Spec)?))|lavor(?:Flags|Type)|ndr(?:DirInfo|Extended(?:DirInfo|FileInfo)|FileInfo|OpaqueInfo)|o(?:lder(?:Class|Desc(?:Flags|Ptr)?|Info|Location|ManagerNotification(?:ProcPtr|UPP)|Routing(?:Ptr)?|Type)|nt(?:Assoc|Info|LanguageCode|NameCode|PlatformCode|Rec(?:Hdl|Ptr)?|S(?:criptCode|electionQDStyle(?:Ptr)?)|Variation)|rmat(?:Class|ResultType|Status|VersionChunk(?:Ptr)?)))|G(?:D(?:Handle|Ptr|evice)|L(?:b(?:itfield|oolean|yte)|c(?:har(?:ARB)?|lamp(?:d|f))|double|enum|f(?:ixed|loat)|ha(?:lf(?:ARB)?|ndleARB)|int(?:64(?:EXT)?|ptr(?:ARB)?)?|s(?:hort|izei(?:ptr(?:ARB)?)?|ync)|u(?:byte|int(?:64(?:EXT)?)?|short)|void)|NEFilterUPP|World(?:Flags|Ptr)|e(?:nericID|t(?:GrowImageRegionRec|MissingComponentResource(?:ProcPtr|UPP)|NextEventFilter(?:ProcPtr|UPP)|Property(?:FDF|InfoFDF)|ScrapData(?:ProcPtr|UPP)?|UserData(?:FDF|SizeFDF)|VolParmsInfoBuffer|WindowRegion(?:Ptr|Rec(?:Ptr)?)))|lyph(?:Collection|ID)|raf(?:P(?:ort|tr)|Verb))|H(?:FS(?:Catalog(?:F(?:ile|older)|Key|NodeID|Thread)|Extent(?:Descriptor|Key|Record)|Flavor|MasterDirectoryBlock|Plus(?:Attr(?:Data|Extents|ForkData|InlineData|Key|Record)|BSDInfo|Catalog(?:F(?:ile|older)|Key|Thread)|Extent(?:Descriptor|Key|Record)|ForkData|VolumeHeader)|UniStr255)|I(?:A(?:rchiveRef|xis(?:Position|Scale))|Binding(?:Kind)?|Co(?:mmand(?:Extended)?|ntentBorderMetrics|ordinateSpace)|DelegatePosition|ImageViewAutoTransformOptions|LayoutInfo|M(?:odalClickResult|utableShapeRef)|Object(?:ClassRef|Ref)|Po(?:int|sition(?:Kind|ing))|Rect|S(?:c(?:al(?:eKind|ing)|roll(?:BarTrackInfo|ViewAction))|egmentBehavior|hape(?:EnumerateProcPtr|Ref)|i(?:deBinding|ze))|T(?:heme(?:Animation(?:FrameInfo|TimeInfo)|B(?:ackgroundDrawInfo(?:Ptr)?|uttonDrawInfo(?:Ptr)?)|ChasingArrowsDrawInfo(?:Ptr)?|F(?:ocusRing|rame(?:DrawInfo(?:Ptr)?|Kind))|Gr(?:abberDrawInfo(?:Ptr)?|o(?:upBox(?:DrawInfo(?:Ptr)?|Kind)|wBox(?:DrawInfo(?:Ptr)?|Kind|Size)))|Header(?:DrawInfo(?:Ptr)?|Kind)|Menu(?:BarDrawInfo(?:Ptr)?|DrawInfo(?:Ptr|VersionZero(?:Ptr)?)?|ItemDrawInfo(?:Ptr)?|TitleDrawInfo(?:Ptr)?)|Orientation|P(?:lacardDrawInfo(?:Ptr)?|opupArrowDrawInfo(?:Ptr)?)|S(?:crollBarDelimitersDrawInfo(?:Ptr)?|e(?:gment(?:Adornment|DrawInfo(?:Ptr)?|Kind|Position|Size)|paratorDrawInfo(?:Ptr)?)|plitter(?:Adornment|DrawInfo(?:Ptr)?))|T(?:ab(?:Adornment|DrawInfo(?:VersionZero)?|Kind|P(?:ane(?:Adornment|DrawInfo(?:VersionZero)?)|osition)|Size)|ext(?:BoxOptions|HorizontalFlush|Info|Truncation|VerticalFlush)|ickMarkDrawInfo(?:Ptr)?|rackDrawInfo)|Window(?:DrawInfo(?:Ptr)?|WidgetDrawInfo(?:Ptr)?))|oolbar(?:Display(?:Mode|Size)|ItemRef|Ref)|ypeAndCreator)|View(?:Content(?:Info(?:Ptr)?|Type)|F(?:eatures|rameMetrics)|I(?:D|mageContent(?:Info|Type))|Kind|PartCode|Ref|TrackingArea(?:ID|Ref)|ZOrderOp)|Window(?:Availability|BackingLocation|Depth|Ref|S(?:caleMode|haringType)))|M(?:Cont(?:ent(?:ProvidedType|Request|Type)|rolContent(?:ProcPtr|UPP))|HelpContent(?:Ptr|Rec)?|Menu(?:ItemContent(?:ProcPtr|UPP)|TitleContent(?:ProcPtr|UPP))|StringResType|TagDisplaySide|WindowContent(?:ProcPtr|UPP)|enuBar(?:Header|Menu))|i(?:ghHook(?:ProcPtr|UPP)|liteMenuItemData(?:Ptr)?|tTestHook(?:ProcPtr|UPP))|o(?:mograph(?:Accent|DicInfoRec|Weight)|stCallback(?:Info|_Get(?:BeatAndTempo|MusicalTimeLocation|TransportState(?:2)?))))|I(?:BNibRef|C(?:A(?:ppSpec(?:Handle|List(?:Handle|Ptr)?|Ptr)?|ttr)|CharTable(?:Handle|Ptr)?|F(?:i(?:leSpec(?:Handle|Ptr)?|xedLength)|ontRecord(?:Handle|Ptr)?)|Instance|MapEntry(?:Flags|Handle|Ptr)?|P(?:erm|rofileID(?:Ptr)?)|Service(?:Entry(?:Flags|Handle|Ptr)?|s(?:Handle|Ptr)?))|O(?:A(?:ddressRange|lignment|ppleTimingID|syncC(?:allback(?:0|1|2)?|ompletionContent))|ByteCount(?:32|64)?|C(?:acheMode|o(?:lor(?:Component|Entry)|mpletion(?:ProcPtr|UPP)))|D(?:e(?:tailedTimingInformation(?:V(?:1|2))?|viceNumber)|isplay(?:ModeI(?:D|nformation)|ProductID|ScalerInformation|TimingRange(?:V(?:1|2))?|VendorID))|F(?:B(?:D(?:PLinkConfig|isplayModeDescription)|HDRMetaData(?:V1)?)|ixed(?:1616|Point32)?|ramebufferInformation)|G(?:Bounds|Point|Size)|HardwareCursor(?:Descriptor|Info)|I(?:ndex|temCount)|LogicalAddress|N(?:amedValue|otificationPort(?:Ref)?)|OptionBits|P(?:hysical(?:Address(?:32|64)?|Length(?:32|64)?|Range)|ixel(?:Aperture|Encoding|Information))|Return|S(?:e(?:lect|rvice(?:InterestC(?:allback|ontent(?:64)?)|MatchingCallback))|urface(?:Component(?:Name|Range|Type)|ID|LockOptions|PurgeabilityState|Ref|Subsampling))|TimingInformation|V(?:ersion|irtual(?:Address|Range)))|SAType|con(?:A(?:ction(?:ProcPtr|UPP)|lignmentType)|Family(?:Element|Handle|Ptr|Resource)|Getter(?:ProcPtr|UPP)|Ref|Se(?:lectorValue|rvicesUsageFlags)|TransformType)|n(?:d(?:exToUCString(?:ProcPtr|UPP)|icatorDragConstraint(?:Ptr)?)|strumentChunk(?:Ptr)?|t(?:erfaceTypeList|l(?:0(?:Hndl|Ptr|Rec)|1(?:Hndl|Ptr|Rec)|Text)))|t(?:emReference|l(?:1ExtRec|4(?:Handle|Ptr|Rec)|5Record|b(?:ExtRecord|Record)|cRecord)))|J(?:S(?:C(?:har|lass(?:Attributes|Definition|Ref)|ontext(?:GroupRef|Ref))|GlobalContextRef|Object(?:C(?:allAs(?:ConstructorCallback|FunctionCallback)|onvertToTypeCallback)|FinalizeCallback|GetProperty(?:Callback|NamesCallback)|InitializeCallback|Ref)|Property(?:Attributes|NameA(?:ccumulatorRef|rrayRef))|St(?:atic(?:Function|Value)|ringRef)|Type(?:dArrayBytesDeallocator)?|ValueRef)|apanesePartOfSpeech|ournalInfoBlock|ust(?:DirectionTable|P(?:C(?:Action(?:Subrecord|Type)?|ConditionalAddAction|D(?:ecompositionAction|uctilityAction)|GlyphRepeatAddAction|UnconditionalAddAction)|ostcompTable)|Table|WidthDelta(?:Entry|Group)|ificationFlags))|K(?:C(?:A(?:ttr(?:Type|ibute(?:List)?)|uthType)|C(?:allback(?:Info|ProcPtr|UPP)|ert(?:AddOptions|SearchOptions))|Event(?:Mask)?|Item(?:Attr|Class|Ref)|P(?:rotocolType|ublicKeyHash)|Ref|S(?:earchRef|tatus)|VerifyStopOn)|e(?:r(?:n(?:ArrayOffset|Entry|FormatSpecificHeader|IndexArrayHeader|Kerning(?:Pair|Value)|O(?:ffsetTable(?:Ptr)?|rderedList(?:Entry(?:Ptr)?|Header))|Pair|S(?:impleArrayHeader|tate(?:Entry|Header)|ubtable(?:Header(?:Ptr)?|Info))|Table(?:Format|Header(?:Handle|Ptr)?)?|Version0(?:Header|SubtableHeader))|x(?:A(?:nchorPointAction|rrayOffset)|Co(?:ntrolPoint(?:Action|Entry|Header)|ordinateAction)|FormatSpecificHeader|IndexArrayHeader|KerningPair|OrderedList(?:Entry(?:Ptr)?|Header)|S(?:impleArrayHeader|tate(?:Entry|Header)|ubtable(?:Coverage|Header(?:Ptr)?))|TableHeader(?:Handle|Ptr)?))|y(?:Map(?:ByteArray)?|boardLayout(?:Identifier|Kind|PropertyTag|Ref))))|L(?:A(?:ContextRef|EnvironmentRef|Homograph|Morpheme(?:Bundle|Path|Rec|sArray(?:Ptr)?)?|Property(?:Key|Type))|H(?:Element|Handle|Ptr|Table)|LCStyleInfo|S(?:A(?:cceptanceFlags|pplicationParameters)|HandlerOptions|ItemInfo(?:Flags|Record)|Launch(?:F(?:SRefSpec|lags)|URLSpec)|R(?:equestedInfo|olesMask)|SharedFileList(?:ChangedProcPtr|ItemRef|Re(?:f|solutionFlags)))|aunch(?:Flags|P(?:BPtr|aramBlockRec))|carCaret(?:ClassEntry|Table(?:Ptr)?)|ist(?:Bounds|ClickLoop(?:ProcPtr|UPP)|Def(?:ProcPtr|Spec(?:Ptr)?|Type|UPP)|Handle|Ptr|Re(?:c|f)|Search(?:ProcPtr|UPP))|o(?:cal(?:DateTime(?:Handle|Ptr)?|e(?:AndVariant|NameMask|Operation(?:Class|Variant)|PartMask|Ref))|ngDate(?:Cvt|Field|Rec|Time))|tag(?:StringRange|Table))|M(?:BarHook(?:ProcPtr|UPP)|C(?:Entry(?:Ptr)?|Table(?:Handle|Ptr)?)|D(?:EF(?:Draw(?:Data(?:Ptr)?|ItemsData(?:Ptr)?)|FindItemData(?:Ptr)?|HiliteItemData(?:Ptr)?)|ItemRef|Label(?:Domain|Ref)|Query(?:BatchingParams|Create(?:ResultFunction|ValueFunction)|OptionFlags|Ref|Sort(?:ComparatorFunction|OptionFlags))|S_HANDLE)|IDI(?:C(?:hannelMessage|lientRef|ompletionProc)|D(?:ataChunk(?:Ptr)?|eviceRef)|En(?:dpointRef|tityRef)|IOErrorNotification|MetaEvent|Not(?:eMessage|if(?:ication(?:MessageID)?|y(?:Block|Proc)))|Object(?:AddRemoveNotification|PropertyChangeNotification|Ref|Type)|P(?:acket(?:List)?|ortRef)|R(?:awData|ead(?:Block|Proc))|SysexSendRequest|TimeStamp|UniqueID)|P(?:A(?:ddressSpaceI(?:D|nfo)|reaID)|C(?:o(?:herenceID|nsoleID)|puID|riticalRegionI(?:D|nfo))|DebuggerLevel|E(?:G4ObjectID|vent(?:Flags|I(?:D|nfo))|xceptionKind)|IsFullyInitializedProc|NotificationI(?:D|nfo)|OpaqueID(?:Class)?|P(?:ageSizeClass|rocessID)|QueueI(?:D|nfo)|Remote(?:Context|Procedure)|Semaphore(?:Count|I(?:D|nfo))|T(?:ask(?:I(?:D|nfo(?:Version2)?)|Options|StateKind|Weight)|imerID))|a(?:c(?:Polygon|hine(?:Information(?:Intel64|PowerPC)?|Location))|gicCookieInfo|rker(?:Chunk(?:Ptr)?|IdType)?)|e(?:asureWindowTitleRec(?:Ptr)?|mory(?:ExceptionInformation|ReferenceKind)|nu(?:Attributes|Bar(?:Def(?:ProcPtr|UPP)|H(?:andle|eader)|Menu)|C(?:Rsrc(?:Handle|Ptr)?|ommand)|Def(?:Spec(?:Ptr)?|Type|UPP)|EventOptions|H(?:andle|ook(?:ProcPtr|UPP))|I(?:D|tem(?:Attributes|D(?:ata(?:Flags|Ptr|Rec)|rawing(?:ProcPtr|UPP))|I(?:D|ndex)))|Ref|T(?:itleDrawing(?:ProcPtr|UPP)|racking(?:Data(?:Ptr)?|Mode))))|ixe(?:dModeStateRecord|rDistanceParams)|o(?:dalFilter(?:ProcPtr|UPP|YD(?:ProcPtr|UPP))|r(?:pheme(?:PartOfSpeech|TextRange)|t(?:C(?:hain|ontextualSubtable)|FeatureEntry|InsertionSubtable|Ligature(?:ActionEntry|Subtable)|RearrangementSubtable|S(?:pecificSubtable|ubtable(?:MaskFlags)?|washSubtable)|Table)|x(?:C(?:hain|ontextualSubtable)|InsertionSubtable|LigatureSubtable|RearrangementSubtable|S(?:pecificSubtable|ubtable)|Table))|useTrackingResult)|usic(?:Device(?:Component|GroupID|InstrumentID|MIDIEventProc|NoteParams|S(?:t(?:artNoteProc|dNoteParams|opNoteProc)|ysExProc))|Event(?:Iterator|Type|UserData)|Player|Sequence(?:File(?:Flags|TypeID)|LoadFlags|Type|UserCallback)?|T(?:imeStamp|rack(?:LoopInfo)?)))|N(?:C(?:M(?:ConcatProfileS(?:et|pec)|DeviceProfileInfo)|olor(?:Changed(?:ProcPtr|UPP)|PickerInfo))|DR_record_t|Itl4(?:Handle|Ptr|Rec)|M(?:ProcPtr|Rec(?:Ptr)?|UPP)|PMColor(?:Ptr)?|WidthHook(?:ProcPtr|UPP)|X(?:ByteOrder|Coord|Event(?:Data|Ext(?:ension)?|Ptr|System(?:Device(?:List)?|Info(?:Data|Type)))?|KeyMapping|Mouse(?:Button|Scaling)|Point|S(?:ize|wapped(?:Double|Float))|TabletP(?:ointData(?:Ptr)?|roximityData(?:Ptr)?))|a(?:meTable|noseconds)|ote(?:InstanceID|ParamsControlValue)|u(?:llSt(?:Handle|Ptr|Rec)|m(?:FormatString(?:Rec)?|berParts(?:Ptr)?)))|O(?:S(?:A(?:Active(?:ProcPtr|UPP)|CreateAppleEvent(?:ProcPtr|UPP)|Error|ID|Send(?:ProcPtr|UPP)|syncReference(?:64)?|tomic_int64_aligned64_t)|FifoQueueHead|L(?:A(?:ccessor(?:ProcPtr|UPP)|djustMarks(?:ProcPtr|UPP))|Co(?:mpare(?:ProcPtr|UPP)|unt(?:ProcPtr|UPP))|DisposeToken(?:ProcPtr|UPP)|Get(?:ErrDesc(?:ProcPtr|UPP)|MarkToken(?:ProcPtr|UPP))|Mark(?:ProcPtr|UPP))|NotificationHeader(?:64)?|QueueHead)|ff(?:Pair|set(?:Array(?:Handle|Ptr)?|Table))|p(?:aque(?:A(?:E(?:DataStorageType|StreamRef)|TSU(?:FontFallbacks|Style|TextLayout)|UGraph|reaID|udio(?:Co(?:mponent|nverter)|FileStreamID|Queue(?:ProcessingTap|Timeline)?))|C(?:AClock|M(?:ProfileRef|WorldRef)|o(?:ll(?:atorRef|ection)|ntrolRef))|D(?:CM(?:FoundRecordIterator|Object(?:I(?:D|terator)|Ref))|ialogPtr|ragRef)|E(?:vent(?:H(?:andler(?:CallRef|Ref)|otKeyRef)|LoopRef|QueueRef|Ref|TargetRef)|xtAudioFile)|F(?:CFontDescriptorRef|NSubscriptionRef|S(?:Iterator|VolumeOperation))|GrafPtr|HI(?:ArchiveRef|Object(?:ClassRef|Ref)|ViewTrackingAreaRef)|I(?:BNibRef|CInstance|conRef)|JS(?:C(?:lass|ontext(?:Group)?)|PropertyNameA(?:ccumulator|rray)|String|Value)|KeyboardLayoutRef|L(?:A(?:ContextRef|EnvironmentRef)|SSharedFileList(?:ItemRef|Ref)|ocaleRef)|M(?:P(?:A(?:ddressSpaceID|reaID)|C(?:o(?:herenceID|nsoleID)|puID|riticalRegionID)|EventID|NotificationID|OpaqueID|ProcessID|QueueID|SemaphoreID|T(?:askID|imerID))|enuRef|usic(?:EventIterator|Player|Sequence|Track))|P(?:M(?:P(?:a(?:geFormat|per)|r(?:eset|int(?:Se(?:ssion|ttings)|er)))|Server)|asteboardRef|icker|olicySearchRef)|RgnHandle|S(?:RSpeechObject|crapRef|ec(?:AccessRef|CertificateRef|Identity(?:Ref|SearchRef)|KeyRef|TransformImplementation))|T(?:EC(?:ObjectRef|SnifferObjectRef)|SMDocumentID|XNObject|ext(?:BreakLocatorRef|ToUnicodeInfo)|hemeDrawingState|oolboxObjectClassRef|ranslationRef)|U(?:CTypeSelectRef|RLReference|nicodeToText(?:Info|RunInfo))|W(?:S(?:MethodInvocationRef|ProtocolHandlerRef)|indow(?:GroupRef|Ptr)))|bd(?:SideValues|Table(?:Format)?)|enCPicParams))|P(?:EF(?:ContainerHeader|ExportedSymbol(?:HashSlot|Key)?|Imported(?:Library|Symbol)|Loader(?:InfoHeader|RelocationHeader)|RelocChunk|S(?:ectionHeader|plitHashWord))|M(?:BorderType|ColorSpaceModel|D(?:ataFormat|estinationType|uplexMode)|La(?:nguageInfo|youtDirection)|O(?:bject|rientation)|P(?:PDDomain|a(?:ge(?:Format|ToPaperMappingType)|per(?:Margins|Type)?)|r(?:eset|int(?:DialogOptionFlags|Se(?:ssion|ttings)|er(?:State)?)))|QualityMode|Re(?:ct|solution)|S(?:calingAlignment|erver))|a(?:r(?:am(?:BlockRec|eterEvent)|mBlkPtr)|steboard(?:FlavorFlags|ItemID|PromiseKeeperProcPtr|Ref|S(?:tandardLocation|yncFlags))|t(?:Handle|Ptr|tern))|h(?:oneme(?:Descriptor|Info)|ysicalKeyboardLayoutType)|i(?:c(?:Handle|Ptr|ker(?:MenuItemInfo)?|ture)|x(?:Map(?:Handle|Ptr)?|Pat(?:Handle|Ptr)?))|lotIconRefFlags|oly(?:Handle|Ptr|gon)|r(?:interStatusOpcode|o(?:c(?:InfoType|ess(?:ApplicationTransformState|Info(?:ExtendedRec(?:Ptr)?|Rec(?:Ptr)?)))|gressTrackInfo|miseHFSFlavor|p(?:CharProperties|LookupS(?:egment|ingle)|Table|erty(?:Creator|Tag)))))|Q(?:D(?:Arc(?:ProcPtr|UPP)|Bits(?:ProcPtr|UPP)|Comment(?:ProcPtr|UPP)|Err|GetPic(?:ProcPtr|UPP)|JShieldCursor(?:ProcPtr|UPP)|Line(?:ProcPtr|UPP)|O(?:pcode(?:ProcPtr|UPP)|val(?:ProcPtr|UPP))|P(?:oly(?:ProcPtr|UPP)|rinterStatus(?:ProcPtr|UPP)|utPic(?:ProcPtr|UPP))|R(?:Rect(?:ProcPtr|UPP)|e(?:ct(?:ProcPtr|UPP)|gionParseDirection)|gn(?:ProcPtr|UPP))|StdGlyphs(?:ProcPtr|UPP)|T(?:ext(?:ProcPtr|UPP)|xMeas(?:ProcPtr|UPP)))|Elem(?:Ptr)?|Hdr(?:Ptr)?|L(?:Preview(?:PDFStyle|RequestRef)|ThumbnailRe(?:f|questRef))|Types)|R(?:DFlagsType|GBColor|OTA(?:GlyphEntry|Header)|TAType|e(?:ad(?:BytesFDF|Packet(?:DataFDF|sFDF))|drawBackground(?:ProcPtr|UPP)|gi(?:onToRects(?:ProcPtr|UPP)|ster(?:Information(?:Intel64|PowerPC)?|edComponent(?:InstanceRecord(?:Ptr)?|Record(?:Ptr)?)))|s(?:Attributes|Err(?:ProcPtr|UPP)|File(?:Attributes|RefNum)|ID|ource(?:Count|EndianFilterPtr|Index|Spec)))|gnHandle|outin(?:e(?:Descriptor(?:Handle|Ptr)?|FlagsType|Record(?:Handle|Ptr)?)|g(?:Flags|Resource(?:Entry|Handle|Ptr)))|srcChainLocation|uleBasedTrslRecord)|S(?:C(?:Bond(?:InterfaceRef|StatusRef)|DynamicStore(?:C(?:allBack|ontext)|Ref)|Network(?:Connection(?:C(?:allBack|ontext)|Flags|PPPStatus|Ref|Status)|InterfaceRef|ProtocolRef|Reachability(?:C(?:allBack|ontext)|Flags|Ref)|Se(?:rviceRef|tRef))|Preferences(?:C(?:allBack|ontext)|Notification|Ref)|VLANInterfaceRef)|FNTLookup(?:ArrayHeader|BinarySearchHeader|FormatSpecificHeader|Kind|Offset|S(?:egment(?:Header)?|ingle(?:Header)?)|T(?:able(?:Format|Handle|Ptr)?|rimmedArrayHeader)|V(?:alue|ectorHeader))|Int|K(?:Document(?:I(?:D|ndexState)|Ref)|Index(?:DocumentIteratorRef|Ref|Type)|S(?:earch(?:GroupRef|Options|Re(?:f|sults(?:FilterCallBack|Ref))|Type)|ummaryRef))|MPTETime(?:Flags|Type)?|R(?:CallBack(?:P(?:aram|rocPtr)|Struct|UPP)|Language(?:Model|Object)|P(?:ath|hrase)|Re(?:cogni(?:tion(?:Result|System)|zer)|jectionLevel)|Spee(?:ch(?:Object|Source)|dSetting)|Word)|SL(?:Authenticate|C(?:ipher(?:Suite|suiteGroup)|lientCertificateState|on(?:nection(?:Ref|Type)|text(?:Ref)?))|Protocol(?:Side)?|ReadFunc|Session(?:Option|State)|WriteFunc)|T(?:Class(?:Table)?|E(?:lement|ntry(?:Index|One|Two|Zero))|H(?:andle|eader)|Ptr|X(?:Class(?:Table)?|Entry(?:Index|One|Two|Zero)|Header|StateIndex))|c(?:hedule(?:dAudio(?:FileRegion(?:CompletionProc)?|Slice(?:CompletionProc)?)|rInfoRec(?:Ptr)?)|r(?:ap(?:Flavor(?:Flags|Info|Type)|PromiseKeeper(?:ProcPtr|UPP)|Ref|T(?:ranslationList(?:Handle|Ptr)?|ype(?:Spec)?))|ipt(?:CodeRun(?:Ptr)?|Language(?:Record|Support(?:Handle|Ptr)?)|TokenType|ingComponentSelector)|oll(?:BarTrackInfo|WindowOptions)|pST(?:Element|Table)))|e(?:c(?:A(?:CLRef|FPServerSignature|ccess(?:Control(?:CreateFlags|Ref)|OwnerType|Ref)|sn1(?:AlgId|Item|Oid|PubKeyInfo|Template(?:Chooser(?:Ptr)?|_struct)?)|uthenticationType)|C(?:S(?:DigestAlgorithm|Flags)|ertificateRef|ode(?:Ref|S(?:ignatureFlags|tatus))|redentialType)|External(?:Format|ItemType)|G(?:roupTransformRef|uestRef)|I(?:dentity(?:Ref|SearchRef)|tem(?:Attr|Class|ImportExport(?:Flags|KeyParameters)))|Key(?:GeneratePairBlock|ImportExport(?:Flags|Parameters)|OperationType|Ref|Sizes|Usage|chain(?:Attr(?:Type|ibute(?:Info|List|Ptr)?)|Callback(?:Info)?|Event(?:Mask)?|ItemRef|PromptSelector|Ref|S(?:e(?:archRef|ttings)|tatus)))|MessageBlock|P(?:a(?:dding|sswordRef)|olicy(?:Ref|SearchRef)|r(?:eferencesDomain|otocolType)|ublicKeyHash)|R(?:andomRef|equirement(?:Ref|Type))|StaticCodeRef|T(?:askRef|r(?:ansform(?:A(?:ctionBlock|ttribute(?:ActionBlock|Ref))|CreateFP|DataBlock|I(?:mplementationRef|nstanceBlock)|MetaAttributeType|Ref|StringOrAttributeRef)|ust(?:Callback|OptionFlags|Re(?:f|sultType)|Settings(?:Domain|KeyUsage|Result)|WithErrorCallback|edApplicationRef)))|uritySessionId)|lectorFunction(?:ProcPtr|UPP)|ssion(?:AttributeBits|CreationFlags)|t(?:PropertyFDF|UserDataFDF|upWindowProxyDragImageRec))|izeResourceRec(?:Handle|Ptr)?|l(?:eepQ(?:ProcPtr|Rec(?:Ptr)?|UPP)|iderTrackInfo)|ound(?:DataChunk(?:Ptr)?|ProcPtr|UPP)|peech(?:Channel(?:Record)?|Done(?:ProcPtr|UPP)|Error(?:CFProcPtr|Info|ProcPtr|UPP)|Phoneme(?:ProcPtr|UPP)|S(?:tatusInfo|ync(?:ProcPtr|UPP))|TextDone(?:ProcPtr|UPP)|VersionInfo|Word(?:CFProcPtr|ProcPtr|UPP)|XtndData)|t(?:Scrp(?:Handle|Ptr|Rec)|a(?:geList|ndard(?:DropLocation|IconListCellData(?:Ptr|Rec)))|ring(?:2DateStatus|ToDateStatus)|yle(?:Run|Table))|ys(?:PPtr|tem(?:SoundID|UI(?:Mode|Options))))|T(?:E(?:C(?:BufferContextRec|Conver(?:sionInfo|terContextRec)|Encoding(?:Pair(?:Rec|s(?:Handle|Ptr|Rec)?)|sList(?:Handle|Ptr|Rec))|In(?:fo(?:Handle|Ptr)?|ternetName(?:Rec|UsageMask|s(?:Handle|Ptr|Rec)))|Locale(?:ListToEncodingList(?:Ptr|Rec)|ToEncodingsList(?:Handle|Ptr|Rec))|ObjectRef|Plugin(?:C(?:lear(?:ContextInfoPtr|SnifferContextInfoPtr)|onvertTextEncodingPtr)|Disp(?:atchTable|oseEncoding(?:ConverterPtr|SnifferPtr))|FlushConversionPtr|Get(?:Count(?:Available(?:SniffersPtr|TextEncoding(?:PairsPtr|sPtr))|DestinationTextEncodingsPtr|MailEncodingsPtr|SubTextEncodingsPtr|WebEncodingsPtr)|PluginDispatchTablePtr|TextEncoding(?:FromInternetNamePtr|InternetNamePtr))|NewEncoding(?:ConverterPtr|SnifferPtr)|S(?:ig(?:nature)?|niffTextEncodingPtr|tateRec)|Version)|S(?:niffer(?:ContextRec|ObjectRef)|ubTextEncoding(?:Rec|s(?:Handle|Ptr|Rec)))|lickLoop(?:ProcPtr|UPP))|DoText(?:ProcPtr|UPP)|FindWord(?:ProcPtr|UPP)|Handle|IntHook|Ptr|Rec(?:alc(?:ProcPtr|UPP))?|Style(?:Handle|Ptr|Rec|Table))|ISInputSourceRef|MTask(?:Ptr)?|S(?:Code|M(?:Doc(?:AccessAttributes|ument(?:I(?:D|nterfaceType)|PropertyTag))|GlyphInfo(?:Array)?)|criptingSizeResource)|X(?:N(?:A(?:TSUI(?:Features|Variations)|ction(?:Key(?:Mapper(?:ProcPtr|UPP))?|NameMapper(?:ProcPtr|UPP))|ttributeData|utoScrollBehavior)|Background(?:Data|Type)?|C(?:arbonEventInfo|o(?:mmandEventSupportOptions|nt(?:extualMenuSetup(?:ProcPtr|UPP)|inuousFlags|rol(?:Data|Tag))|untOptions))|D(?:ataType|rawItems)|Errors|F(?:eatureBits|i(?:leType|nd(?:ProcPtr|UPP))|rame(?:ID|Options|Type))|HyperLinkState|LongRect|Ma(?:rgins|tch(?:Options|TextRecord))|O(?:bject(?:Refcon)?|ffset)|PermanentTextEncodingType|RectKey|Scroll(?:Bar(?:Orientation|State)|Info(?:ProcPtr|UPP)|Unit)|T(?:ab(?:Type)?|ype(?:Attributes|RunAttribute(?:Sizes|s)))|VersionValue)|TNTag)|a(?:ble(?:DirectoryRecord|tP(?:oint(?:Rec|erRec)|roximityRec))|sk(?:Proc|Storage(?:Index|Value)))|ext(?:BreakLocatorRef|Chunk(?:Ptr)?|Encoding(?:Base|Format|NameSelector|R(?:ec|un(?:Ptr)?)|Variant)?|Ptr|Range(?:Array(?:Handle|Ptr)?|Handle|Ptr)?|S(?:ervice(?:Class|Info(?:Ptr)?|List(?:Handle|Ptr)?|Property(?:Tag|Value))|tyle(?:Handle|Ptr)?)|ToUnicodeInfo|WidthHook(?:ProcPtr|UPP))|h(?:eme(?:ArrowOrientation|B(?:ackgroundKind|rush|utton(?:Adornment|Draw(?:Info(?:Ptr)?|ProcPtr|UPP)|Kind|Value))|C(?:heckBoxStyle|ursor)|Dra(?:gSoundKind|w(?:State|ingState))|Erase(?:ProcPtr|UPP)|FontID|GrowDirection|Iterator(?:ProcPtr|UPP)|Me(?:nu(?:BarState|ItemType|State|Type)|tric)|PopupArrowSize|S(?:crollBar(?:ArrowStyle|ThumbStyle)|oundKind)|T(?:ab(?:Direction|Style|TitleDraw(?:ProcPtr|UPP))|extColor|humbDirection|itleBarWidget|rack(?:Attributes|DrawInfo|EnableState|Kind|PressState))|Window(?:Attributes|Metrics(?:Ptr)?|Type))|read(?:Entry(?:ProcPtr|TPP|UPP)|ID|Options|S(?:cheduler(?:ProcPtr|TPP|UPP)|t(?:ate|yle)|witch(?:ProcPtr|TPP|UPP))|T(?:askRef|ermination(?:ProcPtr|TPP|UPP))))|imer(?:ProcPtr|UPP)|o(?:ggle(?:PB|Results)|ken(?:Block(?:Ptr)?|Re(?:c(?:Ptr)?|sults))|olboxObjectClassRef)|r(?:a(?:k(?:Table(?:Data|Entry)?|Value)|ns(?:itionWindowOptions|lation(?:Attributes|Flags|Ref(?:Num)?)))|ipleInt|uncCode)|ype(?:SelectRecord|sBlock(?:Ptr)?))|U(?:AZoomChangeFocusType|C(?:C(?:harProperty(?:Type|Value)|ollat(?:eOptions|ionValue))|Key(?:CharSeq|LayoutFeatureInfo|ModifiersToTableNum|Output|S(?:equenceDataIndex|tate(?:Entry(?:Range|Terminal)|Record(?:sIndex)?|Terminators))|ToCharTableIndex|board(?:Layout|TypeHeader))|T(?:SWalkDirection|extBreak(?:Options|Type)|ypeSelect(?:CompareResult|Options|Ref)))|Int|NDServerRef|RL(?:CallbackInfo|Event(?:Mask)?|Notify(?:ProcPtr|UPP)|OpenFlags|Reference|S(?:tate|ystemEvent(?:ProcPtr|UPP)))|TCDateTime(?:Handle|Ptr)?|n(?:i(?:CharArray(?:Handle|Offset|Ptr)|code(?:Map(?:Version|ping(?:Ptr)?)|ToText(?:Fallback(?:ProcPtr|UPP)|Info|RunInfo)))|tokenTable(?:Handle|Ptr)?)|ser(?:EventUPP|Item(?:ProcPtr|UPP)))|V(?:DGam(?:RecPtr|maRecord)|ector(?:128(?:Intel)?|Information(?:Intel64|PowerPC)?)|o(?:ice(?:Description|FileInfo|Spec(?:Ptr)?)|l(?:MountInfo(?:Header|Ptr)|ume(?:MountInfoHeader(?:Ptr)?|Type))))|W(?:CTab(?:Handle|Ptr)|S(?:ClientContext(?:CopyDescriptionCallBackProcPtr|Re(?:leaseCallBackProcPtr|tainCallBackProcPtr))?|MethodInvocationRef|ProtocolHandler(?:DeserializationProcPtr|Ref|SerializationProcPtr)|TypeID|tateData(?:Handle|Ptr)?)|i(?:d(?:eChar(?:Arr)?|thHook(?:ProcPtr|UPP))|n(?:CTab|dow(?:A(?:ctivationScope|ttributes)|C(?:lass|onstrainOptions)|D(?:ef(?:PartCode|Spec(?:Ptr)?|Type|UPP)|rawerState)|Group(?:Attributes|ContentOptions|Ref)|LatentVisibility|Modality|P(?:a(?:int(?:Proc(?:Options|Ptr)|UPP)|rtCode)|ositionMethod|tr)|Re(?:f|gionCode)|T(?:itleDrawing(?:ProcPtr|UPP)|ransition(?:Action|Effect)))))|ordBreak(?:ProcPtr|UPP)|rit(?:e(?:BytesFDF|PacketsFDF)|ingCode))|XLib(?:ContainerHeader|ExportedSymbol(?:HashSlot|Key)?)|ZoomAcceleration|a(?:cl_(?:entry_(?:id_t|t)|flag(?:_t|set_t)|perm(?:_t|set_(?:mask_t|t))|t(?:ag_t|ype_t)?)|ddr64_t|larm_(?:port_t|t(?:ype_t)?)|rcade_register_t|u(?:_(?:as(?:flgs_t|id_t)|c(?:lass_t|tlmode_t)|e(?:mod_t|v(?:class_map(?:_t)?|ent_t)|xpire_after(?:_t)?)|fstat_t|id_t|mask(?:_t)?|qctrl(?:_t)?|s(?:ession(?:_t)?|tat_t)|t(?:id(?:_(?:addr(?:_t)?|t))?|oken))|dit(?:_(?:fstat|stat|token_t)|info(?:_(?:addr(?:_t)?|t))?|pinfo(?:_(?:addr(?:_t)?|t))?)))|b(?:oo(?:lean_t|tstrap_t)|uild_(?:tool_version|version_command))|c(?:cntTokenRec(?:Handle|Ptr|ord)|lock_(?:attr_t|ctrl_(?:port_t|t)|flavor_t|id_t|re(?:ply_t|s_t)|serv_(?:port_t|t))|msghdr|oalition_t|pu_(?:subtype_t|t(?:hreadtype_t|ype_t))|ssm_(?:a(?:cl_(?:keychain_prompt_selector|process_subject_selector)|pple(?:cspdl_db_(?:change_password_parameters|is_locked_parameters|settings_parameters)|dl_open_parameters(?:_mask)?)|uthorizationgroup)|csp_operational_statistics|d(?:at(?:a|e)|b_schema_index_info|l_(?:db_handle|pkcs11_attributes))|func_name_addr|guid|k(?:ey_size|r_name)|list(?:_element)?|memory_funcs|name_list|parsed_c(?:ert|rl)|query_size_data|range|tp_result_set|version))|d(?:ata_in_code_entry|ec(?:form|imal)|y(?:l(?:d_(?:info_command|kernel_(?:image_info(?:_(?:array_t|t))?|process_info(?:_t)?))|i(?:b(?:_(?:command|module(?:_64)?|reference|table_of_contents))?|nker_command))|symtab_command))|e(?:mulation_vector_t|n(?:cryption_info_command(?:_64)?|try_point_command)|vsio(?:Keymapping|MouseScaling)|x(?:ception_(?:behavior_(?:array_t|t)|data_t(?:ype_t)?|flavor_array_t|handler_(?:array_t|t)|mask_(?:array_t|t)|port_(?:arra(?:ry_t|y_t)|t)|type_t)|tension_data_format))|f(?:e(?:nv_t|xcept_t)|pos_t|vm(?:file_command|lib(?:_command)?))|gpu_energy_data(?:_t)?|h(?:ash_info_bucket(?:_(?:array_t|t))?|ost_(?:basic_info(?:_(?:data_t|t))?|c(?:an_has_debugger_info(?:_(?:data_t|t))?|pu_load_info(?:_(?:data_t|t))?)|flavor_t|info(?:64_t|_(?:data_t|t))|load_info(?:_(?:data_t|t))?|name_(?:port_t|t)|p(?:r(?:eferred_user_arch(?:_(?:data_t|t))?|i(?:ority_info(?:_(?:data_t|t))?|v_t))|urgable_info_(?:data_t|t))|s(?:ched_info(?:_(?:data_t|t))?|ecurity_t)|t))|i(?:386_(?:exception_state_t|float_state_t|thread_state_t)|dent_command|maxdiv_t|nteger_t|o_(?:async_ref(?:64_t|_t)|buf_ptr_t|connect_t|enumerator_t|iterator_t|master_t|name_t|object_t|registry_entry_t|s(?:calar_inband(?:64_t|_t)|ervice_t|t(?:at_(?:entry|info(?:_t)?)|r(?:ing_(?:inband_t|t)|uct_inband_t)))|user_(?:reference_t|scalar_t))|pc_(?:info_(?:name(?:_(?:array_t|t))?|space(?:_(?:basic(?:_t)?|t))?|tree_name(?:_(?:array_t|t))?)|space_(?:inspect_t|port_t|t)|voucher_(?:attr_(?:control_t|manager_t)|t)))|k(?:auth_(?:ac(?:e(?:_(?:rights_t|t))?|l(?:_t)?)|cache_sizes|filesec(?:_t)?|identity_extlookup)|ern(?:_return_t|el_(?:boot_info_t|resource_sizes(?:_(?:data_t|t))?|version_t))|mod_(?:args_t|control_flavor_t|info(?:_(?:32_v1(?:_t)?|64_v1(?:_t)?|array_t|t))?|reference(?:_t)?|st(?:art_func_t|op_func_t)|t)|object_description_t)|l(?:a(?:belstr_t|unch_data_(?:dict_iterator_t|t(?:ype_t)?))|edger_(?:a(?:mount_t|rray_t)|item_t|port_(?:array_t|t)|t)|in(?:ger|ke(?:dit_data_command|r_option_command))|o(?:ad_command|ck(?:_set_(?:port_t|t)|group_info(?:_(?:array_t|t))?)))|m(?:a(?:ch_(?:core_(?:details|fileheader)|dead_name_notification_t|e(?:rror_(?:fn_t|t)|xception_(?:code_t|data_t(?:ype_t)?|subcode_t))|header(?:_64)?|m(?:emory_info(?:_(?:array_t|t))?|sg_(?:audit_trailer_t|b(?:ase_t|its_t|ody_t)|co(?:ntext_trailer_t|py_options_t)|descriptor_t(?:ype_t)?|empty_(?:rcv_t|send_t|t)|format_0_trailer_t|guard(?:_flags_t|ed_port_descriptor(?:32_t|64_t|_t))|header_t|id_t|ma(?:c_trailer_t|x_trailer_t)|o(?:ol_(?:descriptor(?:32_t|64_t|_t)|ports_descriptor(?:32_t|64_t|_t))|ption(?:_t|s_t))|p(?:ort_descriptor_t|riority_t)|return_t|s(?:e(?:curity_trailer_t|qno_trailer_t)|ize_t)|t(?:imeout_t|railer_(?:info_t|size_t|t(?:ype_t)?)|ype_(?:descriptor_t|n(?:ame_t|umber_t)|size_t))))|no_senders_notification_t|port_(?:array_t|context_t|de(?:l(?:eted_notification_t|ta_t)|stroyed_notification_t)|flavor_t|guard_exception_codes|info_(?:ext(?:_t)?|t)|limits(?:_t)?|ms(?:count_t|gcount_t)|name_(?:array_t|t)|options(?:_(?:ptr_t|t))?|qos(?:_t)?|right(?:_t|s_t)|s(?:eqno_t|rights_t|tatus(?:_t)?)|type_(?:array_t|t)|urefs_t)|send_(?:once_notification_t|possible_notification_t)|t(?:ask_basic_info(?:_(?:data_t|t))?|imespec(?:_t)?)|v(?:m_(?:address_t|info_region(?:_t)?|offset_t|read_entry(?:_t)?|size_t)|oucher_(?:attr_(?:co(?:mmand_t|nt(?:ent_(?:size_t|t)|rol_(?:flags_t|t)))|importance_refs|key_(?:array_t|t)|manager_t|r(?:aw_recipe_(?:array_(?:size_t|t)|size_t|t)|ecipe_(?:command_(?:array_t|t)|data(?:_t)?|size_t|t))|value_(?:flags_t|handle_(?:array_(?:size_t|t)|t)|reference_t))|name_(?:array_t|t)|selector_t|t))|zone_(?:info_(?:array_t|data|t)|name(?:_(?:array_t|t))?))|trix_(?:double(?:2x(?:2|3|4)|3x(?:2|3|4)|4x(?:2|3|4))|float(?:2x(?:2|3|4)|3x(?:2|3|4)|4x(?:2|3|4))))|context_t|em(?:_entry_name_port_t|ory_object_(?:a(?:rray_t|ttr_info(?:_(?:data_t|t))?)|behave_info(?:_(?:data_t|t))?|c(?:luster_size_t|o(?:ntrol_t|py_strategy_t))|default_t|f(?:ault_info_t|lavor_t)|info_(?:data_t|t)|name_t|offset_t|perf_info(?:_(?:data_t|t))?|return_t|size_t|t))|ig_(?:impl_routine_t|r(?:eply_error_t|outine_(?:arg_descriptor_t|descriptor(?:_t)?|t))|s(?:erver_routine_t|tub_routine_t|ubsystem(?:_t)?|ymtab(?:_t)?))|sg(?:_labels_t|hdr))|n(?:atural_t|ot(?:e_command|ify_port_t)|space_path_t|tsid_t)|os_(?:block_t|function_t|log_(?:s|t(?:ype_t)?)|trace_payload_(?:object_t|t)|unfair_lock_s)|p(?:a(?:cked_(?:char(?:16|2|32|4|64|8)|double(?:2|4|8)|float(?:16|2|4|8)|int(?:16|2|4|8)|long(?:2|4|8)|short(?:16|2|32|4|8)|u(?:char(?:16|2|32|4|64|8)|int(?:16|2|4|8)|long(?:2|4|8)|short(?:16|2|32|4|8)))|ge_address_array_t)|icker|o(?:inter_t|licy_(?:base(?:_(?:data_t|t)|s)|fifo_(?:base(?:_(?:data_t|t))?|info(?:_(?:data_t|t))?|limit(?:_(?:data_t|t))?)|info(?:_(?:data_t|t)|s)|limit(?:_(?:data_t|t)|s)|rr_(?:base(?:_(?:data_t|t))?|info(?:_(?:data_t|t))?|limit(?:_(?:data_t|t))?)|t(?:imeshare_(?:base(?:_(?:data_t|t))?|info(?:_(?:data_t|t))?|limit(?:_(?:data_t|t))?))?))|pnum_t|r(?:eb(?:ind_cksum_command|ound_dylib_command)|ocessor_(?:array_t|basic_info(?:_(?:data_t|t))?|cpu_load_info(?:_(?:data_t|t))?|flavor_t|info_(?:array_t|data_t|t)|port_(?:array_t|t)|set_(?:array_t|basic_info(?:_(?:data_t|t))?|control_(?:port_t|t)|flavor_t|info_(?:data_t|t)|load_info(?:_(?:data_t|t))?|name_(?:array_t|port_(?:array_t|t)|t)|port_t|t)|t)))|qos_class_t|r(?:e(?:g(?:64_t|isterSelectorType)|lop)|outine(?:_(?:arg_(?:descriptor(?:_t)?|offset|size|type)|descriptor(?:_t)?)|s_command(?:_64)?)|p(?:ath_command|c_(?:routine_(?:arg_descriptor(?:_t)?|descriptor(?:_t)?)|s(?:ignature|ubsystem(?:_t)?))))|s(?:a(?:_endpoints(?:_t)?|e_(?:associd_t|connid_t))|e(?:c(?:_(?:certificate(?:_t)?|identity(?:_t)?|object(?:_t)?|protocol_(?:challenge_(?:complete_t|t)|key_update_(?:complete_t|t)|metadata(?:_t)?|options(?:_t)?|pre_shared_key_selection_(?:complete_t|t)|verify_(?:complete_t|t))|trust(?:_t)?)|tion(?:_64)?|urity_token_t)|gment_command(?:_64)?|maphore_(?:port_t|t))|f(?:_hdtr|nt(?:CMap(?:E(?:ncoding|xtendedSubHeader)|Header|SubHeader)|D(?:escriptorHeader|irectory(?:Entry)?)|F(?:eature(?:Header|Name)|ont(?:Descriptor|FeatureSetting|RunFeature))|Instance|Name(?:Header|Record)|Variation(?:Axis|Header)))|i(?:md_(?:bool|char(?:1(?:6)?|2|3(?:2)?|4|64|8)|double(?:1|2|3|4|8)|float(?:1(?:6)?|2|3|4|8)|int(?:1(?:6)?|2|3|4|8)|long(?:1|2|3|4|8)|packed_(?:char(?:16|2|32|4|64|8)|double(?:2|4|8)|float(?:16|2|4|8)|int(?:16|2|4|8)|long(?:2|4|8)|short(?:16|2|32|4|8)|u(?:char(?:16|2|32|4|64|8)|int(?:16|2|4|8)|long(?:2|4|8)|short(?:16|2|32|4|8)))|short(?:1(?:6)?|2|3(?:2)?|4|8)|u(?:char(?:1(?:6)?|2|3(?:2)?|4|64|8)|int(?:1(?:6)?|2|3|4|8)|long(?:1|2|3|4|8)|short(?:1(?:6)?|2|3(?:2)?|4|8)))|nt(?:16|32|64|8))|leep_type_t|o(?:_np_extensions|ck(?:addr(?:_storage)?|proto)|urce_version_command)|u(?:b_(?:client_command|framework_command|library_command|umbrella_command)|id_cred_(?:path_t|t|uid_t))|y(?:m(?:seg_command|tab_(?:command|name_t))|nc_policy_t))|t(?:ask_(?:a(?:bsolutetime_info(?:_(?:data_t|t))?|ffinity_tag_info(?:_(?:data_t|t))?|rray_t)|basic_info(?:_(?:32(?:_(?:data_t|t))?|64(?:_(?:data_t|t))?|data_t|t))?|category_policy(?:_(?:data_t|t))?|dyld_info(?:_(?:data_t|t))?|e(?:vents_info(?:_(?:data_t|t))?|x(?:c_guard_behavior_t|tmod_info(?:_(?:data_t|t))?))|fla(?:gs_info(?:_(?:data_t|t))?|vor_t)|in(?:fo_(?:data_t|t)|spect_(?:basic_counts(?:_(?:data_t|t))?|flavor(?:_t)?|info_t|t))|kernelmemory_info(?:_(?:data_t|t))?|latency_qos(?:_t)?|name_t|p(?:o(?:licy_(?:flavor_t|t)|rt_(?:array_t|t)|wer_info(?:_(?:data_t|t|v2(?:_(?:data_t|t))?))?)|urgable_info_t)|qos_policy(?:_t)?|role(?:_t)?|s(?:pecial_port_t|uspension_token_t)|t(?:hr(?:ead_times_info(?:_(?:data_t|t))?|oughput_qos(?:_t)?)|race_memory_info(?:_(?:data_t|t))?)?|vm_info(?:_(?:data_t|t))?|wait_state_info(?:_(?:data_t|t))?|zone_info_(?:array_t|data|t))|hread_(?:a(?:ct_(?:array_t|port_(?:array_t|t)|t)|ffinity_policy(?:_(?:data_t|t))?|rray_t)|ba(?:ckground_policy(?:_(?:data_t|t))?|sic_info(?:_(?:data_t|t))?)|command|extended_(?:info(?:_(?:data_t|t))?|policy(?:_(?:data_t|t))?)|flavor_t|i(?:dentifier_info(?:_(?:data_t|t))?|n(?:fo_(?:data_t|t)|spect_t))|latency_qos_(?:policy(?:_(?:data_t|t))?|t)|p(?:o(?:licy_(?:flavor_t|t)|rt_(?:array_t|t))|recedence_policy(?:_(?:data_t|t))?)|sta(?:ndard_policy(?:_(?:data_t|t))?|te_(?:data_t|flavor_(?:array_t|t)|t))|t(?:hroughput_qos_(?:policy(?:_(?:data_t|t))?|t)|ime_constraint_policy(?:_(?:data_t|t))?)?)|ime_value(?:_t)?|l(?:s_(?:ciphersuite_(?:group_t|t)|protocol_version_t)|v_descriptor)|oken_t|wolevel_hint(?:s_command)?)|u(?:ext_object_t|int(?:16|32|64|8)|pl_t|ser_subsystem_t|uid_(?:command|string_t))|v(?:e(?:ctor_(?:char(?:16|2|3(?:2)?|4|8)|double(?:2|3|4|8)|float(?:16|2|3|4|8)|int(?:16|2|3|4|8)|long(?:1|2|3|4|8)|short(?:16|2|3(?:2)?|4|8)|u(?:char(?:16|2|3(?:2)?|4|8)|int(?:16|2|3|4|8)|long(?:1|2|3|4|8)|short(?:16|2|3(?:2)?|4|8)))|rsion_min_command)|fs_path_t|irtual_memory_guard_exception_codes|m(?:32_object_id_t|_(?:address_t|behavior_t|extmod_statistics(?:_(?:data_t|t))?|in(?:fo_(?:object(?:_(?:array_t|t))?|region(?:_(?:64(?:_t)?|t))?)|herit_t)|ma(?:chine_attribute_(?:t|val_t)|p_(?:address_t|offset_t|size_t|t))|named_entry_t|o(?:bject_(?:id_t|offset_t|size_t)|ffset_t)|p(?:age_info_(?:basic(?:_(?:data_t|t))?|data_t|flavor_t|t)|rot_t|urg(?:able_t|eable_(?:info(?:_t)?|stat(?:_t)?)))|re(?:ad_entry(?:_t)?|gion_(?:basic_info(?:_(?:64(?:_t)?|data_(?:64_t|t)|t))?|extended_info(?:_(?:data_t|t))?|flavor_t|info_(?:64_t|data_t|t)|recurse_info_(?:64_t|t)|submap_(?:info(?:_(?:64(?:_t)?|data_(?:64_t|t)|t))?|short_info_(?:64(?:_t)?|data_64_t))|top_info(?:_(?:data_t|t))?))|s(?:ize_t|tatistics(?:64(?:_(?:data_t|t))?|_(?:data_t|t))?|ync_t)|task_entry_t))|o(?:idPtr|ucher_mach_msg_state_(?:s|t)))|x(?:86_(?:avx(?:512_state(?:32_t|64_t|_t)?|_state(?:32_t|64_t|_t)?)|debug_state(?:32_t|64_t|_t)?|exception_state(?:32_t|64_t|_t)?|float_state(?:32_t|64_t|_t)?|pagein_state_t|state_hdr(?:_t)?|thread_(?:full_state64_t|state(?:32_t|64_t|_t)?))|pc_(?:activity_(?:handler_t|state_t|t)|connection_(?:handler_t|t)|endpoint_t|finalizer_t|handler_t|object_t|type_t))|zone_(?:btrecord(?:_(?:array_t|t))?|info(?:_(?:array_t|t))?|name(?:_(?:array_t|t))?))\\b", + "name": "support.type.c" + }, { "match": "\\b(?:CF(?:A(?:bsoluteTime|llocator(?:AllocateCallBack|Co(?:ntext|pyDescriptionCallBack)|DeallocateCallBack|PreferredSizeCallBack|Re(?:allocateCallBack|f|leaseCallBack|tainCallBack))|rray(?:ApplierFunction|C(?:allBacks|opyDescriptionCallBack)|EqualCallBack|Re(?:f|leaseCallBack|tainCallBack))|ttributedStringRef)|B(?:ag(?:ApplierFunction|C(?:allBacks|opyDescriptionCallBack)|EqualCallBack|HashCallBack|Re(?:f|leaseCallBack|tainCallBack))|i(?:naryHeap(?:ApplierFunction|C(?:allBacks|ompareContext)|Ref)|t(?:VectorRef)?)|ooleanRef|undleRef(?:Num)?|yteOrder)|C(?:alendar(?:Identifier|Ref|Unit)|haracterSet(?:PredefinedSet|Ref)|ompar(?:atorFunction|isonResult))|D(?:at(?:a(?:Ref|SearchFlags)|e(?:Formatter(?:Key|Ref|Style)|Ref))|ictionary(?:ApplierFunction|CopyDescriptionCallBack|EqualCallBack|HashCallBack|KeyCallBacks|Re(?:f|leaseCallBack|tainCallBack)|ValueCallBacks))|Error(?:Domain|Ref)|File(?:Descriptor(?:C(?:allBack|ontext)|NativeDescriptor|Ref)|Security(?:ClearOptions|Ref))|GregorianUnitFlags|HashCode|I(?:SO8601DateFormatOptions|ndex)|Locale(?:Identifier|Key|LanguageDirection|Ref)|M(?:achPort(?:C(?:allBack|ontext)|InvalidationCallBack|Ref)|essagePort(?:C(?:allBack|ontext)|InvalidationCallBack|Ref)|utable(?:A(?:rrayRef|ttributedStringRef)|B(?:agRef|itVectorRef)|CharacterSetRef|D(?:ataRef|ictionaryRef)|S(?:etRef|tringRef)))|N(?:otification(?:C(?:allback|enterRef)|Name|SuspensionBehavior)|u(?:llRef|mber(?:Formatter(?:Key|OptionFlags|PadPosition|R(?:ef|oundingMode)|Style)|Ref|Type)))|OptionFlags|P(?:lugIn(?:DynamicRegisterFunction|FactoryFunction|Instance(?:DeallocateInstanceDataFunction|GetInterfaceFunction|Ref)|Ref|UnloadFunction)|ropertyList(?:Format|MutabilityOptions|Ref))|R(?:ange|eadStream(?:ClientCallBack|Ref)|unLoop(?:Activity|Mode|Observer(?:C(?:allBack|ontext)|Ref)|R(?:ef|unResult)|Source(?:Context(?:1)?|Ref)|Timer(?:C(?:allBack|ontext)|Ref)))|S(?:et(?:ApplierFunction|C(?:allBacks|opyDescriptionCallBack)|EqualCallBack|HashCallBack|Re(?:f|leaseCallBack|tainCallBack))|ocket(?:C(?:allBack(?:Type)?|ontext)|Error|NativeHandle|Ref|Signature)|tr(?:eam(?:ClientContext|E(?:rror(?:Domain)?|ventType)|PropertyKey|Status)|ing(?:BuiltInEncodings|CompareFlags|Encoding(?:s)?|InlineBuffer|NormalizationForm|Ref|Tokenizer(?:Ref|TokenType)))|wappedFloat(?:32|64))|T(?:ime(?:Interval|Zone(?:NameStyle|Ref))|ree(?:ApplierFunction|Co(?:ntext|pyDescriptionCallBack)|Re(?:f|leaseCallBack|tainCallBack))|ype(?:ID|Ref))|U(?:RL(?:Bookmark(?:CreationOptions|FileCreationOptions|ResolutionOptions)|ComponentType|E(?:numerator(?:Options|Re(?:f|sult))|rror)|PathStyle|Ref)|UID(?:Bytes|Ref)|serNotification(?:CallBack|Ref))|WriteStream(?:ClientCallBack|Ref)|XML(?:Attribute(?:DeclarationInfo|ListDeclarationInfo)|Document(?:Info|TypeInfo)|E(?:lement(?:Info|TypeDeclarationInfo)|ntity(?:Info|ReferenceInfo|TypeCode)|xternalID)|No(?:de(?:Ref|TypeCode)|tationInfo)|P(?:arser(?:AddChildCallBack|C(?:allBacks|o(?:ntext|pyDescriptionCallBack)|reateXMLStructureCallBack)|EndXMLStructureCallBack|HandleErrorCallBack|Options|Re(?:f|leaseCallBack|solveExternalEntityCallBack|tainCallBack)|StatusCode)|rocessingInstructionInfo)|TreeRef))|FSRef)\\b", "name": "support.type.cf.c" }, { - "match": "\\b(?:FILE|accessx_descriptor|blk(?:cnt_t|size_t)|c(?:addr_t|lock(?:_t|id_t)|t_rune_t)|d(?:addr_t|ev_t|i(?:spatch_time_t|v_t)|ouble_t)|errno_t|f(?:bootstraptransfer(?:_t)?|c(?:hecklv(?:_t)?|odeblobs(?:_t)?)|d_(?:mask|set)|i(?:lesec_(?:property_t|t)|xpt_t)|lo(?:at_t|ck(?:timeout)?)|pos_t|s(?:blkcnt_t|filcnt_t|i(?:d(?:_t)?|gnatures(?:_t)?)|obj_id(?:_t)?|searchblock|tore(?:_t)?))|g(?:id_t|uid_t)|i(?:d(?:_t|type_t)|n(?:_(?:addr_t|port_t)|o(?:64_t|_t)|t(?:16_t|32_t|64_t|8_t|_(?:fast(?:16_t|32_t|64_t|8_t)|least(?:16_t|32_t|64_t|8_t))|max_t|ptr_t)))|jmp_buf|key_t|l(?:conv|div_t|ldiv_t|og2phys)|m(?:ach_port_t|ode_t)|nlink_t|off_t|p(?:id_t|roc_rlimit_control_wakeupmon|trdiff_t)|q(?:addr_t|uad_t)|r(?:advisory|egister_t|lim(?:_t|it)|size_t|u(?:ne_t|sage(?:_info_(?:current|t|v(?:0|1|2|3)))?))|s(?:e(?:archstate|gsz_t)|i(?:g(?:_(?:atomic_t|t)|action|event|info_t|jmp_buf|s(?:et_t|tack)|vec)|ze_t)|size_t|tack_t|useconds_t|wblk_t|yscall_arg_t)|t(?:ime(?:_t|spec|val)|m)|u(?:_(?:char|int(?:16_t|32_t|64_t|8_t)?|long|quad_t|short)|context_t|i(?:d_t|nt(?:16_t|32_t|64_t|8_t|_(?:fast(?:16_t|32_t|64_t|8_t)|least(?:16_t|32_t|64_t|8_t))|max_t|ptr_t)?)|s(?:e(?:conds_t|r_(?:addr_t|long_t|off_t|s(?:ize_t|size_t)|time_t|ulong_t))|hort)|uid_t)|va_list|wint_t)\\b", + "match": "\\b(?:accessx_descriptor|blk(?:cnt_t|size_t)|c(?:addr_t|lock(?:_t|i(?:d_t|nfo))|t_rune_t)|d(?:addr_t|ev_t|i(?:spatch_time_t|v_t)|ouble_t)|e(?:rrno_t|xception)|f(?:bootstraptransfer(?:_t)?|c(?:hecklv(?:_t)?|odeblobs(?:_t)?)|d_(?:mask|set)|i(?:lesec_(?:property_t|t)|xpt_t)|lo(?:at_t|ck(?:timeout)?)|punchhole(?:_t)?|s(?:blkcnt_t|filcnt_t|i(?:d(?:_t)?|gnatures(?:_t)?)|obj_id(?:_t)?|pecread(?:_t)?|searchblock|tore(?:_t)?)|trimactivefile(?:_t)?)|g(?:id_t|uid_t)|i(?:d(?:_t|type_t)|n(?:_(?:addr_t|port_t)|o(?:64_t|_t)|t(?:16_t|32_t|64_t|8_t|_(?:fast(?:16_t|32_t|64_t|8_t)|least(?:16_t|32_t|64_t|8_t))|max_t|ptr_t))|ovec|timerval)|jmp_buf|key_t|l(?:conv|div_t|ldiv_t|og2phys)|m(?:a(?:ch_port_t|x_align_t)|ode_t)|nlink_t|off_t|p(?:id_t|roc_rlimit_control_wakeupmon|trdiff_t)|q(?:addr_t|uad_t)|r(?:advisory|egister_t|lim(?:_t|it)|size_t|u(?:ne_t|sage(?:_info_(?:current|t|v(?:0|1|2|3|4)))?))|s(?:a_family_t|e(?:archstate|gsz_t)|i(?:g(?:_(?:atomic_t|t)|action|event|info_t|jmp_buf|s(?:et_t|tack)|vec)|md_(?:double(?:2x(?:2|3|4)|3x(?:2|3|4)|4x(?:2|3|4))|float(?:2x(?:2|3|4)|3x(?:2|3|4)|4x(?:2|3|4))|quat(?:d|f))|ze_t)|ocklen_t|size_t|tack_t|useconds_t|wblk_t|yscall_arg_t)|t(?:ime(?:_t|spec|val(?:64)?|zone)|m)|u(?:_(?:char|int(?:16_t|32_t|64_t|8_t)?|long|quad_t|short)|context_t|i(?:d_t|nt(?:16_t|32_t|64_t|8_t|_(?:fast(?:16_t|32_t|64_t|8_t)|least(?:16_t|32_t|64_t|8_t))|max_t|ptr_t)?)|s(?:e(?:conds_t|r_(?:addr_t|long_t|off_t|s(?:ize_t|size_t)|time_t|ulong_t))|hort)|uid_t)|va_list|w(?:char_t|int_t))\\b", "name": "support.type.clib.c" }, { - "match": "\\bdispatch_(?:autorelease_frequency_t|block_(?:flags_t|t)|data_(?:applier_t|s|t)|f(?:d_t|unction_t)|group_(?:s|t)|io_(?:close_flags_t|handler_t|interval_flags_t|s|t(?:ype_t)?)|o(?:bject_(?:s|t)|nce_t)|q(?:os_class_t|ueue_(?:attr_(?:s|t)|priority_t|s|t))|s(?:emaphore_(?:s|t)|ource_(?:m(?:ach_send_flags_t|emorypressure_flags_t)|proc_flags_t|s|t(?:imer_flags_t|ype_(?:s|t))?|vnode_flags_t)))\\b", + "match": "\\bdispatch_(?:autorelease_frequency_t|block_(?:flags_t|t)|channel_s|data_(?:s|t)|f(?:d_t|unction_t)|group_(?:s|t)|io_(?:close_flags_t|handler_t|interval_flags_t|s|t(?:ype_t)?)|mach_(?:msg_s|s)|o(?:bject_(?:s|t)|nce_t)|q(?:os_class_t|ueue_(?:attr_(?:s|t)|concurrent_t|global_t|main_t|priority_t|s(?:erial_t)?|t))|s(?:emaphore_(?:s|t)|ource_(?:m(?:ach_(?:recv_flags_t|send_flags_t)|emorypressure_flags_t)|proc_flags_t|s|t(?:imer_flags_t|ype_(?:s|t))?|vnode_flags_t))|workloop_t)\\b", "name": "support.type.dispatch.c" }, { @@ -110,16 +290,52 @@ "name": "support.type.mac-classic.c" }, { - "match": "\\b(?:pthread_(?:attr_t|cond(?:_t|attr_t)|key_t|mutex(?:_t|attr_t)|o(?:nce_t|verride_(?:s|t))|rwlock(?:_t|attr_t)|t)|sched_param)\\b", + "match": "\\bpthread_(?:attr_t|cond(?:_t|attr_t)|key_t|mutex(?:_t|attr_t)|once_t|rwlock(?:_t|attr_t)|t)\\b", "name": "support.type.pthread.c" }, { - "match": "\\bCGImageByteOrderInfo\\b", - "name": "support.type.quartz.10.12.c" + "match": "\\b(?:CG(?:AffineTransform|B(?:itmap(?:ContextReleaseDataCallback|Info)|lendMode|uttonCount)|C(?:aptureOptions|harCode|o(?:lor(?:ConversionInfo(?:Ref|TransformType)?|Re(?:f|nderingIntent)|Space(?:Model|Ref)?)?|n(?:figureOption|text(?:Ref)?)))|D(?:ata(?:Consumer(?:Callbacks|PutBytesCallback|Re(?:f|leaseInfoCallback))?|Provider(?:DirectCallbacks|GetByte(?:PointerCallback|s(?:AtPositionCallback|Callback))|Re(?:f|lease(?:BytePointerCallback|DataCallback|InfoCallback)|windCallback)|S(?:equentialCallbacks|kipForwardCallback))?)|eviceColor|i(?:rectDisplayID|splay(?:BlendFraction|C(?:hangeSummaryFlags|o(?:nfigRef|unt))|Err|Fade(?:Interval|ReservationToken)|Mode(?:Ref)?|Re(?:configurationCallBack|servationInterval)|Stream(?:Frame(?:AvailableHandler|Status)|Ref|Update(?:Re(?:ctType|f))?)?)))|E(?:rror|vent(?:Err|F(?:i(?:eld|lterMask)|lags)|M(?:ask|ouseSubtype)|Ref|S(?:ource(?:KeyboardType|Ref|StateID)|uppressionState)|T(?:ap(?:CallBack|Information|Location|Options|P(?:lacement|roxy))|imestamp|ype)))|F(?:loat|ont(?:Index|PostScriptFormat|Ref)?|unction(?:Callbacks|EvaluateCallback|Re(?:f|leaseInfoCallback))?)|G(?:ammaValue|esturePhase|lyph(?:DeprecatedEnum)?|radient(?:DrawingOptions|Ref)?)|I(?:mage(?:AlphaInfo|ByteOrderInfo|PixelFormatInfo|Ref)?|nterpolationQuality)|KeyCode|L(?:ayer(?:Ref)?|ine(?:Cap|Join))|M(?:o(?:mentumScrollPhase|useButton)|utablePathRef)|OpenGLDisplayMask|P(?:DF(?:A(?:ccessPermissions|rray(?:Ref)?)|Bo(?:olean|x)|ContentStream(?:Ref)?|D(?:ataFormat|ictionary(?:ApplierFunction|Ref)?|ocument(?:Ref)?)|Integer|O(?:bject(?:Ref|Type)?|perator(?:Callback|Table(?:Ref)?))|Page(?:Ref)?|Real|S(?:canner(?:Ref)?|tr(?:eam(?:Ref)?|ing(?:Ref)?))|Tag(?:Property|Type))|SConverter(?:Begin(?:DocumentCallback|PageCallback)|Callbacks|End(?:DocumentCallback|PageCallback)|MessageCallback|ProgressCallback|Re(?:f|leaseInfoCallback))?|at(?:h(?:Appl(?:ierFunction|yBlock)|DrawingMode|Element(?:Type)?|Ref)?|tern(?:Callbacks|DrawPatternCallback|Re(?:f|leaseInfoCallback)|Tiling)?)|oint)|Re(?:ct(?:Count|Edge)?|freshRate)|S(?:cr(?:een(?:RefreshCallback|Update(?:Move(?:Callback|Delta)|Operation))|oll(?:EventUnit|Phase))|hading(?:Ref)?|ize)|Text(?:DrawingMode|Encoding)|Vector|W(?:heelCount|indow(?:BackingType|I(?:D|mageOption)|L(?:evel(?:Key)?|istOption)|SharingType)))|IOSurfaceRef)\\b", + "name": "support.type.quartz.c" }, { - "match": "\\b(?:CG(?:AffineTransform|B(?:itmap(?:ContextReleaseDataCallback|Info)|lendMode|uttonCount)|C(?:aptureOptions|harCode|o(?:lor(?:ConversionInfo(?:Ref|TransformType)?|Re(?:f|nderingIntent)|Space(?:Model|Ref)?)?|n(?:figureOption|text(?:Ref)?)))|D(?:ata(?:Consumer(?:Callbacks|PutBytesCallback|Re(?:f|leaseInfoCallback))?|Provider(?:DirectCallbacks|GetByte(?:PointerCallback|s(?:AtPositionCallback|Callback))|Re(?:f|lease(?:BytePointerCallback|DataCallback|InfoCallback)|windCallback)|S(?:equentialCallbacks|kipForwardCallback))?)|eviceColor|i(?:rectDisplayID|splay(?:BlendFraction|C(?:hangeSummaryFlags|o(?:nfigRef|unt))|Err|Fade(?:Interval|ReservationToken)|Mode(?:Ref)?|Re(?:configurationCallBack|servationInterval)|Stream(?:Frame(?:AvailableHandler|Status)|Ref|Update(?:Re(?:ctType|f))?)?)))|E(?:rror|vent(?:Err|F(?:i(?:eld|lterMask)|lags)|M(?:ask|ouseSubtype)|Ref|S(?:ource(?:KeyboardType|Ref|StateID)|uppressionState)|T(?:ap(?:CallBack|Information|Location|Options|P(?:lacement|roxy))|imestamp|ype)))|F(?:loat|ont(?:Index|PostScriptFormat|Ref)?|unction(?:Callbacks|EvaluateCallback|Re(?:f|leaseInfoCallback))?)|G(?:ammaValue|esturePhase|lyph(?:DeprecatedEnum)?|radient(?:DrawingOptions|Ref)?)|I(?:mage(?:AlphaInfo|ByteOrderInfo|Ref)?|nterpolationQuality)|KeyCode|L(?:ayer(?:Ref)?|ine(?:Cap|Join))|M(?:o(?:mentumScrollPhase|useButton)|utablePathRef)|OpenGLDisplayMask|P(?:DF(?:Array(?:Ref)?|Bo(?:olean|x)|ContentStream(?:Ref)?|D(?:ataFormat|ictionary(?:ApplierFunction|Ref)?|ocument(?:Ref)?)|Integer|O(?:bject(?:Ref|Type)?|perator(?:Callback|Table(?:Ref)?))|Page(?:Ref)?|Real|S(?:canner(?:Ref)?|tr(?:eam(?:Ref)?|ing(?:Ref)?)))|SConverter(?:Begin(?:DocumentCallback|PageCallback)|Callbacks|End(?:DocumentCallback|PageCallback)|MessageCallback|ProgressCallback|Re(?:f|leaseInfoCallback))?|at(?:h(?:ApplierFunction|DrawingMode|Element(?:Type)?|Ref)?|tern(?:Callbacks|DrawPatternCallback|Re(?:f|leaseInfoCallback)|Tiling)?)|oint)|Re(?:ct(?:Count|Edge)?|freshRate)|S(?:cr(?:een(?:RefreshCallback|Update(?:Move(?:Callback|Delta)|Operation))|oll(?:EventUnit|Phase))|hading(?:Ref)?|ize)|Text(?:DrawingMode|Encoding)|Vector|W(?:heelCount|indow(?:BackingType|I(?:D|mageOption)|L(?:evel(?:Key)?|istOption)|SharingType)))|IOSurfaceRef)\\b", - "name": "support.type.quartz.c" + "match": "\\b(?:k(?:C(?:FHTTPVersion2_0|GImage(?:Destination(?:EmbedThumbnail|ImageMaxPixelSize)|MetadataShouldExcludeGPS|Property(?:8BIMVersion|APNG(?:DelayTime|LoopCount|UnclampedDelayTime)|GPSHPositioningError|MakerAppleDictionary))|T(?:FontOpenTypeFeature(?:Tag|Value)|RubyAnnotationAttributeName)|V(?:ImageBufferAlphaChannelIsOpaque|PixelFormatCo(?:mponentRange(?:_(?:FullRange|VideoRange|WideRange))?|ntains(?:RGB|YCbCr))))|Sec(?:AttrAccess(?:Control|ibleWhenPasscodeSetThisDeviceOnly)|UseOperationPrompt)|UTType(?:3DContent|A(?:VIMovie|pple(?:ProtectedMPEG4Video|Script)|ssemblyLanguageSource|udioInterchangeFileFormat)|B(?:inaryPropertyList|ookmark|zip2Archive)|C(?:alendarEvent|ommaSeparatedText)|DelimitedText|E(?:lectronicPublication|mailMessage)|Font|GNUZipArchive|InternetLocation|J(?:SON|ava(?:Archive|Class|Script))|Log|M(?:3UPlaylist|IDIAudio|PEG2(?:TransportStream|Video))|OSAScript(?:Bundle)?|P(?:HPScript|KCS12|erlScript|l(?:aylist|uginBundle)|r(?:esentation|opertyList)|ythonScript)|QuickLookGenerator|R(?:awImage|ubyScript)|S(?:c(?:alableVectorGraphics|ript)|hellScript|p(?:otlightImporter|readsheet)|ystemPreferencesPane)|T(?:abSeparatedText|oDoItem)|U(?:RLBookmarkData|TF8TabSeparatedText|nixExecutable)|W(?:aveformAudio|indowsExecutable)|X(?:509Certificate|MLPropertyList|PCService)|ZipArchive))|matrix_identity_(?:double(?:2x2|3x3|4x4)|float(?:2x2|3x3|4x4)))\\b", + "name": "support.variable.10.10.c" + }, + { + "match": "\\bk(?:A(?:XListItem(?:IndexTextAttribute|LevelTextAttribute|PrefixTextAttribute)|udioComponent(?:InstanceInvalidationNotification|RegistrationsChangedNotification))|C(?:FStreamPropertySocketExtendedBackgroundIdleMode|GImage(?:Property(?:ExifSubsecTimeOriginal|PNGCompressionFilter|TIFFTile(?:Length|Width))|SourceSubsampleFactor)|V(?:ImageBuffer(?:ColorPrimaries_(?:DCI_P3|ITU_R_2020|P3_D65)|TransferFunction_ITU_R_2020|YCbCrMatrix_(?:DCI_P3|ITU_R_2020|P3_D65))|MetalTextureCacheMaximumTextureAgeKey|PixelBuffer(?:MetalCompatibilityKey|OpenGLTextureCacheCompatibilityKey)))|MDItemHTMLContent|Sec(?:A(?:CLAuthorization(?:Integrity|PartitionID)|ttrSyncViewHint)|PolicyApplePayIssuerEncryption|TrustCertificateTransparency|UseAuthentication(?:Context|UI(?:Allow|Fail|Skip)?))|UTTypeSwiftSource)\\b", + "name": "support.variable.10.11.c" + }, + { + "match": "\\bk(?:C(?:FStreamNetworkServiceTypeCallSignaling|GImage(?:DestinationOptimizeColorForSharing|PropertyDNG(?:AsShot(?:Neutral|WhiteXY)|B(?:aseline(?:Exposure|Noise|Sharpness)|lackLevel)|C(?:a(?:librationIlluminant(?:1|2)|meraCalibration(?:1|2|Signature))|olorMatrix(?:1|2))|FixVignetteRadial|NoiseProfile|Pr(?:ivateData|ofileCalibrationSignature)|W(?:arp(?:Fisheye|Rectilinear)|hiteLevel)))|T(?:BackgroundColorAttributeName|FontDownloadedAttribute|HorizontalInVerticalFormsAttributeName|RubyAnnotationS(?:caleToFitAttributeName|izeFactorAttributeName)|TrackingAttributeName)|VImageBufferTransferFunction_SMPTE_ST_428_1)|IOSurfacePixelSizeCastingAllowed|Sec(?:Attr(?:AccessGroupToken|KeyTypeECSECPrimeRandom|TokenID(?:SecureEnclave)?)|Key(?:Algorithm(?:EC(?:D(?:HKeyExchange(?:Cofactor(?:X963SHA(?:1|2(?:24|56)|384|512))?|Standard(?:X963SHA(?:1|2(?:24|56)|384|512))?)|SASignature(?:DigestX962(?:SHA(?:1|2(?:24|56)|384|512))?|MessageX962SHA(?:1|2(?:24|56)|384|512)|RFC4754))|IESEncryption(?:CofactorX963SHA(?:1AESGCM|2(?:24AESGCM|56AESGCM)|384AESGCM|512AESGCM)|StandardX963SHA(?:1AESGCM|2(?:24AESGCM|56AESGCM)|384AESGCM|512AESGCM)))|RSA(?:Encryption(?:OAEPSHA(?:1(?:AESGCM)?|2(?:24(?:AESGCM)?|56(?:AESGCM)?)|384(?:AESGCM)?|512(?:AESGCM)?)|PKCS1|Raw)|Signature(?:DigestPKCS1v15(?:Raw|SHA(?:1|2(?:24|56)|384|512))|MessagePKCS1v15SHA(?:1|2(?:24|56)|384|512)|Raw)))|KeyExchangeParameter(?:RequestedSize|SharedInfo)))|UTTypeLivePhoto)\\b", + "name": "support.variable.10.12.c" + }, + { + "match": "\\bk(?:C(?:GImage(?:AuxiliaryData(?:Info(?:Data(?:Description)?|Metadata)|TypeD(?:epth|isparity))|Metadata(?:NamespaceIPTCExtension|PrefixIPTCExtension)|Property(?:AuxiliaryData(?:Type)?|BytesPerRow|FileContentsDictionary|Height|I(?:PTCExt(?:A(?:boutCvTerm(?:CvId|Id|Name|RefinedAbout)?|ddlModelInfo|rtwork(?:C(?:ircaDateCreated|o(?:nt(?:entDescription|ributionDescription)|pyright(?:Notice|Owner(?:ID|Name)))|reator(?:ID)?)|DateCreated|Licensor(?:ID|Name)|OrObject|PhysicalDescription|S(?:ource(?:Inv(?:URL|entoryNo))?|tylePeriod)|Title)|udio(?:Bitrate(?:Mode)?|ChannelCount))|C(?:ircaDateCreated|o(?:nt(?:ainerFormat(?:Identifier|Name)?|r(?:ibutor(?:Identifier|Name|Role)?|olledVocabularyTerm))|pyrightYear)|reator(?:Identifier|Name|Role)?)|D(?:ataOnScreen(?:Region(?:D|H|Text|Unit|W|X|Y)?)?|igital(?:ImageGUID|Source(?:FileType|Type))|opesheet(?:Link(?:Link(?:Qualifier)?)?)?)|E(?:mb(?:dEncRightsExpr|eddedEncodedRightsExpr(?:LangID|Type)?)|pisode(?:Identifier|N(?:ame|umber))?|vent|xternalMetadataLink)|FeedIdentifier|Genre(?:Cv(?:Id|Term(?:Id|Name|RefinedAbout)))?|Headline|IPTCLastEdited|L(?:inkedEnc(?:RightsExpr|odedRightsExpr(?:LangID|Type)?)|ocation(?:C(?:ity|ountry(?:Code|Name)|reated)|GPS(?:Altitude|L(?:atitude|ongitude))|Identifier|Location(?:Id|Name)|ProvinceState|S(?:hown|ublocation)|WorldRegion))|M(?:axAvail(?:Height|Width)|odelAge)|OrganisationInImage(?:Code|Name)|P(?:erson(?:Heard(?:Identifier|Name)?|InImage(?:C(?:haracteristic|vTerm(?:CvId|Id|Name|RefinedAbout))|Description|Id|Name|WDetails)?)|roductInImage(?:Description|GTIN|Name)?|ublicationEvent(?:Date|Identifier|Name)?)|R(?:ating(?:R(?:atingRegion|egion(?:C(?:ity|ountry(?:Code|Name))|GPS(?:Altitude|L(?:atitude|ongitude))|Identifier|Location(?:Id|Name)|ProvinceState|Sublocation|WorldRegion))|S(?:caleM(?:axValue|inValue)|ourceLink)|Value(?:LogoLink)?)?|e(?:gistry(?:EntryRole|I(?:D|temID)|OrganisationID)|leaseReady))|S(?:e(?:ason(?:Identifier|N(?:ame|umber))?|ries(?:Identifier|Name)?)|hownEvent(?:Identifier|Name)?|t(?:orylineIdentifier|reamReady|ylePeriod)|upplyChainSource(?:Identifier|Name)?)|T(?:emporalCoverage(?:From|To)?|ranscript(?:Link(?:Link(?:Qualifier)?)?)?)|Vi(?:deo(?:Bitrate(?:Mode)?|DisplayAspectRatio|EncodingProfile|S(?:hotType(?:Identifier|Name)?|treamsCount))|sualColor)|WorkflowTag(?:Cv(?:Id|Term(?:Id|Name|RefinedAbout)))?)|mage(?:Count|s))|NamedColorSpace|P(?:ixelFormat|rimaryImage)|ThumbnailImages|Width))|T(?:BaselineOffsetAttributeName|FontVariationAxisHiddenKey)|V(?:ImageBuffer(?:ContentLightLevelInfoKey|MasteringDisplayColorVolumeKey|TransferFunction_(?:ITU_R_2100_HLG|SMPTE_ST_2084_PQ|sRGB))|MetalTextureUsage))|IOSurface(?:Plane(?:BitsPerElement|Component(?:Bit(?:Depths|Offsets)|Names|Ranges|Types))|Subsampling)|Sec(?:A(?:CLAuthorizationChange(?:ACL|Owner)|ttrPersist(?:antReference|entReference))|KeyAlgorithm(?:ECIESEncryption(?:CofactorVariableIVX963SHA(?:2(?:24AESGCM|56AESGCM)|384AESGCM|512AESGCM)|StandardVariableIVX963SHA(?:2(?:24AESGCM|56AESGCM)|384AESGCM|512AESGCM))|RSASignature(?:DigestPSSSHA(?:1|2(?:24|56)|384|512)|MessagePSSSHA(?:1|2(?:24|56)|384|512)))))\\b", + "name": "support.variable.10.13.c" + }, + { + "match": "\\bkC(?:GImage(?:AuxiliaryDataTypePortraitEffectsMatte|Property(?:DNG(?:A(?:ctiveArea|n(?:alogBalance|tiAliasStrength)|sShot(?:ICCProfile|Pr(?:eProfileMatrix|ofileName)))|B(?:a(?:selineExposureOffset|yerGreenSplit)|estQualityScale|lackLevel(?:Delta(?:H|V)|RepeatDim))|C(?:FA(?:Layout|PlaneColor)|hromaBlurRadius|olorimetricReference|urrent(?:ICCProfile|PreProfileMatrix))|Default(?:BlackRender|Crop(?:Origin|Size)|Scale|UserCrop)|ExtraCameraProfiles|ForwardMatrix(?:1|2)|Linear(?:ResponseLimit|izationTable)|Ma(?:kerNoteSafety|skedAreas)|N(?:ewRawImageDigest|oiseReductionApplied)|O(?:pcodeList(?:1|2|3)|riginal(?:BestQualityFinalSize|Default(?:CropSize|FinalSize)|RawFile(?:D(?:ata|igest)|Name)))|Pr(?:eview(?:Application(?:Name|Version)|ColorSpace|DateTime|Settings(?:Digest|Name))|ofile(?:Copyright|EmbedPolicy|HueSatMap(?:D(?:ata(?:1|2)|ims)|Encoding)|LookTable(?:D(?:ata|ims)|Encoding)|Name|ToneCurve))|R(?:aw(?:DataUniqueID|ImageDigest|ToPreviewGain)|eductionMatrix(?:1|2)|owInterleaveFactor)|S(?:hadowScale|ubTileBlockSize))|PNG(?:Comment|Disclaimer|Source|Warning)))|TTypesetterOptionAllowUnboundedLayout|V(?:ImageBufferTransferFunction_Linear|PixelFormatContainsGrayscale))\\b", + "name": "support.variable.10.14.c" + }, + { + "match": "\\bk(?:C(?:FStreamProperty(?:Allow(?:ConstrainedNetworkAccess|ExpensiveNetworkAccess)|ConnectionIsExpensive)|GImage(?:A(?:nimation(?:DelayTime|LoopCount|StartIndex)|uxiliaryDataTypeSemanticSegmentation(?:HairMatte|SkinMatte|TeethMatte))|Property(?:APNG(?:CanvasPixel(?:Height|Width)|FrameInfoArray)|Exif(?:CompositeImage|OffsetTime(?:Digitized|Original)?|Source(?:ExposureTimesOfCompositeImage|ImageNumberOfCompositeImage))|GIF(?:CanvasPixel(?:Height|Width)|FrameInfoArray)|HEICS(?:CanvasPixel(?:Height|Width)|D(?:elayTime|ictionary)|FrameInfoArray|LoopCount|UnclampedDelayTime)))|TFontFeature(?:SampleTextKey|TooltipTextKey)|V(?:ImageBufferAlphaChannelMode(?:Key|_(?:PremultipliedAlpha|StraightAlpha))|MetalTextureStorageMode))|MIDIPropertyNameConfigurationDictionary|Sec(?:PropertyType(?:Array|Number)|UseDataProtectionKeychain))\\b", + "name": "support.variable.10.15.c" + }, + { + "match": "\\bkColorSyncExtendedRange\\b", + "name": "support.variable.10.16.c" + }, + { + "match": "\\bk(?:C(?:FStream(?:NetworkServiceType(?:AVStreaming|Responsive(?:AV|Data))|Property(?:ConnectionIsCellular|NoCellular))|GImage(?:Destination(?:DateTime|Me(?:rgeMetadata|tadata)|Orientation)|Metadata(?:EnumerateRecursively|Namespace(?:DublinCore|Exif(?:Aux)?|IPTCCore|Photoshop|TIFF|XMP(?:Basic|Rights))|Prefix(?:DublinCore|Exif(?:Aux)?|IPTCCore|Photoshop|TIFF|XMP(?:Basic|Rights))|ShouldExcludeXMP))|T(?:Baseline(?:Class(?:AttributeName|Hanging|Ideographic(?:Centered|High|Low)|Math|Roman)|InfoAttributeName|OriginalFont|Reference(?:Font|InfoAttributeName))|FontD(?:escriptorMatching(?:CurrentAssetSize|Descriptors|Error|Percentage|Result|SourceDescriptor|Total(?:AssetSize|DownloadedSize))|ownloadableAttribute)|WritingDirectionAttributeName)|VImageBufferColorPrimaries_P22)|Sec(?:O(?:AEP(?:EncodingParametersAttributeName|M(?:GF1DigestAlgorithmAttributeName|essageLengthAttributeName))|IDSRVName)|P(?:addingOAEPKey|olicyAppleTimeStamping|rivateKeyAttrs|ublicKeyAttrs)))\\b", + "name": "support.variable.10.8.c" + }, + { + "match": "\\b(?:XPC_ACTIVITY_(?:ALLOW_BATTERY|CHECK_IN|DELAY|GRACE_PERIOD|INTERVAL(?:_(?:1(?:5_MIN|_(?:DAY|HOUR|MIN))|30_MIN|4_HOURS|5_MIN|7_DAYS|8_HOURS))?|PRIORITY(?:_(?:MAINTENANCE|UTILITY))?|RE(?:PEATING|QUIRE_SCREEN_SLEEP))|k(?:AX(?:MarkedMisspelledTextAttribute|TrustedCheckOptionPrompt)|C(?:FStreamPropertySSLContext|GImage(?:Metadata(?:NamespaceExifEX|PrefixExifEX)|Property(?:Exif(?:ISOSpeed(?:Latitude(?:yyy|zzz))?|RecommendedExposureIndex|S(?:ensitivityType|tandardOutputSensitivity))|OpenEXR(?:AspectRatio|Dictionary))|SourceShouldCacheImmediately)|TLanguageAttributeName)|S(?:ec(?:Attr(?:Access(?:Group|ible(?:AfterFirstUnlock(?:ThisDeviceOnly)?|WhenUnlocked(?:ThisDeviceOnly)?)?)|KeyTypeEC|Synchronizable(?:Any)?)|Policy(?:Apple(?:PassbookSigning|Revocation)|RevocationFlags|TeamIdentifier)|Trust(?:E(?:valuationDate|xtendedValidation)|OrganizationName|Re(?:sultValue|vocation(?:Checked|ValidUntilDate))))|peech(?:AudioOutputFormatProperty|Output(?:ChannelMapProperty|ToFileDescriptorProperty)|SynthExtensionProperty)))|vm_kernel_page_(?:mask|s(?:hift|ize)))\\b", + "name": "support.variable.10.9.c" + }, + { + "match": "\\b(?:CATransform3DIdentity|KERNEL_(?:AUDIT_TOKEN|SECURITY_TOKEN)|NDR_record|UUID_NULL|bootstrap_port|gGuid(?:Apple(?:CSP(?:DL)?|DotMac(?:DL|TP)|FileDL|LDAPDL|SdCSPDL|X509(?:CL|TP))|Cssm)|k(?:A(?:ERemoteProcess(?:NameKey|ProcessIDKey|U(?:RLKey|serIDKey))|X(?:A(?:ttachmentTextAttribute|utocorrectedTextAttribute)|BackgroundColorTextAttribute|Fo(?:nt(?:FamilyKey|NameKey|SizeKey|TextAttribute)|reg(?:oundColorTextAttribute|roundColorTextAttribute))|LinkTextAttribute|MisspelledTextAttribute|NaturalLanguageTextAttribute|ReplacementStringTextAttribute|S(?:hadowTextAttribute|trikethrough(?:ColorTextAttribute|TextAttribute)|uperscriptTextAttribute)|Underline(?:ColorTextAttribute|TextAttribute)|V(?:alue(?:AXErrorType|C(?:FRangeType|G(?:PointType|RectType|SizeType))|IllegalType)|isibleNameKey))|u(?:dioStreamAnyRate|thorizationExternalFormLength))|C(?:F(?:DNSServiceFailureKey|ErrorDomain(?:C(?:FNetwork|GImageMetadata)|SystemConfiguration|WinSock)|FTPStatusCodeKey|GetAddrInfoFailureKey|HTTP(?:Authentication(?:AccountDomain|Password|Scheme(?:Basic|Digest|Kerberos|N(?:TLM|egotiate(?:2)?)|XMobileMeAuthToken)|Username)|Version1_(?:0|1))|NetworkProxies(?:Exc(?:eptionsList|ludeSimpleHostnames)|FTP(?:Enable|P(?:assive|ort|roxy))|Gopher(?:Enable|P(?:ort|roxy))|HTTP(?:Enable|P(?:ort|roxy)|S(?:Enable|P(?:ort|roxy)))|ProxyAuto(?:Config(?:Enable|JavaScript|URLString)|DiscoveryEnable)|RTSP(?:Enable|P(?:ort|roxy))|SOCKS(?:Enable|P(?:ort|roxy)))|Proxy(?:AutoConfiguration(?:HTTPResponseKey|JavaScriptKey|URLKey)|HostNameKey|P(?:asswordKey|ortNumberKey)|Type(?:AutoConfiguration(?:JavaScript|URL)|FTP|HTTP(?:S)?|Key|None|SOCKS)|UsernameKey)|S(?:OCKS(?:NegotiationMethodKey|StatusCodeKey|VersionKey)|tream(?:ErrorDomain(?:FTP|HTTP|Mach|Net(?:DB|Services)|SystemConfiguration|WinSock)|NetworkServiceType(?:Background|V(?:ideo|oice))?|Property(?:ProxyLocalBypass|S(?:SL(?:PeerTrust|Settings)|ocketRemote(?:Host|NetService)))|SSL(?:Certificates|IsServer|Level|PeerName|ValidatesCertificateChain)))|URLErrorFailingURL(?:ErrorKey|StringErrorKey))|GImage(?:Destination(?:BackgroundColor|LossyCompressionQuality)|Property(?:8BIM(?:Dictionary|LayerNames)|C(?:IFF(?:C(?:ameraSerialNumber|ontinuousDrive)|D(?:escription|ictionary)|F(?:irmware|lashExposureComp|ocusMode)|Image(?:FileName|Name|SerialNumber)|LensM(?:axMM|inMM|odel)|Me(?:asuredEV|teringMode)|OwnerName|Re(?:cordID|lease(?:Method|Timing))|S(?:elfTimingTime|hootingMode)|WhiteBalanceIndex)|olorModel(?:CMYK|Gray|Lab|RGB)?)|D(?:NG(?:BackwardVersion|CameraSerialNumber|Dictionary|L(?:ensInfo|ocalizedCameraModel)|UniqueCameraModel|Version)|PI(?:Height|Width)|epth)|Exif(?:A(?:pertureValue|ux(?:Dictionary|F(?:irmware|lashCompensation)|ImageNumber|Lens(?:I(?:D|nfo)|Model|SerialNumber)|OwnerName|SerialNumber))|B(?:odySerialNumber|rightnessValue)|C(?:FAPattern|ameraOwnerName|o(?:lorSpace|mp(?:onentsConfiguration|ressedBitsPerPixel)|ntrast)|ustomRendered)|D(?:ateTime(?:Digitized|Original)|eviceSettingDescription|i(?:ctionary|gitalZoomRatio))|Exposure(?:BiasValue|Index|Mode|Program|Time)|F(?:Number|ileSource|lash(?:Energy|PixVersion)?|ocal(?:Len(?:In35mmFilm|gth)|Plane(?:ResolutionUnit|XResolution|YResolution)))|Ga(?:inControl|mma)|I(?:SOSpeedRatings|mageUniqueID)|L(?:ens(?:M(?:ake|odel)|S(?:erialNumber|pecification))|ightSource)|M(?:a(?:kerNote|xApertureValue)|eteringMode)|OECF|Pixel(?:XDimension|YDimension)|RelatedSoundFile|S(?:aturation|cene(?:CaptureType|Type)|ensingMethod|h(?:arpness|utterSpeedValue)|p(?:atialFrequencyResponse|ectralSensitivity)|ub(?:ject(?:Area|Dist(?:Range|ance)|Location)|secTime(?:Digitized)?))|UserComment|Version|WhiteBalance)|FileSize|G(?:IF(?:D(?:elayTime|ictionary)|HasGlobalColorMap|ImageColorMap|LoopCount|UnclampedDelayTime)|PS(?:A(?:ltitude(?:Ref)?|reaInformation)|D(?:OP|ateStamp|est(?:Bearing(?:Ref)?|Distance(?:Ref)?|L(?:atitude(?:Ref)?|ongitude(?:Ref)?))|i(?:ctionary|fferental))|ImgDirection(?:Ref)?|L(?:atitude(?:Ref)?|ongitude(?:Ref)?)|M(?:apDatum|easureMode)|ProcessingMethod|S(?:atellites|peed(?:Ref)?|tatus)|T(?:imeStamp|rack(?:Ref)?)|Version))|HasAlpha|I(?:PTC(?:ActionAdvised|Byline(?:Title)?|C(?:a(?:ptionAbstract|tegory)|ity|o(?:nt(?:act(?:Info(?:Address|C(?:ity|ountry)|Emails|P(?:hones|ostalCode)|StateProvince|WebURLs))?|entLocation(?:Code|Name))|pyrightNotice|untryPrimaryLocation(?:Code|Name))|re(?:atorContactInfo|dit))|D(?:ateCreated|i(?:ctionary|gitalCreation(?:Date|Time)))|E(?:dit(?:Status|orialUpdate)|xpiration(?:Date|Time))|FixtureIdentifier|Headline|Image(?:Orientation|Type)|Keywords|LanguageIdentifier|O(?:bject(?:AttributeReference|Cycle|Name|TypeReference)|rigina(?:lTransmissionReference|tingProgram))|Pro(?:gramVersion|vinceState)|R(?:e(?:ference(?:Date|Number|Service)|lease(?:Date|Time))|ightsUsageTerms)|S(?:cene|ource|pecialInstructions|tarRating|u(?:b(?:Location|jectReference)|pplementalCategory))|TimeCreated|Urgency|WriterEditor)|s(?:Float|Indexed))|JFIF(?:D(?:ensityUnit|ictionary)|IsProgressive|Version|XDensity|YDensity)|Maker(?:Canon(?:AspectRatioInfo|C(?:ameraSerialNumber|ontinuousDrive)|Dictionary|F(?:irmware|lashExposureComp)|ImageSerialNumber|LensModel|OwnerName)|FujiDictionary|MinoltaDictionary|Nikon(?:C(?:ameraSerialNumber|olorMode)|Di(?:ctionary|gitalZoom)|F(?:lash(?:ExposureComp|Setting)|ocus(?:Distance|Mode))|I(?:SOSe(?:lection|tting)|mageAdjustment)|Lens(?:Adapter|Info|Type)|Quality|Sh(?:arpenMode|ootingMode|utterCount)|WhiteBalanceMode)|OlympusDictionary|PentaxDictionary)|Orientation|P(?:NG(?:Author|C(?:hromaticities|opyright|reationTime)|D(?:escription|ictionary)|Gamma|InterlaceType|ModificationTime|Software|Title|XPixelsPerMeter|YPixelsPerMeter|sRGBIntent)|ixel(?:Height|Width)|rofileName)|RawDictionary|TIFF(?:Artist|Co(?:mpression|pyright)|D(?:ateTime|ictionary|ocumentName)|HostComputer|ImageDescription|M(?:ake|odel)|Orientation|P(?:hotometricInterpretation|rimaryChromaticities)|ResolutionUnit|Software|TransferFunction|WhitePoint|XResolution|YResolution))|Source(?:CreateThumbnail(?:FromImage(?:Always|IfAbsent)|WithTransform)|Should(?:AllowFloat|Cache)|T(?:humbnailMaxPixelSize|ypeIdentifierHint)))|M(?:M(?:ApplyTransformProcName|CreateTransformPropertyProcName|Initialize(?:LinkProfileProcName|TransformProcName))|SEncoderDigestAlgorithmSHA(?:1|256))|SIdentity(?:ErrorDomain|GeneratePosixName)|T(?:F(?:o(?:nt(?:AttributeName|BaselineAdjustAttribute|C(?:ascadeListAttribute|haracterSetAttribute|o(?:llection(?:DisallowAutoActivationOption|IncludeDisabledFontsOption|RemoveDuplicatesOption)|pyrightNameKey))|D(?:es(?:criptionNameKey|igner(?:NameKey|URLNameKey))|isplayNameAttribute)|EnabledAttribute|F(?:amilyName(?:Attribute|Key)|eature(?:Se(?:lector(?:DefaultKey|IdentifierKey|NameKey|SettingKey)|ttingsAttribute)|Type(?:ExclusiveKey|IdentifierKey|NameKey|SelectorsKey)|sAttribute)|ixedAdvanceAttribute|ormatAttribute|ullNameKey)|L(?:anguagesAttribute|icense(?:NameKey|URLNameKey))|Ma(?:cintoshEncodingsAttribute|n(?:ager(?:BundleIdentifier|Error(?:Domain|Font(?:AssetNameKey|DescriptorsKey|URLsKey))|RegisteredFontsChangedNotification)|ufacturerNameKey)|trixAttribute)|NameAttribute|OrientationAttribute|P(?:ostScript(?:CIDNameKey|NameKey)|riorityAttribute)|Registration(?:ScopeAttribute|UserInfoAttribute)|S(?:ampleTextNameKey|izeAttribute|lantTrait|tyleName(?:Attribute|Key)|ubFamilyNameKey|ymbolicTrait)|Tra(?:demarkNameKey|itsAttribute)|U(?:RLAttribute|niqueNameKey)|V(?:ariationA(?:ttribute|xis(?:DefaultValueKey|IdentifierKey|M(?:aximumValueKey|inimumValueKey)|NameKey))|e(?:ndorURLNameKey|rsionNameKey))|W(?:eightTrait|idthTrait))|regroundColor(?:AttributeName|FromContextAttributeName))|rame(?:ClippingPathsAttributeName|P(?:ath(?:ClippingPathAttributeName|FillRuleAttributeName|WidthAttributeName)|rogressionAttributeName)))|GlyphInfoAttributeName|KernAttributeName|LigatureAttributeName|ParagraphStyleAttributeName|RunDelegateAttributeName|S(?:troke(?:ColorAttributeName|WidthAttributeName)|uperscriptAttributeName)|T(?:abColumnTerminatorsAttributeName|ypesetterOptionForcedEmbeddingLevel)|Underline(?:ColorAttributeName|StyleAttributeName)|VerticalFormsAttributeName)|V(?:Buffer(?:MovieTimeKey|NonPropagatedAttachmentsKey|PropagatedAttachmentsKey|Time(?:ScaleKey|ValueKey))|I(?:mageBuffer(?:C(?:GColorSpaceKey|hroma(?:Location(?:BottomFieldKey|TopFieldKey|_(?:Bottom(?:Left)?|Center|DV420|Left|Top(?:Left)?))|Subsampling(?:Key|_4(?:11|2(?:0|2))))|leanAperture(?:H(?:eightKey|orizontalOffsetKey)|Key|VerticalOffsetKey|WidthKey)|olorPrimaries(?:Key|_(?:EBU_3213|ITU_R_709_2|SMPTE_C)))|Display(?:DimensionsKey|HeightKey|WidthKey)|Field(?:CountKey|Detail(?:Key|SpatialFirstLine(?:Early|Late)|Temporal(?:BottomFirst|TopFirst)))|GammaLevelKey|ICCProfileKey|P(?:ixelAspectRatio(?:HorizontalSpacingKey|Key|VerticalSpacingKey)|referredCleanApertureKey)|TransferFunction(?:Key|_(?:ITU_R_709_2|SMPTE_240M_1995|UseGamma))|YCbCrMatrix(?:Key|_(?:ITU_R_(?:601_4|709_2)|SMPTE_240M_1995)))|ndefiniteTime)|Pixel(?:Buffer(?:BytesPerRowAlignmentKey|CG(?:BitmapContextCompatibilityKey|ImageCompatibilityKey)|ExtendedPixels(?:BottomKey|LeftKey|RightKey|TopKey)|HeightKey|IOSurface(?:CoreAnimationCompatibilityKey|OpenGL(?:ES(?:FBOCompatibilityKey|TextureCompatibilityKey)|FBOCompatibilityKey|TextureCompatibilityKey)|PropertiesKey)|MemoryAllocatorKey|OpenGL(?:CompatibilityKey|ES(?:CompatibilityKey|TextureCacheCompatibilityKey))|P(?:ixelFormatTypeKey|laneAlignmentKey|ool(?:AllocationThresholdKey|FreeBufferNotification|M(?:aximumBufferAgeKey|inimumBufferCountKey)))|WidthKey)|Format(?:B(?:itsPerBlock|l(?:ackBlock|ock(?:H(?:eight|orizontalAlignment)|VerticalAlignment|Width)))|C(?:G(?:Bitmap(?:ContextCompatibility|Info)|ImageCompatibility)|o(?:decType|n(?:stant|tainsAlpha)))|F(?:illExtendedPixelsCallback|ourCC)|HorizontalSubsampling|Name|OpenGL(?:Compatibility|ESCompatibility|Format|InternalFormat|Type)|Planes|QDCompatibility|VerticalSubsampling))|ZeroTime)|olorSync(?:A(?:CESCGLinearProfile|dobeRGB1998Profile)|B(?:estQuality|lackPointCompensation)|C(?:ameraDeviceClass|onver(?:sion(?:1DLut|3DLut|BPC|ChannelID|GridPoints|InpChan|Matrix|NDLut|OutChan|ParamCurve(?:0|1|2|3|4))|tQuality)|ustomProfiles)|D(?:CIP3Profile|evice(?:Class|De(?:faultProfileID|scription(?:s)?)|HostScope|ID|ModeDescription(?:s)?|Profile(?:I(?:D|s(?:Current|Default|Factory))|URL|sNotification)|RegisteredNotification|U(?:nregisteredNotification|serScope))|isplay(?:Device(?:Class|ProfilesNotification)|P3Profile)|raftQuality)|F(?:actoryProfiles|ixedPointRange)|Generic(?:CMYKProfile|Gray(?:Gamma22Profile|Profile)|LabProfile|RGBProfile|XYZProfile)|ITUR(?:2020Profile|709Profile)|NormalQuality|Pr(?:eferredCMM|interDeviceClass|ofile(?:C(?:lass|o(?:lorSpace|mputerDomain))|Description|H(?:eader|ostScope)|MD5Digest|PCS|RepositoryChangeNotification|U(?:RL|ser(?:Domain|Scope)))?)|R(?:OMMRGBProfile|e(?:gistrationUpdateWindowServer|nderingIntent(?:Absolute|Perceptual|Relative|Saturation|UseProfileHeader)?))|S(?:RGBProfile|cannerDeviceClass|ig(?:A(?:ToB(?:0Tag|1Tag|2Tag)|bstractClass)|B(?:ToA(?:0Tag|1Tag|2Tag)|lue(?:ColorantTag|TRCTag))|C(?:mykData|o(?:lorSpaceClass|pyrightTag))|D(?:eviceM(?:fgDescTag|odelDescTag)|isplayClass)|G(?:amutTag|r(?:ay(?:Data|TRCTag)|een(?:ColorantTag|TRCTag)))|InputClass|L(?:abData|inkClass)|Media(?:BlackPointTag|WhitePointTag)|NamedColor(?:2Tag|Class)|OutputClass|Pr(?:eview(?:0Tag|1Tag|2Tag)|ofile(?:DescriptionTag|SequenceDescTag))|R(?:ed(?:ColorantTag|TRCTag)|gbData)|TechnologyTag|ViewingCond(?:DescTag|itionsTag)|XYZData))|Transform(?:C(?:odeFragment(?:MD5|Type)|reator)|D(?:eviceTo(?:Device|PCS)|stSpace)|FullConversionData|GamutCheck|Info|P(?:CSTo(?:Device|PCS)|arametricConversionData)|S(?:implifiedConversionData|rcSpace)|Tag)))|D(?:ADiskDescription(?:Bus(?:NameKey|PathKey)|Device(?:GUIDKey|InternalKey|ModelKey|P(?:athKey|rotocolKey)|RevisionKey|TDMLockedKey|UnitKey|VendorKey)|Media(?:B(?:SD(?:M(?:ajorKey|inorKey)|NameKey|UnitKey)|lockSizeKey)|ContentKey|E(?:jectableKey|ncrypt(?:edKey|ionDetailKey))|IconKey|KindKey|LeafKey|NameKey|PathKey|RemovableKey|SizeKey|TypeKey|UUIDKey|W(?:holeKey|ritableKey))|Volume(?:KindKey|MountableKey|N(?:ameKey|etworkKey)|PathKey|TypeKey|UUIDKey))|R(?:A(?:bstractFile|ccessDate|llFilesystems|pplicationIdentifier|ttributeModificationDate|udio(?:FourChannelKey|PreEmphasisKey))|B(?:ackupDate|ibliographicFile|lock(?:Size(?:Key)?|TypeKey)|u(?:fferZone1DataKey|rn(?:AppendableKey|CompletionAction(?:Eject|Key|Mount)|DoubleLayerL0DataZoneBlocksKey|FailureAction(?:Eject|Key|None)|Key|OverwriteDiscKey|RequestedSpeedKey|St(?:atusChangedNotification|rategy(?:BDDAO|CD(?:SAO|TAO)|DVDDAO|IsRequiredKey|Key))|TestingKey|UnderrunProtectionKey|VerifyDiscKey)))|C(?:DText(?:ArrangerKey|C(?:FStringEncodingKey|haracterCodeKey|losedKey|o(?:mposerKey|pyrightAssertedFor(?:NamesKey|SpecialMessagesKey|TitlesKey)))|DiscIdentKey|Genre(?:CodeKey|Key)|Key|LanguageKey|MCNISRCKey|PerformerKey|S(?:izeKey|ongwriterKey|pecialMessageKey)|T(?:OC(?:2Key|Key)|itleKey))|o(?:ntentModificationDate|pyrightFile)|reationDate)|D(?:VD(?:CopyrightInfoKey|TimestampKey)|ata(?:FormKey|Preparer)|e(?:faultDate|vice(?:AppearedNotification|BurnSpeed(?:BD1x|CD1x|DVD1x|HDDVD1x|Max|sKey)|C(?:an(?:TestWrite(?:CDKey|DVDKey)|UnderrunProtect(?:CDKey|DVDKey)|Write(?:BD(?:Key|R(?:EKey|Key))|CD(?:Key|R(?:Key|WKey|awKey)|SAOKey|T(?:AOKey|extKey))|DVD(?:DAOKey|Key|PlusR(?:DoubleLayerKey|Key|W(?:DoubleLayerKey|Key))|R(?:AMKey|DualLayerKey|Key|W(?:DualLayerKey|Key)))|HDDVD(?:Key|R(?:AMKey|DualLayerKey|Key|W(?:DualLayerKey|Key)))|I(?:SRCKey|ndexPointsKey)|Key))|urrentWriteSpeedKey)|DisappearedNotification|FirmwareRevisionKey|I(?:ORegistryEntryPathKey|s(?:BusyKey|TrayOpenKey))|LoadingMechanismCan(?:EjectKey|InjectKey|OpenKey)|M(?:aximumWriteSpeedKey|edia(?:B(?:SDNameKey|locks(?:FreeKey|OverwritableKey|UsedKey))|Class(?:BD|CD|DVD|HDDVD|Key|Unknown)|DoubleLayerL0DataZoneBlocksKey|I(?:nfoKey|s(?:AppendableKey|BlankKey|ErasableKey|OverwritableKey|ReservedKey))|S(?:essionCountKey|tate(?:InTransition|Key|MediaPresent|None))|T(?:rackCountKey|ype(?:BDR(?:E|OM)?|CDR(?:OM|W)?|DVD(?:PlusR(?:DoubleLayer|W(?:DoubleLayer)?)?|R(?:AM|DualLayer|OM|W(?:DualLayer)?)?)|HDDVDR(?:AM|DualLayer|OM|W(?:DualLayer)?)?|Key|Unknown))))|P(?:hysicalInterconnect(?:ATAPI|Fi(?:breChannel|reWire)|Key|Location(?:External|Internal|Key|Unknown)|SCSI|USB)|roductNameKey)|S(?:tatusChangedNotification|upportLevel(?:AppleS(?:hipping|upported)|Key|None|Unsupported|VendorSupported))|Track(?:InfoKey|RefsKey)|VendorNameKey|Write(?:BufferSizeKey|CapabilitiesKey))))|E(?:ffectiveDate|r(?:ase(?:StatusChangedNotification|Type(?:Complete|Key|Quick))|rorStatus(?:AdditionalSenseStringKey|Error(?:InfoStringKey|Key|StringKey)|Key|Sense(?:CodeStringKey|Key)))|xpirationDate)|FreeBlocksKey|HFSPlus(?:CatalogNodeID|TextEncodingHint)?|I(?:SO(?:9660(?:Level(?:One|Two)|VersionNumber)?|Level|MacExtensions|RockRidgeExtensions)|n(?:dexPointsKey|visible))|Joliet|M(?:a(?:c(?:ExtendedFinderFlags|Fi(?:le(?:Creator|Type)|nder(?:Flags|HideExtension))|IconLocation|ScrollPosition|Window(?:Bounds|View))|xBurnSpeedKey)|ediaCatalogNumberKey)|NextWritableAddressKey|P(?:osix(?:FileMode|GID|UID)|reGap(?:IsRequiredKey|LengthKey)|ublisher)|Re(?:cordingDate|fConCFTypeCallbacks)|S(?:CMSCopyright(?:Free|Protected(?:Copy|Original))|e(?:rialCopyManagementStateKey|ssion(?:FormatKey|NumberKey))|tatus(?:Current(?:S(?:essionKey|peedKey)|TrackKey)|EraseTypeKey|P(?:ercentCompleteKey|rogress(?:Current(?:KPS|XFactor)|InfoKey))|State(?:Done|Erasing|F(?:ailed|inishing)|Key|None|Preparing|Session(?:Close|Open)|Track(?:Close|Open|Write)|Verifying)|Total(?:SessionsKey|TracksKey))|u(?:bchannelDataForm(?:Key|None|Pack|Raw)|ppressMacSpecificFiles)|y(?:nchronousBehaviorKey|stemIdentifier))|Track(?:I(?:SRCKey|sEmptyKey)|LengthKey|ModeKey|NumberKey|Packet(?:SizeKey|Type(?:Fixed|Key|Variable))|StartAddressKey|Type(?:Closed|In(?:complete|visible)|Key|Reserved))|UDF(?:ApplicationIdentifierSuffix|ExtendedFilePermissions|InterchangeLevel|Max(?:InterchangeLevel|VolumeSequenceNumber)|PrimaryVolumeDescriptorNumber|RealTimeFile|V(?:ersion1(?:02|50)|olumeSe(?:quenceNumber|t(?:I(?:dentifier|mplementationUse)|Timestamp)))|WriteVersion)?|V(?:erificationType(?:Checksum|Key|None|ProduceAgain|ReceiveData)|olume(?:C(?:heckedDate|reationDate)|E(?:ffectiveDate|xpirationDate)|ModificationDate|Set))))|F(?:CFont(?:CGColorAttribute|Fa(?:ceAttribute|milyAttribute)|NameAttribute|SizeAttribute|VisibleNameAttribute)|ontPanel(?:A(?:TSUFontIDKey|ttribute(?:SizesKey|TagsKey|ValuesKey|sKey))|BackgroundColorAttributeName|Feature(?:SelectorsKey|TypesKey)|MouseTrackingState|Variation(?:AxesKey|ValuesKey)))|HI(?:Delegate(?:AfterKey|BeforeKey)|Object(?:CustomData(?:C(?:DEFProcIDKey|lassIDKey)|DelegateGroupParametersKey|Parameter(?:NamesKey|TypesKey|ValuesKey)|SuperClassIDKey)|InitParam(?:Description|Event(?:Name|Type)|UserName))|T(?:extViewClassID|oolboxVersionNumber)|View(?:MenuContentID|Window(?:C(?:loseBoxID|o(?:llapseBoxID|ntentID))|GrowBoxID|T(?:itleID|oolbar(?:ButtonID|ID))|ZoomBoxID)))|IO(?:MasterPortDefault|Surface(?:AllocSize|BytesPer(?:Element|Row)|CacheMode|Element(?:Height|Width)|Height|Offset|P(?:ixelFormat|lane(?:B(?:ase|ytesPer(?:Element|Row))|Element(?:Height|Width)|Height|Info|Offset|Size|Width))|Width))|JSClassDefinitionEmpty|LSQuarantine(?:Agent(?:BundleIdentifierKey|NameKey)|DataURLKey|OriginURLKey|T(?:imeStampKey|ype(?:CalendarEventAttachment|EmailAttachment|InstantMessageAttachment|Key|Other(?:Attachment|Download)|WebDownload)))|M(?:D(?:Attribute(?:AllValues|DisplayValues|MultiValued|Name|ReadOnlyValues|Type)|ExporterAvaliable|Item(?:A(?:cquisitionM(?:ake|odel)|l(?:bum|titude)|p(?:erture|pl(?:eLoop(?:Descriptors|s(?:KeyFilterType|LoopMode|RootKey))|icationCategories))|ttributeChangeDate|u(?:di(?:ences|o(?:BitRate|ChannelCount|EncodingApplication|SampleRate|TrackNumber))|thor(?:Addresses|EmailAddresses|s)))|BitsPerSample|C(?:FBundleIdentifier|ameraOwner|ity|o(?:decs|lorSpace|m(?:ment|poser)|nt(?:actKeywords|ent(?:CreationDate|ModificationDate|Type(?:Tree)?)|ributors)|pyright|untry|verage)|reator)|D(?:ateAdded|e(?:liveryType|scription)|i(?:rector|splayName)|ownloadedDate|u(?:eDate|rationSeconds))|E(?:XIF(?:GPSVersion|Version)|ditors|mailAddresses|ncodingApplications|x(?:ecutable(?:Architectures|Platform)|posure(?:Mode|Program|TimeS(?:econds|tring))))|F(?:Number|S(?:C(?:ontentChangeDate|reationDate)|HasCustomIcon|I(?:nvisible|s(?:ExtensionHidden|Stationery))|Label|N(?:ame|odeCount)|Owner(?:GroupID|UserID)|Size)|inderComment|lashOnOff|o(?:calLength(?:35mm)?|nts))|G(?:PS(?:AreaInformation|D(?:OP|ateStamp|est(?:Bearing|Distance|L(?:atitude|ongitude))|ifferental)|M(?:apDatum|easureMode)|ProcessingMethod|Status|Track)|enre)|H(?:asAlphaChannel|eadline)|I(?:SOSpeed|dentifier|mageDirection|n(?:formation|st(?:antMessageAddresses|ructions))|s(?:ApplicationManaged|GeneralMIDISequence|LikelyJunk))|K(?:ey(?:Signature|words)|ind)|L(?:a(?:nguages|stUsedDate|titude|yerNames)|ensModel|ongitude|yricist)|M(?:axAperture|e(?:diaTypes|teringMode)|usical(?:Genre|Instrument(?:Category|Name)))|N(?:amedLocation|umberOfPages)|Or(?:ganizations|i(?:entation|ginal(?:Format|Source)))|P(?:a(?:ge(?:Height|Width)|rticipants|th)|erformers|honeNumbers|ixel(?:Count|Height|Width)|ro(?:ducer|fileName|jects)|ublishers)|R(?:e(?:c(?:ipient(?:Addresses|EmailAddresses|s)|ording(?:Date|Year))|dEyeOnOff|solution(?:HeightDPI|WidthDPI))|ights)|S(?:ecurityMethod|peed|t(?:a(?:rRating|teOrProvince)|reamable)|ubject)|T(?:e(?:mpo|xtContent)|heme|i(?:me(?:Signature|stamp)|tle)|otalBitRate)|URL|V(?:ersion|ideoBitRate)|Wh(?:ereFroms|iteBalance))|Label(?:AddedNotification|BundleURL|C(?:hangedNotification|ontentChangeDate)|DisplayName|I(?:con(?:Data|UUID)|sMutuallyExclusiveSetMember)|Kind(?:IsMutuallyExclusiveSetKey|VisibilityKey)?|RemovedNotification|SetsFinderColor|UUID|Visibility)|P(?:rivateVisibility|ublicVisibility)|Query(?:Did(?:FinishNotification|UpdateNotification)|ProgressNotification|ResultContentRelevance|Scope(?:AllIndexed|Computer(?:Indexed)?|Home|Network(?:Indexed)?)|Update(?:AddedItems|ChangedItems|RemovedItems)))|IDI(?:ObjectType_ExternalMask|Property(?:AdvanceScheduleTimeMuSec|C(?:anRoute|onnectionUniqueID)|D(?:eviceID|isplayName|river(?:DeviceEditorApp|Owner|Version))|I(?:mage|s(?:Broadcast|DrumMachine|E(?:ffectUnit|mbeddedEntity)|Mixer|Sampler))|M(?:a(?:nufacturer|x(?:ReceiveChannels|SysExSpeed|TransmitChannels))|odel)|Name|Offline|P(?:anDisruptsStereo|rivate)|Receive(?:Channels|s(?:BankSelect(?:LSB|MSB)|Clock|MTC|Notes|ProgramChanges))|S(?:ingleRealtimeEntity|upports(?:GeneralMIDI|MMC|ShowControl))|Transmit(?:Channels|s(?:BankSelect(?:LSB|MSB)|Clock|MTC|Notes|ProgramChanges))|UniqueID)))|QL(?:PreviewPropertyTextEncodingNameKey|ThumbnailOption(?:IconModeKey|ScaleFactorKey))|S(?:C(?:BondStatusDevice(?:AggregationStatus|Collecting|Distributing)|Comp(?:AnyRegex|Global|HostNames|Interface|Network|S(?:ervice|ystem)|Users)|DynamicStore(?:Domain(?:File|P(?:lugin|refs)|S(?:etup|tate))|Prop(?:Net(?:Interfaces|Primary(?:Interface|Service)|ServiceIDs)|Setup(?:CurrentSet|LastUpdated))|UseSessionKeys)|Ent(?:Net(?:6to4|AirPort|D(?:HCP|NS)|Ethernet|FireWire|I(?:P(?:Sec|v(?:4|6))|nterface)|L(?:2TP|ink)|Modem|P(?:PP(?:Serial|oE)?|roxies)|SMB)|UsersConsoleUser)|Network(?:Interface(?:IPv4|Type(?:6to4|B(?:luetooth|ond)|Ethernet|FireWire|I(?:EEE80211|P(?:Sec|v4)|rDA)|L2TP|Modem|PPP|Serial|VLAN|WWAN))|ProtocolType(?:DNS|IPv(?:4|6)|Proxies|SMB))|Pr(?:ef(?:CurrentSet|NetworkServices|S(?:ets|ystem))|op(?:InterfaceName|MACAddress|Net(?:6to4Relay|DNS(?:DomainName|Options|S(?:e(?:arch(?:Domains|Order)|rver(?:Addresses|Port|Timeout))|ortList|upplementalMatch(?:Domains|Orders)))|EthernetM(?:TU|edia(?:Options|SubType))|I(?:P(?:Sec(?:AuthenticationMethod|ConnectTime|Local(?:Certificate|Identifier(?:Type)?)|RemoteAddress|S(?:haredSecret(?:Encryption)?|tatus)|XAuth(?:Enabled|Name|Password(?:Encryption)?))|v(?:4(?:Addresses|BroadcastAddresses|ConfigMethod|D(?:HCPClientID|estAddresses)|Router|SubnetMasks)|6(?:Addresses|ConfigMethod|DestAddresses|Flags|PrefixLength|Router)))|nterface(?:DeviceName|Hardware|SubType|Type|s))|L(?:2TP(?:IPSecSharedSecret(?:Encryption)?|Transport)|ink(?:Active|Detaching)|ocalHostName)|Modem(?:AccessPointName|Connect(?:Speed|ion(?:Personality|Script))|D(?:ataCompression|evice(?:ContextID|Model|Vendor)|ialMode)|ErrorCorrection|Hold(?:CallWaitingAudibleAlert|DisconnectOnAnswer|Enabled|Reminder(?:Time)?)|Note|PulseDial|Spe(?:aker|ed))|OverridePrimary|P(?:PP(?:A(?:CSPEnabled|uth(?:Name|P(?:assword(?:Encryption)?|ro(?:mpt|tocol))))|C(?:CP(?:Enabled|MPPE(?:128Enabled|40Enabled))|o(?:mm(?:AlternateRemoteAddress|ConnectDelay|DisplayTerminalWindow|Re(?:dial(?:Count|Enabled|Interval)|moteAddress)|TerminalScript|UseTerminalScript)|nnectTime))|D(?:eviceLastCause|i(?:alOnDemand|sconnect(?:On(?:FastUserSwitch|Idle(?:Timer)?|Logout|Sleep)|Time)))|I(?:PCP(?:CompressionVJ|UsePeerDNS)|dleReminder(?:Timer)?)|L(?:CP(?:Compression(?:ACField|PField)|Echo(?:Enabled|Failure|Interval)|M(?:RU|TU)|ReceiveACCM|TransmitACCM)|astCause|ogfile)|OverridePrimary|RetryConnectTime|S(?:essionTimer|tatus)|UseSessionTimer|VerboseLogging)|roxies(?:Exc(?:eptionsList|ludeSimpleHostnames)|FTP(?:Enable|P(?:assive|ort|roxy))|Gopher(?:Enable|P(?:ort|roxy))|HTTP(?:Enable|P(?:ort|roxy)|S(?:Enable|P(?:ort|roxy)))|ProxyAuto(?:Config(?:Enable|JavaScript|URLString)|DiscoveryEnable)|RTSP(?:Enable|P(?:ort|roxy))|SOCKS(?:Enable|P(?:ort|roxy))))|S(?:MB(?:NetBIOSN(?:ame|odeType)|W(?:INSAddresses|orkgroup))|erviceOrder))|SystemComputerName(?:Encoding)?|UserDefinedName|Version))|Resv(?:Inactive|Link)|ValNet(?:I(?:P(?:Sec(?:AuthenticationMethod(?:Certificate|Hybrid|SharedSecret)|LocalIdentifierTypeKeyID|SharedSecretEncryptionKeychain|XAuthPasswordEncryption(?:Keychain|Prompt))|v(?:4ConfigMethod(?:Automatic|BOOTP|DHCP|INFORM|LinkLocal|Manual|PPP)|6ConfigMethod(?:6to4|Automatic|LinkLocal|Manual|RouterAdvertisement)))|nterface(?:SubType(?:L2TP|PPP(?:Serial|oE))|Type(?:6to4|Ethernet|FireWire|IPSec|PPP)))|L2TP(?:IPSecSharedSecretEncryptionKeychain|TransportIP(?:Sec)?)|ModemDialMode(?:IgnoreDialTone|Manual|WaitForDialTone)|PPPAuthP(?:asswordEncryption(?:Keychain|Token)|ro(?:mpt(?:After|Before)|tocol(?:CHAP|EAP|MSCHAP(?:1|2)|PAP)))|SMBNetBIOSNodeType(?:Broadcast|Hybrid|Mixed|Peer)))|K(?:EndTermChars|M(?:aximumTerms|inTermLength)|ProximityIndexing|S(?:t(?:artTermChars|opWords)|ubstitutions)|TermChars)|ec(?:A(?:CLAuthorization(?:Any|De(?:crypt|lete|rive)|E(?:ncrypt|xport(?:Clear|Wrapped))|GenKey|Import(?:Clear|Wrapped)|Keychain(?:Create|Delete|Item(?:Delete|Insert|Modify|Read))|Login|MAC|Sign)|ttr(?:A(?:cc(?:ess|ount)|pplication(?:Label|Tag)|uthenticationType(?:D(?:PA|efault)|HT(?:MLForm|TP(?:Basic|Digest))|MSN|NTLM|RPA)?)|C(?:an(?:De(?:crypt|rive)|Encrypt|Sign|Unwrap|Verify|Wrap)|ertificate(?:Encoding|Type)|omment|reat(?:ionDate|or))|Description|EffectiveKeySize|Generic|Is(?:Extractable|Invisible|Negative|Permanent|Sensitive|suer)|Key(?:Class(?:P(?:rivate|ublic)|Symmetric)?|SizeInBits|Type(?:3DES|AES|CAST|D(?:ES|SA)|ECDSA|R(?:C(?:2|4)|SA))?)|Label|ModificationDate|P(?:RF(?:HmacAlgSHA(?:1|2(?:24|56)|384|512))?|ath|ort|rotocol(?:A(?:FP|ppleTalk)|DAAP|EPPC|FTP(?:Account|Proxy|S)?|HTTP(?:Proxy|S(?:Proxy)?)?|I(?:MAP(?:S)?|PP|RC(?:S)?)|LDAP(?:S)?|NNTP(?:S)?|POP3(?:S)?|RTSP(?:Proxy)?|S(?:M(?:B|TP)|OCKS|SH)|Telnet(?:S)?)?|ublicKeyHash)|Rounds|S(?:alt|e(?:curityDomain|r(?:ialNumber|v(?:er|ice)))|ubject(?:KeyID)?)|Type))|Base(?:32Encoding|64Encoding)|C(?:FError(?:Architecture|GuestAttributes|InfoPlist|Pat(?:h|tern)|Re(?:quirementSyntax|source(?:A(?:dded|ltered)|Missing|S(?:eal|ideband))))|lass(?:Certificate|GenericPassword|I(?:dentity|nternetPassword)|Key)?|o(?:de(?:Attribute(?:Architecture|BundleVersion|Subarchitecture|UniversalFileOffset)|Info(?:C(?:MS|dHashes|ertificates|hangedFiles)|D(?:esignatedRequirement|igestAlgorithm(?:s)?)|Entitlements(?:Dict)?|F(?:lags|ormat)|I(?:dentifier|mplicitDesignatedRequirement)|MainExecutable|P(?:List|latformIdentifier)|R(?:equirement(?:Data|s)|untimeVersion)|S(?:ource|tatus)|T(?:eamIdentifier|ime(?:stamp)?|rust)|Unique))|mpressionRatio))|D(?:ecodeTypeAttribute|igest(?:HMAC(?:KeyAttribute|MD5|SHA(?:1|2))|LengthAttribute|MD(?:2|4|5)|SHA(?:1|2)|TypeAttribute))|Enc(?:ode(?:LineLengthAttribute|TypeAttribute)|rypt(?:Key|ionMode))|GuestAttribute(?:A(?:rchitecture|udit)|Canonical|DynamicCode(?:InfoPlist)?|Hash|MachPort|Pid|Subarchitecture)|I(?:VKey|dentityDomain(?:Default|KerberosKDC)|mport(?:Export(?:Access|Keychain|Passphrase)|Item(?:CertChain|Identity|KeyID|Label|Trust))|nputIs(?:AttributeName|Digest|PlainText|Raw))|KeyAttributeName|LineLength(?:64|76)|M(?:atch(?:CaseInsensitive|DiacriticInsensitive|EmailAddressIfPresent|I(?:ssuers|temList)|Limit(?:All|One)?|Policy|S(?:earchList|ubject(?:Contains|EndsWith|StartsWith|WholeString))|TrustedOnly|ValidOnDate|WidthInsensitive)|ode(?:C(?:BCKey|FBKey)|ECBKey|NoneKey|OFBKey))|OID(?:A(?:DC_CERT_POLICY|PPLE_(?:CERT_POLICY|E(?:KU_(?:CODE_SIGNING(?:_DEV)?|ICHAT_(?:ENCRYPTION|SIGNING)|RESOURCE_SIGNING|SYSTEM_IDENTITY)|XTENSION(?:_(?:A(?:AI_INTERMEDIATE|DC_(?:APPLE_SIGNING|DEV_SIGNING)|PPLE(?:ID_INTERMEDIATE|_SIGNING))|CODE_SIGNING|I(?:NTERMEDIATE_MARKER|TMS_INTERMEDIATE)|WWDR_INTERMEDIATE))?))|uthority(?:InfoAccess|KeyIdentifier))|B(?:asicConstraints|iometricInfo)|C(?:SSMKeyStruct|ert(?:Issuer|ificatePolicies)|lientAuth|o(?:llectiveSt(?:ateProvinceName|reetAddress)|mmonName|untryName)|rl(?:DistributionPoints|Number|Reason))|D(?:OTMAC_CERT_(?:E(?:MAIL_(?:ENCRYPT|SIGN)|XTENSION)|IDENTITY|POLICY)|e(?:ltaCrlIndicator|scription))|E(?:KU_IPSec|mail(?:Address|Protection)|xtended(?:KeyUsage(?:Any)?|UseCodeSigning))|GivenName|HoldInstructionCode|I(?:nvalidityDate|ssu(?:erAltName|ingDistributionPoint(?:s)?))|K(?:ERBv5_PKINIT_KP_(?:CLIENT_AUTH|KDC)|eyUsage)|LocalityName|M(?:S_NTPrincipalName|icrosoftSGC)|N(?:ameConstraints|etscape(?:Cert(?:Sequence|Type)|SGC))|O(?:CSPSigning|rganization(?:Name|alUnitName))|P(?:olicy(?:Constraints|Mappings)|rivateKeyUsagePeriod)|QC_Statements|S(?:er(?:ialNumber|verAuth)|t(?:ateProvinceName|reetAddress)|u(?:bject(?:AltName|DirectoryAttributes|EmailAddress|InfoAccess|KeyIdentifier|Picture|SignatureBitmap)|rname))|Ti(?:meStamping|tle)|UseExemptions|X509V(?:1(?:Certificate(?:IssuerUniqueId|SubjectUniqueId)|IssuerName(?:CStruct|LDAP|Std)?|S(?:erialNumber|ignature(?:Algorithm(?:Parameters|TBS)?|CStruct|Struct)?|ubject(?:Name(?:CStruct|LDAP|Std)?|PublicKey(?:Algorithm(?:Parameters)?|CStruct)?))|V(?:alidityNot(?:After|Before)|ersion))|3(?:Certificate(?:CStruct|Extension(?:C(?:Struct|ritical)|Id|Struct|Type|Value|s(?:CStruct|Struct))|NumberOfExtensions)?|SignedCertificate(?:CStruct)?)))|P(?:adding(?:Key|NoneKey|PKCS(?:1Key|5Key|7Key))|olicy(?:Apple(?:CodeSigning|EAP|I(?:DValidation|Psec)|PKINIT(?:Client|Server)|S(?:MIME|SL)|X509Basic)|Client|KU_(?:CRLSign|D(?:ataEncipherment|ecipherOnly|igitalSignature)|EncipherOnly|Key(?:Agreement|CertSign|Encipherment)|NonRepudiation)|MacAppStoreReceipt|Name|Oid)|roperty(?:Key(?:L(?:abel|ocalizedLabel)|Type|Value)|Type(?:Dat(?:a|e)|Error|S(?:ection|tring|uccess)|Title|URL|Warning)))|R(?:andomDefault|eturn(?:Attributes|Data|PersistentRef|Ref))|S(?:haredPassword|ignatureAttributeName)|Transform(?:A(?:bort(?:AttributeName|OriginatorKey)|ction(?:Attribute(?:Notification|Validation)|CanExecute|ExternalizeExtraData|Finalize|InternalizeExtraData|ProcessData|StartingExecution))|DebugAttributeName|ErrorDomain|InputAttributeName|OutputAttributeName|PreviousErrorKey|TransformName)|Use(?:ItemList|Keychain)|Value(?:Data|PersistentRef|Ref)|ZLibEncoding)|peech(?:Audio(?:GraphProperty|UnitProperty)|C(?:haracterModeProperty|ommand(?:DelimiterProperty|Prefix|Suffix)|urrentVoiceProperty)|Dictionary(?:Abbreviations|Entry(?:Phonemes|Spelling)|LocaleIdentifier|ModificationDate|Pronunciations)|Error(?:C(?:FCallBack|allback(?:CharacterOffset|SpokenString)|ount)|Newest(?:CharacterOffset)?|Oldest(?:CharacterOffset)?|sProperty)|InputModeProperty|Mode(?:Literal|Normal|Phoneme|T(?:ext|une))|N(?:o(?:EndingProsody|SpeechInterrupt)|umberModeProperty)|OutputTo(?:AudioDeviceProperty|ExtAudioFileProperty|FileURLProperty)|P(?:honeme(?:CallBack|Info(?:Example|Hilite(?:End|Start)|Opcode|Symbol)|OptionsProperty|SymbolsProperty)|itch(?:BaseProperty|ModProperty)|reflightThenPause)|R(?:ateProperty|e(?:centSyncProperty|fConProperty|setProperty))|S(?:peechDoneCallBack|tatus(?:NumberOfCharactersLeft|Output(?:Busy|Paused)|P(?:honemeCode|roperty))|yn(?:cCallBack|thesizerInfo(?:Identifier|Manufacturer|Property|Version)))|TextDoneCallBack|Vo(?:ice(?:Creator|ID)|lumeProperty)|WordCFCallBack))|T(?:IS(?:Category(?:InkInputSource|KeyboardInputSource|PaletteInputSource)|Notify(?:EnabledKeyboardInputSourcesChanged|SelectedKeyboardInputSourceChanged)|Property(?:BundleID|I(?:con(?:ImageURL|Ref)|nput(?:ModeID|Source(?:Category|I(?:D|s(?:ASCIICapable|Enable(?:Capable|d)|Select(?:Capable|ed)))|Languages|Type)))|LocalizedName|UnicodeKeyLayoutData)|Type(?:CharacterPalette|Ink|Keyboard(?:InputM(?:ethod(?:ModeEnabled|WithoutModes)|ode)|Layout|Viewer)))|XN(?:Action(?:Align(?:Center|Left|Right)|C(?:hange(?:Color|Font(?:Feature|Variation)?|GlyphVariation|S(?:ize|tyle)|TextPosition)|lear|ountOf(?:AllChanges|StyleChanges|TextChanges)|ut)|Drop|Move|Paste|Typing|UndoLast)|D(?:ataOption(?:CharacterEncodingKey|DocumentTypeKey)|ocumentAttribute(?:AuthorKey|C(?:o(?:m(?:mentKey|panyNameKey)|pyrightKey)|reationTimeKey)|EditorKey|KeywordsKey|ModificationTimeKey|SubjectKey|TitleKey))|MLTEDocumentType|PlainTextDocumentType|QuickTimeDocumentType|RTFDocumentType))|UT(?:ExportedTypeDeclarationsKey|ImportedTypeDeclarationsKey|T(?:agClass(?:FilenameExtension|MIMEType|NSPboardType|OSType)|ype(?:A(?:lias(?:File|Record)|ppl(?:e(?:ICNS|ProtectedMPEG4Audio)|ication(?:Bundle|File)?)|rchive|udio(?:visualContent)?)|B(?:MP|undle)|C(?:Header|PlusPlus(?:Header|Source)|Source|o(?:mpositeContent|n(?:formsToKey|t(?:act|ent))))|D(?:ata(?:base)?|escriptionKey|i(?:rectory|skImage))|Executable|F(?:ileURL|latRTFD|older|ramework)|GIF|HTML|I(?:CO|conFileKey|dentifierKey|mage|nkText|tem)|J(?:PEG(?:2000)?|avaSource)|M(?:P(?:3|EG(?:4(?:Audio)?)?)|essage|o(?:untPoint|vie))|ObjectiveC(?:PlusPlusSource|Source)|P(?:DF|ICT|NG|ackage|lainText)|QuickTime(?:Image|Movie)|R(?:TF(?:D)?|e(?:ferenceURLKey|solvable))|S(?:ourceCode|ymLink)|T(?:IFF|XNTextAndMultimediaData|agSpecificationKey|ext)|U(?:RL|TF(?:16(?:ExternalPlainText|PlainText)|8PlainText))|V(?:Card|ersionKey|ideo|olume)|WebArchive|XML))))|mach_task_self_|oid(?:A(?:d(?:CAIssuer|OCSP)|n(?:sip(?:384r1|521r1)|y(?:ExtendedKeyUsage|Policy))|uthority(?:InfoAccess|KeyIdentifier))|BasicConstraints|C(?:ertificatePolicies|o(?:mmonName|untryName)|rlDistributionPoints)|Description|E(?:cP(?:rime(?:192v1|256v1)|ubKey)|mailAddress|ntrustVersInfo|xtendedKeyUsage(?:C(?:lientAuth|odeSigning)|EmailProtection|IPSec|MicrosoftSGC|NetscapeSGC|OCSPSigning|ServerAuth|TimeStamping)?)|F(?:ee|riendlyName)|Google(?:EmbeddedSignedCertificateTimestamp|OCSPSignedCertificateTimestamp)|I(?:nhibitAnyPolicy|ssuerAltName)|KeyUsage|Local(?:KeyId|ityName)|M(?:SNTPrincipalName|d(?:2(?:Rsa)?|4(?:Rsa)?|5(?:Fee|Rsa)?))|N(?:ameConstraints|etscapeCertType)|Organization(?:Name|alUnitName)|P(?:olicy(?:Constraints|Mappings)|rivateKeyUsagePeriod)|Qt(?:Cps|UNotice)|Rsa|S(?:ha(?:1(?:Dsa(?:CommonOIW|OIW)?|Ecdsa|Fee|Rsa(?:OIW)?)?|2(?:24(?:Ecdsa|Rsa)?|56(?:Ecdsa|Rsa)?)|384(?:Ecdsa|Rsa)?|512(?:Ecdsa|Rsa)?)|tateOrProvinceName|ubject(?:AltName|InfoAccess|KeyIdentifier)))|v(?:m_page_(?:mask|s(?:hift|ize))|printf_stderr_func))\\b", + "name": "support.variable.c" }, { "match": "\\bkCF(?:Islamic(?:TabularCalendar|UmmAlQuraCalendar)|URL(?:AddedToDirectoryDateKey|DocumentIdentifierKey|GenerationIdentifierKey|QuarantinePropertiesKey))\\b", @@ -133,6 +349,10 @@ "match": "\\bkCFURL(?:CanonicalPathKey|Volume(?:Is(?:EncryptedKey|RootFileSystemKey)|Supports(?:CompressionKey|ExclusiveRenamingKey|FileCloningKey|SwapRenamingKey)))\\b", "name": "support.variable.cf.10.12.c" }, + { + "match": "\\bkCF(?:ErrorLocalizedFailureKey|URLVolume(?:AvailableCapacityFor(?:ImportantUsageKey|OpportunisticUsageKey)|Supports(?:AccessPermissionsKey|ImmutableFilesKey)))\\b", + "name": "support.variable.cf.10.13.c" + }, { "match": "\\bkCFURL(?:IsExcludedFromBackupKey|PathKey)\\b", "name": "support.variable.cf.10.8.c" @@ -142,7 +362,7 @@ "name": "support.variable.cf.10.9.c" }, { - "match": "\\bkCF(?:A(?:bsoluteTimeIntervalSince19(?:04|70)|llocator(?:Default|Malloc(?:Zone)?|Null|SystemDefault|UseContext))|B(?:oolean(?:False|True)|u(?:ddhistCalendar|ndle(?:DevelopmentRegionKey|ExecutableKey|I(?:dentifierKey|nfoDictionaryVersionKey)|LocalizationsKey|NameKey|VersionKey)))|C(?:hineseCalendar|o(?:pyString(?:BagCallBacks|DictionaryKeyCallBacks|SetCallBacks)|reFoundationVersionNumber))|DateFormatter(?:AMSymbol|Calendar(?:Name)?|D(?:efault(?:Date|Format)|oesRelativeDateFormattingKey)|EraSymbols|GregorianStartDate|IsLenient|LongEraSymbols|MonthSymbols|PMSymbol|QuarterSymbols|S(?:hort(?:MonthSymbols|QuarterSymbols|Standalone(?:MonthSymbols|QuarterSymbols|WeekdaySymbols)|WeekdaySymbols)|tandalone(?:MonthSymbols|QuarterSymbols|WeekdaySymbols))|T(?:imeZone|woDigitStartDate)|VeryShort(?:MonthSymbols|Standalone(?:MonthSymbols|WeekdaySymbols)|WeekdaySymbols)|WeekdaySymbols)|Error(?:D(?:escriptionKey|omain(?:Cocoa|Mach|OSStatus|POSIX))|FilePathKey|Localized(?:DescriptionKey|FailureReasonKey|RecoverySuggestionKey)|U(?:RLKey|nderlyingErrorKey))|GregorianCalendar|HebrewCalendar|I(?:SO8601Calendar|ndianCalendar|slamicC(?:alendar|ivilCalendar))|JapaneseCalendar|Locale(?:AlternateQuotation(?:BeginDelimiterKey|EndDelimiterKey)|C(?:alendar(?:Identifier)?|o(?:llat(?:ionIdentifier|orIdentifier)|untryCode)|urren(?:cy(?:Code|Symbol)|tLocaleDidChangeNotification))|DecimalSeparator|ExemplarCharacterSet|GroupingSeparator|Identifier|LanguageCode|MeasurementSystem|Quotation(?:BeginDelimiterKey|EndDelimiterKey)|ScriptCode|UsesMetricSystem|VariantCode)|N(?:otFound|u(?:ll|mber(?:Formatter(?:AlwaysShowDecimalSeparator|Currency(?:Code|DecimalSeparator|GroupingSeparator|Symbol)|De(?:cimalSeparator|faultFormat)|ExponentSymbol|FormatWidth|GroupingS(?:eparator|ize)|I(?:n(?:finitySymbol|ternationalCurrencySymbol)|sLenient)|M(?:ax(?:FractionDigits|IntegerDigits|SignificantDigits)|in(?:FractionDigits|IntegerDigits|SignificantDigits|usSign)|ultiplier)|N(?:aNSymbol|egative(?:Prefix|Suffix))|P(?:adding(?:Character|Position)|er(?:MillSymbol|centSymbol)|lusSign|ositive(?:Prefix|Suffix))|Rounding(?:Increment|Mode)|SecondaryGroupingSize|Use(?:GroupingSeparator|SignificantDigits)|ZeroSymbol)|N(?:aN|egativeInfinity)|PositiveInfinity)))|P(?:ersianCalendar|lugIn(?:DynamicRegist(?:erFunctionKey|rationKey)|FactoriesKey|TypesKey|UnloadFunctionKey)|references(?:Any(?:Application|Host|User)|Current(?:Application|Host|User)))|R(?:epublicOfChinaCalendar|unLoop(?:CommonModes|DefaultMode))|S(?:ocket(?:CommandKey|ErrorKey|NameKey|Re(?:gisterCommand|sultKey|trieveCommand)|ValueKey)|tr(?:eamProperty(?:AppendToFile|DataWritten|FileCurrentOffset|Socket(?:NativeHandle|Remote(?:HostName|PortNumber)))|ing(?:BinaryHeapCallBacks|Transform(?:FullwidthHalfwidth|HiraganaKatakana|Latin(?:Arabic|Cyrillic|Greek|H(?:angul|ebrew|iragana)|Katakana|Thai)|MandarinLatin|Strip(?:CombiningMarks|Diacritics)|To(?:Latin|UnicodeName|XMLHex)))))|T(?:imeZoneSystemTimeZoneDidChangeNotification|ype(?:ArrayCallBacks|BagCallBacks|Dictionary(?:KeyCallBacks|ValueCallBacks)|SetCallBacks))|U(?:RL(?:AttributeModificationDateKey|C(?:ontent(?:AccessDateKey|ModificationDateKey)|reationDateKey)|File(?:AllocatedSizeKey|Protection(?:Complete(?:Un(?:lessOpen|tilFirstUserAuthentication))?|Key|None)|Resource(?:IdentifierKey|Type(?:BlockSpecial|CharacterSpecial|Directory|Key|NamedPipe|Regular|S(?:ocket|ymbolicLink)|Unknown))|S(?:ecurityKey|izeKey))|HasHiddenExtensionKey|Is(?:AliasFileKey|DirectoryKey|ExecutableKey|HiddenKey|MountTriggerKey|PackageKey|Re(?:adableKey|gularFileKey)|Sy(?:mbolicLinkKey|stemImmutableKey)|U(?:biquitousItemKey|serImmutableKey)|VolumeKey|WritableKey)|KeysOfUnsetValuesKey|L(?:abelNumberKey|inkCountKey|ocalized(?:LabelKey|NameKey|TypeDescriptionKey))|NameKey|P(?:arentDirectoryURLKey|referredIOBlockSizeKey)|T(?:otalFile(?:AllocatedSizeKey|SizeKey)|ypeIdentifierKey)|UbiquitousItem(?:HasUnresolvedConflictsKey|Is(?:DownloadingKey|Upload(?:edKey|ingKey)))|Volume(?:AvailableCapacityKey|CreationDateKey|I(?:dentifierKey|s(?:AutomountedKey|BrowsableKey|EjectableKey|InternalKey|JournalingKey|LocalKey|Re(?:adOnlyKey|movableKey)))|Localized(?:FormatDescriptionKey|NameKey)|MaximumFileSizeKey|NameKey|ResourceCountKey|Supports(?:AdvisoryFileLockingKey|Case(?:PreservedNamesKey|SensitiveNamesKey)|ExtendedSecurityKey|HardLinksKey|JournalingKey|PersistentIDsKey|R(?:enamingKey|ootDirectoryDatesKey)|S(?:parseFilesKey|ymbolicLinksKey)|VolumeSizesKey|ZeroRunsKey)|TotalCapacityKey|U(?:RL(?:ForRemountingKey|Key)|UIDStringKey)))|serNotification(?:Al(?:ert(?:HeaderKey|MessageKey)|ternateButtonTitleKey)|CheckBoxTitlesKey|DefaultButtonTitleKey|IconURLKey|LocalizationURLKey|OtherButtonTitleKey|P(?:opUp(?:SelectionKey|TitlesKey)|rogressIndicatorValueKey)|SoundURLKey|TextField(?:TitlesKey|ValuesKey)))|XMLTreeError(?:Description|L(?:ineNumber|ocation)|StatusCode))\\b", + "match": "\\bkCF(?:A(?:bsoluteTimeIntervalSince19(?:04|70)|llocator(?:Default|Malloc(?:Zone)?|Null|SystemDefault|UseContext))|B(?:oolean(?:False|True)|u(?:ddhistCalendar|ndle(?:DevelopmentRegionKey|ExecutableKey|I(?:dentifierKey|nfoDictionaryVersionKey)|LocalizationsKey|NameKey|VersionKey)))|C(?:hineseCalendar|o(?:pyString(?:BagCallBacks|DictionaryKeyCallBacks|SetCallBacks)|reFoundationVersionNumber))|DateFormatter(?:AMSymbol|Calendar(?:Name)?|D(?:efault(?:Date|Format)|oesRelativeDateFormattingKey)|EraSymbols|GregorianStartDate|IsLenient|LongEraSymbols|MonthSymbols|PMSymbol|QuarterSymbols|S(?:hort(?:MonthSymbols|QuarterSymbols|Standalone(?:MonthSymbols|QuarterSymbols|WeekdaySymbols)|WeekdaySymbols)|tandalone(?:MonthSymbols|QuarterSymbols|WeekdaySymbols))|T(?:imeZone|woDigitStartDate)|VeryShort(?:MonthSymbols|Standalone(?:MonthSymbols|WeekdaySymbols)|WeekdaySymbols)|WeekdaySymbols)|Error(?:D(?:escriptionKey|omain(?:Cocoa|Mach|OSStatus|POSIX))|FilePathKey|Localized(?:DescriptionKey|FailureReasonKey|RecoverySuggestionKey)|U(?:RLKey|nderlyingErrorKey))|GregorianCalendar|HebrewCalendar|I(?:SO8601Calendar|ndianCalendar|slamicC(?:alendar|ivilCalendar))|JapaneseCalendar|Locale(?:AlternateQuotation(?:BeginDelimiterKey|EndDelimiterKey)|C(?:alendar(?:Identifier)?|o(?:llat(?:ionIdentifier|orIdentifier)|untryCode)|urren(?:cy(?:Code|Symbol)|tLocaleDidChangeNotification))|DecimalSeparator|ExemplarCharacterSet|GroupingSeparator|Identifier|LanguageCode|MeasurementSystem|Quotation(?:BeginDelimiterKey|EndDelimiterKey)|ScriptCode|UsesMetricSystem|VariantCode)|N(?:otFound|u(?:ll|mber(?:Formatter(?:AlwaysShowDecimalSeparator|Currency(?:Code|DecimalSeparator|GroupingSeparator|Symbol)|De(?:cimalSeparator|faultFormat)|ExponentSymbol|FormatWidth|GroupingS(?:eparator|ize)|I(?:n(?:finitySymbol|ternationalCurrencySymbol)|sLenient)|M(?:ax(?:FractionDigits|IntegerDigits|SignificantDigits)|in(?:FractionDigits|IntegerDigits|SignificantDigits|usSign)|ultiplier)|N(?:aNSymbol|egative(?:Prefix|Suffix))|P(?:adding(?:Character|Position)|er(?:MillSymbol|centSymbol)|lusSign|ositive(?:Prefix|Suffix))|Rounding(?:Increment|Mode)|SecondaryGroupingSize|Use(?:GroupingSeparator|SignificantDigits)|ZeroSymbol)|N(?:aN|egativeInfinity)|PositiveInfinity)))|P(?:ersianCalendar|lugIn(?:DynamicRegist(?:erFunctionKey|rationKey)|FactoriesKey|TypesKey|UnloadFunctionKey)|references(?:Any(?:Application|Host|User)|Current(?:Application|Host|User)))|R(?:epublicOfChinaCalendar|unLoop(?:CommonModes|DefaultMode))|S(?:ocket(?:CommandKey|ErrorKey|NameKey|Re(?:gisterCommand|sultKey|trieveCommand)|ValueKey)|tr(?:eam(?:ErrorDomainS(?:OCKS|SL)|Property(?:AppendToFile|DataWritten|FileCurrentOffset|S(?:OCKS(?:P(?:assword|roxy(?:Host|Port)?)|User|Version)|houldCloseNativeSocket|ocket(?:NativeHandle|Remote(?:HostName|PortNumber)|SecurityLevel)))|SocketS(?:OCKSVersion(?:4|5)|ecurityLevel(?:N(?:egotiatedSSL|one)|TLSv1)))|ing(?:BinaryHeapCallBacks|Transform(?:FullwidthHalfwidth|HiraganaKatakana|Latin(?:Arabic|Cyrillic|Greek|H(?:angul|ebrew|iragana)|Katakana|Thai)|MandarinLatin|Strip(?:CombiningMarks|Diacritics)|To(?:Latin|UnicodeName|XMLHex)))))|T(?:imeZoneSystemTimeZoneDidChangeNotification|ype(?:ArrayCallBacks|BagCallBacks|Dictionary(?:KeyCallBacks|ValueCallBacks)|SetCallBacks))|U(?:RL(?:AttributeModificationDateKey|C(?:ontent(?:AccessDateKey|ModificationDateKey)|reationDateKey)|File(?:AllocatedSizeKey|Protection(?:Complete(?:Un(?:lessOpen|tilFirstUserAuthentication))?|Key|None)|Resource(?:IdentifierKey|Type(?:BlockSpecial|CharacterSpecial|Directory|Key|NamedPipe|Regular|S(?:ocket|ymbolicLink)|Unknown))|S(?:ecurityKey|izeKey))|HasHiddenExtensionKey|Is(?:AliasFileKey|DirectoryKey|ExecutableKey|HiddenKey|MountTriggerKey|PackageKey|Re(?:adableKey|gularFileKey)|Sy(?:mbolicLinkKey|stemImmutableKey)|U(?:biquitousItemKey|serImmutableKey)|VolumeKey|WritableKey)|KeysOfUnsetValuesKey|L(?:abelNumberKey|inkCountKey|ocalized(?:LabelKey|NameKey|TypeDescriptionKey))|NameKey|P(?:arentDirectoryURLKey|referredIOBlockSizeKey)|T(?:otalFile(?:AllocatedSizeKey|SizeKey)|ypeIdentifierKey)|UbiquitousItem(?:HasUnresolvedConflictsKey|Is(?:DownloadingKey|Upload(?:edKey|ingKey)))|Volume(?:AvailableCapacityKey|CreationDateKey|I(?:dentifierKey|s(?:AutomountedKey|BrowsableKey|EjectableKey|InternalKey|JournalingKey|LocalKey|Re(?:adOnlyKey|movableKey)))|Localized(?:FormatDescriptionKey|NameKey)|MaximumFileSizeKey|NameKey|ResourceCountKey|Supports(?:AdvisoryFileLockingKey|Case(?:PreservedNamesKey|SensitiveNamesKey)|ExtendedSecurityKey|HardLinksKey|JournalingKey|PersistentIDsKey|R(?:enamingKey|ootDirectoryDatesKey)|S(?:parseFilesKey|ymbolicLinksKey)|VolumeSizesKey|ZeroRunsKey)|TotalCapacityKey|U(?:RL(?:ForRemountingKey|Key)|UIDStringKey)))|serNotification(?:Al(?:ert(?:HeaderKey|MessageKey|TopMostKey)|ternateButtonTitleKey)|CheckBoxTitlesKey|DefaultButtonTitleKey|IconURLKey|KeyboardTypesKey|LocalizationURLKey|OtherButtonTitleKey|P(?:opUp(?:SelectionKey|TitlesKey)|rogressIndicatorValueKey)|SoundURLKey|TextField(?:TitlesKey|ValuesKey)))|XMLTreeError(?:Description|L(?:ineNumber|ocation)|StatusCode))\\b", "name": "support.variable.cf.c" }, { @@ -157,6 +377,22 @@ "match": "\\bkCGColor(?:ConversionBlackPointCompensation|Space(?:Extended(?:Gray|Linear(?:Gray|SRGB)|SRGB)|Linear(?:Gray|SRGB)))\\b", "name": "support.variable.quartz.10.12.c" }, + { + "match": "\\bkCG(?:Color(?:ConversionTRCSize|SpaceGenericLab)|PDF(?:ContextAccessPermissions|Outline(?:Children|Destination(?:Rect)?|Title)))\\b", + "name": "support.variable.quartz.10.13.c" + }, + { + "match": "\\bkCGColorSpace(?:DisplayP3_HLG|ExtendedLinear(?:DisplayP3|ITUR_2020)|ITUR_2020_HLG)\\b", + "name": "support.variable.quartz.10.14.c" + }, + { + "match": "\\bkCGPDFTagProperty(?:A(?:ctualText|lternativeText)|LanguageText|TitleText)\\b", + "name": "support.variable.quartz.10.15.c" + }, + { + "match": "\\bkCGColorSpace(?:DisplayP3_PQ|ITUR_2020_PQ)\\b", + "name": "support.variable.quartz.10.16.c" + }, { "match": "\\bkCGDisplayS(?:howDuplicateLowResolutionModes|tream(?:ColorSpace|DestinationRect|MinimumFrameTime|PreserveAspectRatio|QueueDepth|S(?:howCursor|ourceRect)|YCbCrMatrix(?:_(?:ITU_R_(?:601_4|709_2)|SMPTE_240M_1995))?))\\b", "name": "support.variable.quartz.10.8.c" @@ -169,6 +405,17 @@ "repository": { "functions": { "patterns": [ + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.10.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:AudioFileReadPackets|LS(?:C(?:anRefAcceptItem|opy(?:ApplicationForMIMEType|DisplayNameForRef|Item(?:Attribute(?:s)?|InfoForRef)|KindStringFor(?:MIMEType|Ref|TypeInfo)))|FindApplicationForInfo|GetApplicationFor(?:I(?:nfo|tem)|URL)|Open(?:Application|F(?:SRef|romRefSpec)|ItemsWithRole|URLsWithRole)|RegisterFSRef|S(?:et(?:ExtensionHiddenForRef|ItemAttribute)|haredFileListI(?:nsertItemFSRef|temResolve)))|launch_(?:data_(?:a(?:lloc|rray_(?:get_(?:count|index)|set_index))|copy|dict_(?:get_count|i(?:nsert|terate)|lookup|remove)|free|get_(?:bool|errno|fd|integer|machport|opaque(?:_size)?|real|string|type)|new_(?:bool|fd|integer|machport|opaque|real|string)|set_(?:bool|fd|integer|machport|opaque|real|string))|get_fd|msg))\\b)" + }, { "captures": { "1": { @@ -180,6 +427,17 @@ }, "match": "(\\s*)(\\bCF(?:AbsoluteTime(?:AddGregorianUnits|Get(?:D(?:ayOf(?:Week|Year)|ifferenceAsGregorianUnits)|GregorianDate|WeekOfYear))|GregorianDate(?:GetAbsoluteTime|IsValid)|PropertyList(?:Create(?:From(?:Stream|XMLData)|XMLData)|WriteToStream))\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.11.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:AudioHardwareService(?:AddPropertyListener|GetPropertyData(?:Size)?|HasProperty|IsPropertySettable|RemovePropertyListener|SetPropertyData)|CF(?:FTPCreateParsedResourceListing|ReadStreamCreate(?:For(?:HTTPRequest|StreamedHTTPRequest)|WithFTPURL)|WriteStreamCreateWithFTPURL)|LS(?:Copy(?:DisplayNameForURL|ItemInfoForURL|KindStringForURL)|Get(?:ExtensionInfo|HandlerOptionsForContentType)|S(?:et(?:ExtensionHiddenForURL|HandlerOptionsForContentType)|haredFileList(?:AddObserver|C(?:opy(?:Property|Snapshot)|reate)|Get(?:SeedValue|TypeID)|I(?:nsertItemURL|tem(?:Copy(?:DisplayName|IconRef|Property|ResolvedURL)|Get(?:ID|TypeID)|Move|Remove|SetProperty))|Remove(?:AllItems|Observer)|Set(?:Authorization|Property))))|SSLSetEncryptionCertificate)\\b)" + }, { "captures": { "1": { @@ -202,6 +460,17 @@ }, "match": "(\\s*)(\\bCGDisplayModeCopyPixelEncoding\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.12.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:OS(?:Atomic(?:A(?:dd(?:32(?:Barrier)?|64(?:Barrier)?)|nd32(?:Barrier|Orig(?:Barrier)?)?)|CompareAndSwap(?:32(?:Barrier)?|64(?:Barrier)?|Int(?:Barrier)?|Long(?:Barrier)?|Ptr(?:Barrier)?)|Decrement(?:32(?:Barrier)?|64(?:Barrier)?)|Increment(?:32(?:Barrier)?|64(?:Barrier)?)|Or32(?:Barrier|Orig(?:Barrier)?)?|TestAnd(?:Clear(?:Barrier)?|Set(?:Barrier)?)|Xor32(?:Barrier|Orig(?:Barrier)?)?)|MemoryBarrier|SpinLock(?:Lock|Try|Unlock))|SecCertificateCopyNormalized(?:IssuerContent|SubjectContent)|os_log_is_(?:debug_enabled|enabled))\\b)" + }, { "captures": { "1": { @@ -211,7 +480,106 @@ "name": "invalid.deprecated.10.12.support.function.clib.c" } }, - "match": "(\\s*)(\\bsyscall\\b)" + "match": "(\\s*)(\\b(?:arc4random_addrandom|syscall)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.13.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:C(?:FNetDiagnostic(?:C(?:opyNetworkStatusPassively|reateWith(?:Streams|URL))|DiagnoseProblemInteractively|SetName)|MSDecoderSetSearchKeychain)|DisposeSRCallBackUPP|GetIconRefFromFileInfo|InvokeSRCallBackUPP|NewSRCallBackUPP|Re(?:adIconFromFSRef|gisterIconRefFromFSRef)|S(?:R(?:Add(?:LanguageObject|Text)|C(?:ancelRecognition|hangeLanguageObject|loseRecognitionSystem|o(?:ntinueRecognition|untItems))|Draw(?:RecognizedText|Text)|EmptyLanguageObject|Get(?:IndexedItem|LanguageModel|Property|Reference)|Idle|New(?:Language(?:Model|ObjectFrom(?:DataFile|Handle))|P(?:ath|hrase)|Recognizer|Word)|OpenRecognitionSystem|P(?:rocess(?:Begin|End)|utLanguageObjectInto(?:DataFile|Handle))|Re(?:leaseObject|move(?:IndexedItem|LanguageObject))|S(?:et(?:IndexedItem|LanguageModel|Property)|pe(?:ak(?:AndDrawText|Text)|echBusy)|t(?:artListening|op(?:Listening|Speech))))|ec(?:CertificateCopySerialNumber|Keychain(?:CopyAccess|SetAccess)|TrustSetKeychains))|UnregisterIconRef|os_trace_(?:debug_enabled|info_enabled|type_enabled))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.13.support.function.quartz.c" + } + }, + "match": "(\\s*)(\\bCGColorSpaceC(?:opyICCProfile|reateWithICCProfile)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.14.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:CVOpenGL(?:Buffer(?:Attach|Create|Get(?:Attributes|TypeID)|Pool(?:Create(?:OpenGLBuffer)?|Get(?:Attributes|OpenGLBufferAttributes|TypeID)|Re(?:lease|tain))|Re(?:lease|tain))|Texture(?:Cache(?:Create(?:TextureFromImage)?|Flush|GetTypeID|Re(?:lease|tain))|Get(?:CleanTexCoords|Name|T(?:arget|ypeID))|IsFlipped|Re(?:lease|tain)))|DR(?:AudioTrackCreate|F(?:SObjectGetRealFSRef|ileCreateReal|olderCreateReal))|SecCertificateCopyPublicKey)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.15.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:AcquireIconRef|C(?:C_MD(?:2(?:_(?:Final|Init|Update))?|4(?:_(?:Final|Init|Update))?|5(?:_(?:Final|Init|Update))?)|TFont(?:CreateWithQuickdrawInstance|Manager(?:RegisterFontsForURLs|UnregisterFontsForURLs))|ompositeIconRef)|Get(?:CustomIconsEnabled|IconRef(?:From(?:Component|Folder|IconFamilyPtr|TypeInfo)|Owners)?)|Is(?:DataAvailableInIconRef|IconRefComposite|ValidIconRef)|LSCopy(?:AllHandlersForURLScheme|DefaultHandlerForURLScheme)|OverrideIconRef|Re(?:gisterIconRefFromIconFamily|leaseIconRef|moveIconRefOverride)|S(?:SL(?:AddDistinguishedName|C(?:lose|o(?:ntextGetTypeID|py(?:ALPNProtocols|CertificateAuthorities|DistinguishedNames|PeerTrust|RequestedPeerName(?:Length)?))|reateContext)|Get(?:BufferedReadSize|C(?:lientCertificateState|onnection)|D(?:atagramWriteSize|iffieHellmanParams)|EnabledCiphers|MaxDatagramRecordSize|N(?:egotiated(?:Cipher|ProtocolVersion)|umber(?:EnabledCiphers|SupportedCiphers))|P(?:eer(?:DomainName(?:Length)?|ID)|rotocolVersionM(?:ax|in))|S(?:ession(?:Option|State)|upportedCiphers))|Handshake|Re(?:Handshake|ad)|Set(?:ALPNProtocols|C(?:ertificate(?:Authorities)?|lientSideAuthenticate|onnection)|D(?:atagramHelloCookie|iffieHellmanParams)|E(?:nabledCiphers|rror)|IOFuncs|MaxDatagramRecordSize|OCSPResponse|P(?:eer(?:DomainName|ID)|rotocolVersionM(?:ax|in))|Session(?:Config|Option|TicketsEnabled))|Write)|e(?:cTrust(?:Evaluate(?:Async)?|edApplication(?:C(?:opyData|reateFromPath)|SetData))|tCustomIconsEnabled))|UpdateIconRef|sec_protocol_(?:metadata_get_negotiated_(?:ciphersuite|protocol_version)|options_(?:add_tls_ciphersuite(?:_group)?|set_tls_(?:diffie_hellman_parameters|m(?:ax_version|in_version)))))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.15.support.function.cf.c" + } + }, + "match": "(\\s*)(\\bCF(?:Bundle(?:CloseBundleResourceMap|OpenBundleResource(?:Files|Map))|URLCopyParameterString)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.15.support.function.quartz.c" + } + }, + "match": "(\\s*)(\\bCGColorSpaceIsHDR\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.3.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:DisposeGetScrapDataUPP|InvokeGetScrapDataUPP|NewGetScrapDataUPP|ReleaseFolder)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.4.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:AH(?:GotoMainTOC|RegisterHelpBook)|CFNetServiceRe(?:gister|solve)|Dispose(?:CaretHookUPP|DrawHookUPP|EOLHookUPP|Hi(?:ghHookUPP|tTestHookUPP)|NWidthHookUPP|T(?:E(?:ClickLoopUPP|DoTextUPP|FindWordUPP|RecalcUPP)|XNActionKeyMapperUPP|extWidthHookUPP)|URL(?:NotifyUPP|SystemEventUPP)|WidthHookUPP)|In(?:s(?:Time|XTime|tall(?:TimeTask|XTimeTask))|voke(?:CaretHookUPP|DrawHookUPP|EOLHookUPP|Hi(?:ghHookUPP|tTestHookUPP)|NWidthHookUPP|T(?:E(?:ClickLoopUPP|DoTextUPP|FindWordUPP|RecalcUPP)|XNActionKeyMapperUPP|extWidthHookUPP)|URL(?:NotifyUPP|SystemEventUPP)|WidthHookUPP))|LM(?:Get(?:ApFontID|SysFontSize)|Set(?:ApFontID|SysFontFam))|New(?:CaretHookUPP|DrawHookUPP|EOLHookUPP|Hi(?:ghHookUPP|tTestHookUPP)|NWidthHookUPP|T(?:E(?:ClickLoopUPP|DoTextUPP|FindWordUPP|RecalcUPP)|XNActionKeyMapperUPP|extWidthHookUPP)|URL(?:NotifyUPP|SystemEventUPP)|WidthHookUPP)|P(?:L(?:pos|str(?:c(?:at|hr|mp|py)|len|nc(?:at|mp|py)|pbrk|rchr|s(?:pn|tr)))|rimeTime(?:Task)?)|R(?:emoveTimeTask|mvTime)|SKSearch(?:Group(?:C(?:opyIndexes|reate)|GetTypeID)|Results(?:C(?:opyMatchingTerms|reateWith(?:Documents|Query))|Get(?:Count|InfoInRange|TypeID))))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.5.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:A(?:S(?:GetSourceStyles|SetSourceStyles)|UGraph(?:CountNodeConnections|Get(?:ConnectionInfo|N(?:ode(?:Connections|Info)|umberOfConnections))|NewNode)|udio(?:ConverterFillBuffer|Device(?:AddIOProc|Re(?:ad|moveIOProc))|FileComponent(?:DataIsThisFormat|FileIsThisFormat)))|Dispose(?:AVL(?:CompareItemsUPP|DisposeItemUPP|ItemSizeUPP|WalkUPP)|Drag(?:DrawingUPP|ReceiveHandlerUPP|SendDataUPP|TrackingHandlerUPP)|List(?:ClickLoopUPP|DefUPP|SearchUPP)|Menu(?:ItemDrawingUPP|TitleDrawingUPP)|S(?:crapPromiseKeeperUPP|leepQUPP)|Theme(?:ButtonDrawUPP|EraseUPP|IteratorUPP|TabTitleDrawUPP)|Window(?:PaintUPP|TitleDrawingUPP))|Get(?:NameFromSoundBank|ScriptManagerVariable)|Invoke(?:AVL(?:CompareItemsUPP|DisposeItemUPP|ItemSizeUPP|WalkUPP)|Drag(?:DrawingUPP|ReceiveHandlerUPP|SendDataUPP|TrackingHandlerUPP)|List(?:ClickLoopUPP|DefUPP|SearchUPP)|Menu(?:ItemDrawingUPP|TitleDrawingUPP)|S(?:crapPromiseKeeperUPP|leepQUPP)|Theme(?:ButtonDrawUPP|EraseUPP|IteratorUPP|TabTitleDrawUPP)|Window(?:PaintUPP|TitleDrawingUPP))|Music(?:Device(?:PrepareInstrument|ReleaseInstrument)|Sequence(?:LoadSMF(?:DataWithFlags|WithFlags)|Save(?:MIDIFile|SMFData)))|New(?:AVL(?:CompareItemsUPP|DisposeItemUPP|ItemSizeUPP|WalkUPP)|Drag(?:DrawingUPP|ReceiveHandlerUPP|SendDataUPP|TrackingHandlerUPP)|List(?:ClickLoopUPP|DefUPP|SearchUPP)|Menu(?:ItemDrawingUPP|TitleDrawingUPP)|S(?:crapPromiseKeeperUPP|leepQUPP)|Theme(?:ButtonDrawUPP|EraseUPP|IteratorUPP|TabTitleDrawUPP)|Window(?:PaintUPP|TitleDrawingUPP))|S(?:CNetworkInterfaceRefreshConfiguration|etScriptManagerVariable))\\b)" }, { "captures": { @@ -235,6 +603,17 @@ }, "match": "(\\s*)(\\bCG(?:ContextDrawPDFDocument|PDFDocumentGet(?:ArtBox|BleedBox|CropBox|MediaBox|RotationAngle|TrimBox))\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.6.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:Audio(?:Device(?:AddPropertyListener|GetProperty(?:Info)?|RemovePropertyListener|SetProperty)|File(?:C(?:omponent(?:Create|Initialize|OpenFile)|reate)|Initialize|Open)|Hardware(?:AddPropertyListener|GetProperty(?:Info)?|RemovePropertyListener|SetProperty)|Stream(?:AddPropertyListener|GetProperty(?:Info)?|RemovePropertyListener|SetProperty))|Button|DisposeKCCallbackUPP|ExtAudioFile(?:CreateNew|Open)|FlushEvents|I(?:nvokeKCCallbackUPP|sCmdChar)|KC(?:Add(?:AppleSharePassword|Callback|GenericPassword|I(?:nternetPassword(?:WithPath)?|tem))|C(?:hangeSettings|o(?:pyItem|untKeychains)|reateKeychain)|DeleteItem|Find(?:AppleSharePassword|FirstItem|GenericPassword|InternetPassword(?:WithPath)?|NextItem)|Get(?:Attribute|D(?:ata|efaultKeychain)|IndKeychain|Keychain(?:ManagerVersion|Name)?|Status)|IsInteractionAllowed|Lock|Make(?:AliasFromKCRef|KCRefFrom(?:Alias|FSRef))|NewItem|Re(?:lease(?:Item|Keychain|Search)|moveCallback)|Set(?:Attribute|D(?:ata|efaultKeychain)|InteractionAllowed)|U(?:nlock|pdateItem))|Munger|New(?:KCCallbackUPP|MusicTrackFrom)|S(?:CNetworkCheckReachabilityBy(?:Address|Name)|ecHost(?:CreateGuest|RemoveGuest|Se(?:lect(?:Guest|edGuest)|t(?:GuestStatus|HostingPort))))|UC(?:CreateTextBreakLocator|DisposeTextBreakLocator|FindTextBreak)|kc(?:add(?:applesharepassword|genericpassword|internetpassword(?:withpath)?)|createkeychain|find(?:applesharepassword|genericpassword|internetpassword(?:withpath)?)|getkeychainname|unlock))\\b)" + }, { "captures": { "1": { @@ -246,6 +625,17 @@ }, "match": "(\\s*)(\\bCG(?:ConfigureDisplayMode|Display(?:AvailableModes|BestModeForParameters(?:AndRefreshRate)?|CurrentMode|SwitchToMode)|EnableEventStateCombining|FontCreateWithPlatformFont|InhibitLocalEvents|Post(?:KeyboardEvent|MouseEvent|ScrollWheelEvent)|SetLocalEvents(?:FilterDuringSuppressionState|SuppressionInterval))\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.7.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:Au(?:dioHardware(?:AddRunLoopSource|RemoveRunLoopSource)|thorization(?:CopyPrivilegedReference|ExecuteWithPrivileges))|C(?:MSEncode(?:rSetEncapsulatedContentType)?|SSM_(?:AC_(?:AuthCompute|PassThrough)|C(?:L_(?:C(?:ert(?:Abort(?:Cache|Query)|C(?:ache|reateTemplate)|DescribeFormat|G(?:et(?:All(?:Fields|TemplateFields)|First(?:CachedFieldValue|FieldValue)|KeyInfo|Next(?:CachedFieldValue|FieldValue))|roup(?:FromVerifiedBundle|ToSignedBundle))|Sign|Verify(?:WithKey)?)|rl(?:A(?:bort(?:Cache|Query)|ddCert)|C(?:ache|reateTemplate)|DescribeFormat|Get(?:All(?:CachedRecordFields|Fields)|First(?:CachedFieldValue|FieldValue)|Next(?:CachedFieldValue|FieldValue))|RemoveCert|S(?:etFields|ign)|Verify(?:WithKey)?))|FreeField(?:Value|s)|IsCertInC(?:achedCrl|rl)|PassThrough)|SP_(?:C(?:hangeLogin(?:Acl|Owner)|reate(?:AsymmetricContext|D(?:eriveKeyContext|igestContext)|KeyGenContext|MacContext|PassThroughContext|RandomGenContext|S(?:ignatureContext|ymmetricContext)))|Get(?:Login(?:Acl|Owner)|OperationalStatistics)|Log(?:in|out)|ObtainPrivateKeyFromPublicKey|PassThrough)|hangeKey(?:Acl|Owner))|D(?:L_(?:Authenticate|C(?:hangeDb(?:Acl|Owner)|reateRelation)|D(?:ata(?:AbortQuery|Delete|Get(?:F(?:irst|romUniqueRecordId)|Next)|Insert|Modify)|b(?:C(?:lose|reate)|Delete|Open)|estroyRelation)|Free(?:NameList|UniqueRecord)|GetDb(?:Acl|Name(?:FromHandle|s)|Owner)|PassThrough)|e(?:cryptData(?:Final|Init(?:P)?|P|Update)?|leteContext(?:Attributes)?|riveKey)|igestData(?:Clone|Final|Init|Update)?)|EncryptData(?:Final|Init(?:P)?|P|Update)?|Free(?:Context|Key)|Ge(?:nerate(?:AlgorithmParams|Key(?:P(?:air(?:P)?)?)?|Mac(?:Final|Init|Update)?|Random)|t(?:APIMemoryFunctions|Context(?:Attribute)?|Key(?:Acl|Owner)|ModuleGUIDFromHandle|Privilege|SubserviceUIDFromHandle|TimeValue))|In(?:it|troduce)|ListAttachedModuleManagers|Module(?:Attach|Detach|Load|Unload)|Query(?:KeySizeInBits|Size)|Retrieve(?:Counter|UniqueId)|S(?:et(?:Context|Privilege)|ignData(?:Final|Init|Update)?)|T(?:P_(?:ApplyCrlToDb|C(?:ert(?:CreateTemplate|G(?:etAllTemplateFields|roup(?:Construct|Prune|ToTupleGroup|Verify))|Re(?:claim(?:Abort|Key)|moveFromCrlTemplate|voke)|Sign)|onfirmCredResult|rl(?:CreateTemplate|Sign|Verify))|Form(?:Request|Submit)|PassThrough|Re(?:ceiveConfirmation|trieveCredResult)|SubmitCredRequest|TupleGroupToCertGroup)|erminate)|U(?:n(?:introduce|wrapKey(?:P)?)|pdateContextAttributes)|Verify(?:D(?:ata(?:Final|Init|Update)?|evice)|Mac(?:Final|Init|Update)?)|WrapKey(?:P)?)|reateThreadPool)|Dispose(?:Debugger(?:DisposeThreadUPP|NewThreadUPP|ThreadSchedulerUPP)|Thread(?:EntryUPP|S(?:chedulerUPP|witchUPP)|TerminationUPP)?)|Get(?:CurrentThread|DefaultThreadStackSize|Thread(?:CurrentTaskRef|State(?:GivenTaskRef)?))|I(?:C(?:Add(?:MapEntry|Profile)|Begin|C(?:ount(?:MapEntries|Pr(?:ef|ofiles))|reateGURLEvent)|Delete(?:MapEntry|Pr(?:ef|ofile))|E(?:ditPreferences|nd)|FindPrefHandle|Get(?:C(?:onfigName|urrentProfile)|DefaultPref|Ind(?:MapEntry|Pr(?:ef|ofile))|MapEntry|P(?:erm|r(?:ef(?:Handle)?|ofileName))|Seed|Version)|LaunchURL|Map(?:Entries(?:Filename|TypeCreator)|Filename|TypeCreator)|ParseURL|S(?:e(?:ndGURLEvent|t(?:CurrentProfile|MapEntry|Pr(?:ef(?:Handle)?|ofileName)))|t(?:art|op)))|nvoke(?:Debugger(?:DisposeThreadUPP|NewThreadUPP|ThreadSchedulerUPP)|Thread(?:EntryUPP|S(?:chedulerUPP|witchUPP)|TerminationUPP))|sMetric)|M(?:DS_(?:In(?:itialize|stall)|Terminate|Uninstall)|P(?:A(?:llocate(?:Aligned|TaskStorageIndex)?|rmTimer)|BlockC(?:lear|opy)|C(?:a(?:ncelTimer|useNotification)|reate(?:CriticalRegion|Event|Notification|Queue|Semaphore|T(?:ask|imer))|urrentTaskID)|D(?:e(?:allocateTaskStorageIndex|l(?:ayUntil|ete(?:CriticalRegion|Event|Notification|Queue|Semaphore|Timer)))|isposeTaskException)|E(?:nterCriticalRegion|x(?:it(?:CriticalRegion)?|tractTaskState))|Free|Get(?:AllocatedBlockSize|Next(?:CpuID|TaskID)|TaskStorageValue)|ModifyNotification(?:Parameters)?|NotifyQueue|Processors(?:Scheduled)?|Re(?:gisterDebugger|moteCall(?:CFM)?)|S(?:et(?:E(?:vent|xceptionHandler)|QueueReserve|T(?:ask(?:St(?:ate|orageValue)|Weight)|imerNotify))|ignalSemaphore)|T(?:askIsPreemptive|erminateTask|hrowException)|UnregisterDebugger|Wait(?:ForEvent|On(?:Queue|Semaphore))|Yield)|usicTrackNewExtendedControlEvent)|New(?:Debugger(?:DisposeThreadUPP|NewThreadUPP|ThreadSchedulerUPP)|Thread(?:EntryUPP|S(?:chedulerUPP|witchUPP)|TerminationUPP)?)|Se(?:c(?:A(?:CL(?:C(?:opySimpleContents|reateFromSimpleContents)|GetAuthorizations|Set(?:Authorizations|SimpleContents))|ccess(?:C(?:opySelectedACLList|reateFromOwnerAndACL)|GetOwnerAndACL))|Certificate(?:C(?:opyPreference|reateFromData)|Get(?:AlgorithmID|CLHandle|Data|Issuer|Subject|Type)|SetPreference)|Identity(?:CopyPreference|Se(?:arch(?:C(?:opyNext|reate)|GetTypeID)|tPreference))|Key(?:CreatePair|Ge(?:nerate|tC(?:S(?:PHandle|SMKey)|redentials))|chain(?:Get(?:CSPHandle|DLDBHandle)|Item(?:Export|Get(?:DLDBHandle|UniqueRecordID)|Import)|Search(?:C(?:opyNext|reateFromAttributes)|GetTypeID)))|Policy(?:Get(?:OID|TPHandle|Value)|Se(?:arch(?:C(?:opyNext|reate)|GetTypeID)|tValue))|Trust(?:Get(?:CssmResult(?:Code)?|Result|TPHandle)|SetParameters))|t(?:DebuggerNotificationProcs|Thread(?:ReadyGivenTaskRef|S(?:cheduler|tate(?:EndCritical)?|witcher)|Terminator)))|Thread(?:BeginCritical|CurrentStackSpace|EndCritical)|YieldTo(?:AnyThread|Thread))\\b)" + }, { "captures": { "1": { @@ -257,6 +647,17 @@ }, "match": "(\\s*)(\\bCFURLEnumeratorGetSourceDidChange\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.8.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:A(?:TS(?:CreateFontQueryRunLoopSource|Font(?:A(?:ctivateFrom(?:FileReference|Memory)|pplyFunction)|Deactivate|F(?:amily(?:ApplyFunction|FindFrom(?:Name|QuickDrawName)|Get(?:Encoding|Generation|Name|QuickDrawName)|Iterator(?:Create|Next|Re(?:lease|set)))|indFrom(?:Container|Name|PostScriptName))|Get(?:AutoActivationSettingForApplication|Container(?:FromFileReference)?|F(?:ileReference|ontFamilyResource)|G(?:eneration|lobalAutoActivationSetting)|HorizontalMetrics|Name|PostScriptName|Table(?:Directory)?|VerticalMetrics)|I(?:sEnabled|terator(?:Create|Next|Re(?:lease|set)))|Notif(?:ication(?:Subscribe|Unsubscribe)|y)|Set(?:AutoActivationSettingForApplication|Enabled|GlobalAutoActivationSetting))|GetGeneration)|bsolute(?:DeltaTo(?:Duration|Nanoseconds)|To(?:Duration|Nanoseconds))|dd(?:A(?:bsoluteToAbsolute|tomic(?:16|8)?)|CollectionItem(?:Hdl)?|DurationToAbsolute|FolderDescriptor|NanosecondsToAbsolute|Resource))|B(?:atteryCount|it(?:And(?:Atomic(?:16|8)?)?|Clr|Not|Or(?:Atomic(?:16|8)?)?|S(?:et|hift)|Tst|Xor(?:Atomic(?:16|8)?)?))|C(?:S(?:Copy(?:MachineName|UserName)|GetComponentsThreadMode|SetComponentsThreadMode)|a(?:llComponent(?:C(?:anDo|lose)|Dispatch|Function(?:WithStorage(?:ProcInfo)?)?|Get(?:MPWorkFunction|PublicResource)|Open|Register|Target|Unregister|Version)|ptureComponent)|hangedResource|lo(?:neCollection|se(?:Component(?:ResFile)?|ResFile))|o(?:llectionTagExists|mpareAndSwap|pyCollection|reEndian(?:FlipData|GetFlipper|InstallFlipper)|unt(?:1(?:Resources|Types)|Co(?:llection(?:Items|Owners|Tags)|mponent(?:Instances|s))|Resources|T(?:aggedCollectionItems|ypes)))|ur(?:ResFile|rentProcessorSpeed))|D(?:e(?:bugAssert|crementAtomic(?:16|8)?|l(?:ay|e(?:gateComponentCall|teGestaltValue))|queue|t(?:achResource(?:File)?|ermineIfPathIsEnclosedByFolder))|ispose(?:Co(?:llection(?:ExceptionUPP|FlattenUPP)?|mponent(?:FunctionUPP|MPWorkFunctionUPP|RoutineUPP))|De(?:bug(?:AssertOutputHandlerUPP|Component(?:CallbackUPP)?)|ferredTaskUPP)|ExceptionHandlerUPP|F(?:NSubscriptionUPP|SVolume(?:EjectUPP|MountUPP|UnmountUPP)|olderManagerNotificationUPP)|GetMissingComponentResourceUPP|Handle|IOCompletionUPP|Ptr|ResErrUPP|S(?:electorFunctionUPP|peech(?:DoneUPP|ErrorUPP|PhonemeUPP|SyncUPP|TextDoneUPP|WordUPP))|TimerUPP)|urationTo(?:Absolute|Nanoseconds))|E(?:mpty(?:Collection|Handle)|nqueue)|F(?:N(?:GetDirectoryForSubscription|Notify(?:All|ByPath)?|Subscribe(?:ByPath)?|Unsubscribe)|S(?:AllocateFork|C(?:a(?:ncelVolumeOperation|talogSearch)|lose(?:Fork|Iterator)|o(?:mpareFSRefs|py(?:AliasInfo|D(?:ADiskForVolume|iskIDForVolume)|Object(?:Async|Sync)|URLForVolume))|reate(?:DirectoryUnicode|F(?:ile(?:AndOpenForkUnicode|Unicode)|ork)|Res(?:File|ourceF(?:ile|ork))|StringFromHFSUniStr|VolumeOperation))|D(?:e(?:lete(?:Fork|Object)|termineIfRefIsEnclosedByFolder)|isposeVolumeOperation)|E(?:jectVolume(?:Async|Sync)|xchangeObjects)|F(?:i(?:le(?:Operation(?:C(?:ancel|opyStatus|reate)|GetTypeID|ScheduleWithRunLoop|UnscheduleFromRunLoop)|Security(?:C(?:opyAccessControlList|reate(?:WithFSPermissionInfo)?)|Get(?:Group(?:UUID)?|Mode|Owner(?:UUID)?|TypeID)|RefCreateCopy|Set(?:AccessControlList|Group(?:UUID)?|Mode|Owner(?:UUID)?)))|ndFolder)|lush(?:Fork|Volume)|ollowFinderAlias)|Get(?:Async(?:EjectStatus|MountStatus|UnmountStatus)|CatalogInfo(?:Bulk)?|DataForkName|Fork(?:CBInfo|Position|Size)|HFSUniStrFromString|ResourceForkName|TemporaryDirectoryForReplaceObject|Volume(?:ForD(?:ADisk|iskID)|Info|MountInfo(?:Size)?|Parms))|I(?:s(?:AliasFile|FSRefValid)|terateForks)|LockRange|M(?:a(?:keFSRefUnicode|tchAliasBulk)|o(?:unt(?:LocalVolume(?:Async|Sync)|ServerVolume(?:Async|Sync))|veObject(?:Async|Sync|ToTrash(?:Async|Sync))?))|NewAlias(?:FromPath|Minimal(?:Unicode)?|Unicode)?|Open(?:Fork|Iterator|OrphanResFile|Res(?:File|ourceFile))|Path(?:CopyObject(?:Async|Sync)|FileOperationCopyStatus|GetTemporaryDirectoryForReplaceObject|M(?:akeRef(?:WithOptions)?|oveObject(?:Async|Sync|ToTrash(?:Async|Sync)))|ReplaceObject)|Re(?:adFork|fMakePath|nameUnicode|placeObject|so(?:lve(?:Alias(?:File(?:WithMountFlags)?|WithMountFlags)?|NodeID)|urceFileAlreadyOpen))|Set(?:CatalogInfo|Fork(?:Position|Size)|VolumeInfo)|U(?:n(?:l(?:inkObject|ockRange)|mountVolume(?:Async|Sync))|pdateAlias)|VolumeMount|WriteFork)|i(?:nd(?:Folder|NextComponent)|x(?:2(?:Frac|Long|X)|ATan2|Div|Mul|R(?:atio|ound)))|latten(?:Collection(?:ToHdl)?|PartialCollection)|rac(?:2(?:Fix|X)|Cos|Div|Mul|S(?:in|qrt)))|Ge(?:stalt|t(?:1(?:Ind(?:Resource|Type)|NamedResource|Resource)|Alias(?:Size(?:FromPtr)?|UserType(?:FromPtr)?)|C(?:PUSpeed|o(?:llection(?:DefaultAttributes|ExceptionProc|Item(?:Hdl|Info)?|RetainCount)|mponent(?:In(?:dString|fo|stance(?:Error|Storage))|ListModSeed|Public(?:IndString|Resource(?:List)?)|Re(?:fcon|source)|TypeModSeed)))|Debug(?:ComponentInfo|OptionInfo)|Folder(?:NameUnicode|Types)|HandleSize|Ind(?:Resource|Type|exedCollection(?:Item(?:Hdl|Info)?|Tag))|Ma(?:cOSStatus(?:CommentString|ErrorString)|xResourceSize)|N(?:amedResource|e(?:wCollection|xt(?:FOND|ResourceFile)))|PtrSize|Res(?:Attrs|FileAttrs|Info|ource(?:SizeOnDisk)?)|SpeechInfo|T(?:aggedCollectionItem(?:Info)?|opResourceFile)))|H(?:ClrRBit|GetState|Lock(?:Hi)?|Set(?:RBit|State)|Unlock|and(?:AndHand|ToHand)|omeResFile)|I(?:dentifyFolder|n(?:crementAtomic(?:16|8)?|s(?:ertResourceFile|tall(?:DebugAssertOutputHandler|ExceptionHandler))|v(?:alidateFolderDescriptorCache|oke(?:Co(?:llection(?:ExceptionUPP|FlattenUPP)|mponent(?:MPWorkFunctionUPP|RoutineUPP))|De(?:bug(?:AssertOutputHandlerUPP|ComponentCallbackUPP)|ferredTaskUPP)|ExceptionHandlerUPP|F(?:NSubscriptionUPP|SVolume(?:EjectUPP|MountUPP|UnmountUPP)|olderManagerNotificationUPP)|GetMissingComponentResourceUPP|IOCompletionUPP|ResErrUPP|S(?:electorFunctionUPP|peech(?:DoneUPP|ErrorUPP|PhonemeUPP|SyncUPP|TextDoneUPP|WordUPP))|TimerUPP)))|s(?:H(?:andleValid|eapValid)|PointerValid))|L(?:M(?:Get(?:BootDrive|IntlSpec|MemErr|Res(?:Err|Load)|SysMap|TmpResLoad)|Set(?:BootDrive|IntlSpec|MemErr|Res(?:Err|Load)|Sys(?:FontSize|Map)|TmpResLoad))|o(?:adResource|cale(?:CountNames|Get(?:IndName|Name)|Operation(?:CountLocales|GetLocales))|ng2Fix))|M(?:PSetTaskType|aximumProcessorSpeed|emError|i(?:croseconds|nimumProcessorSpeed))|N(?:anosecondsTo(?:Absolute|Duration)|ew(?:Co(?:llection(?:ExceptionUPP|FlattenUPP)?|mponent(?:FunctionUPP|MPWorkFunctionUPP|RoutineUPP))|De(?:bug(?:AssertOutputHandlerUPP|Component(?:CallbackUPP)?|Option)|ferredTaskUPP)|E(?:mptyHandle|xceptionHandlerUPP)|F(?:NSubscriptionUPP|SVolume(?:EjectUPP|MountUPP|UnmountUPP)|olderManagerNotificationUPP)|Ge(?:staltValue|tMissingComponentResourceUPP)|Handle(?:Clear)?|IOCompletionUPP|Ptr(?:Clear)?|ResErrUPP|S(?:electorFunctionUPP|peech(?:DoneUPP|ErrorUPP|PhonemeUPP|SyncUPP|TextDoneUPP|WordUPP))|TimerUPP))|Open(?:A(?:Component(?:ResFile)?|DefaultComponent)|Component(?:ResFile)?|DefaultComponent)|P(?:B(?:AllocateFork(?:Async|Sync)|C(?:atalogSearch(?:Async|Sync)|lose(?:Fork(?:Async|Sync)|Iterator(?:Async|Sync))|ompareFSRefs(?:Async|Sync)|reate(?:DirectoryUnicode(?:Async|Sync)|F(?:ile(?:AndOpenForkUnicode(?:Async|Sync)|Unicode(?:Async|Sync))|ork(?:Async|Sync))))|Delete(?:Fork(?:Async|Sync)|Object(?:Async|Sync))|ExchangeObjects(?:Async|Sync)|F(?:S(?:CopyFile(?:Async|Sync)|ResolveNodeID(?:Async|Sync))|lush(?:Fork(?:Async|Sync)|Volume(?:Async|Sync)))|Get(?:CatalogInfo(?:Async|Bulk(?:Async|Sync)|Sync)|Fork(?:CBInfo(?:Async|Sync)|Position(?:Async|Sync)|Size(?:Async|Sync))|VolumeInfo(?:Async|Sync))|IterateForks(?:Async|Sync)|M(?:akeFSRefUnicode(?:Async|Sync)|oveObject(?:Async|Sync))|Open(?:Fork(?:Async|Sync)|Iterator(?:Async|Sync))|Re(?:adFork(?:Async|Sync)|nameUnicode(?:Async|Sync))|Set(?:CatalogInfo(?:Async|Sync)|Fork(?:Position(?:Async|Sync)|Size(?:Async|Sync))|VolumeInfo(?:Async|Sync))|UnlinkObject(?:Async|Sync)|WriteFork(?:Async|Sync)|X(?:LockRange(?:Async|Sync)|UnlockRange(?:Async|Sync)))|tr(?:AndHand|To(?:Hand|XHand))|urgeCollection(?:Tag)?)|Re(?:a(?:d(?:Location|PartialResource)|llocateHandle)|coverHandle|gisterComponent(?:FileRef(?:Entries)?|Resource(?:File)?)?|lease(?:Collection|Resource)|move(?:CollectionItem|FolderDescriptor|IndexedCollectionItem|Resource)|place(?:GestaltValue|IndexedCollectionItem(?:Hdl)?)|s(?:Error|olveComponentAlias)|tainCollection)|S(?:64Compare|SL(?:GetProtocolVersion|SetProtocolVersion)|e(?:cTranformCustomGetAttribute|t(?:AliasUserType(?:WithPtr)?|Co(?:llection(?:DefaultAttributes|ExceptionProc|ItemInfo)|mponent(?:Instance(?:Error|Storage)|Refcon))|De(?:bugOptionValue|faultComponent)|GestaltValue|HandleSize|IndexedCollectionItemInfo|PtrSize|Res(?:Attrs|FileAttrs|Info|Load|Purge|ourceSize)|SpeechInfo))|leepQ(?:Install|Remove)|peak(?:Buffer|String|Text)|ub(?:AbsoluteFromAbsolute|DurationFromAbsolute|NanosecondsFromAbsolute)|ysError)|T(?:askLevel|e(?:mpNewHandle|stAnd(?:Clear|Set)|xtToPhonemes)|ickCount)|U(?:64Compare|n(?:captureComponent|flattenCollection(?:FromHdl)?|ique(?:1ID|ID)|registerComponent|signedFixedMulDiv)|p(?:Time|date(?:ResFile|SystemActivity))|se(?:Dictionary|ResFile))|W(?:S(?:Get(?:CFTypeIDFromWSTypeID|WSTypeIDFromCFType)|Method(?:Invocation(?:Add(?:DeserializationOverride|SerializationOverride)|C(?:opy(?:P(?:arameters|roperty)|Serialization)|reate(?:FromSerialization)?)|GetTypeID|Invoke|S(?:cheduleWithRunLoop|et(?:CallBack|P(?:arameters|roperty)))|UnscheduleFromRunLoop)|ResultIsFault)|ProtocolHandler(?:C(?:opy(?:FaultDocument|Property|Re(?:plyD(?:ictionary|ocument)|questD(?:ictionary|ocument)))|reate)|GetTypeID|Set(?:DeserializationOverride|Property|SerializationOverride)))|ide(?:Add|BitShift|Compare|Divide|Multiply|Negate|S(?:hift|quareRoot|ubtract)|WideDivide)|rite(?:PartialResource|Resource))|X2F(?:ix|rac)|annuity|compound|d(?:ec2(?:f|l|num|s(?:tr)?)|tox80)|getaudit|num(?:2dec|tostring)|r(?:andomx|elation)|s(?:etaudit|tr2dec)|x80tod)\\b)" + }, { "captures": { "1": { @@ -290,6 +691,17 @@ }, "match": "(\\s*)(\\bCG(?:Re(?:gisterScreenRefreshCallback|leaseScreenRefreshRects)|Screen(?:RegisterMoveCallback|UnregisterMoveCallback)|UnregisterScreenRefreshCallback|W(?:aitForScreen(?:RefreshRects|UpdateRects)|indowServerCFMachPort))\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.10.9.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:AX(?:APIEnabled|MakeProcessTrusted|UIElementPostKeyboardEvent)|CopyProcessName|ExitToShell|Get(?:CurrentProcess|FrontProcess|NextProcess|Process(?:BundleLocation|ForPID|Information|PID))|IsProcessVisible|KillProcess|LaunchApplication|ProcessInformationCopyDictionary|S(?:SL(?:Copy(?:PeerCertificates|TrustedRoots)|DisposeContext|Get(?:Allows(?:AnyRoot|Expired(?:Certs|Roots))|EnableCertVerify|ProtocolVersionEnabled|RsaBlinding)|NewContext|Set(?:Allows(?:AnyRoot|Expired(?:Certs|Roots))|EnableCertVerify|ProtocolVersionEnabled|RsaBlinding|TrustedRoots))|ameProcess|e(?:c(?:ChooseIdentity(?:AsSheet)?|DisplayCertificate(?:Group)?|EditTrust(?:AsSheet)?|Policy(?:CreateWithOID|SetProperties))|tFrontProcess(?:WithOptions)?)|howHideProcess)|WakeUpProcess)\\b)" + }, { "captures": { "1": { @@ -334,6 +746,116 @@ }, "match": "(\\s*)(\\bCG(?:C(?:ontextS(?:electFont|how(?:Glyphs(?:AtPoint|WithAdvances)?|Text(?:AtPoint)?))|ursorIs(?:DrawnInFramebuffer|Visible))|Display(?:FadeOperationInProgress|I(?:OServicePort|sCaptured)))\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "invalid.deprecated.tba.support.function.c" + } + }, + "match": "(\\s*)(\\b(?:AUGraph(?:Add(?:Node|RenderNotify)|C(?:l(?:earConnections|ose)|o(?:nnectNodeInput|untNodeInteractions))|DisconnectNodeInput|Get(?:CPULoad|In(?:dNode|teractionInfo)|MaxCPULoad|N(?:ode(?:Count|In(?:foSubGraph|teractions))|umberOfInteractions))|I(?:nitialize|s(?:Initialized|NodeSubGraph|Open|Running))|N(?:ewNodeSubGraph|odeInfo)|Open|Remove(?:Node|RenderNotify)|S(?:etNodeInputCallback|t(?:art|op))|U(?:ninitialize|pdate))|DisposeAUGraph|NewAUGraph|QL(?:PreviewRequest(?:C(?:opy(?:ContentUTI|Options|URL)|reate(?:Context|PDFContext))|FlushContext|Get(?:DocumentObject|GeneratorBundle|TypeID)|IsCancelled|Set(?:D(?:ataRepresentation|ocumentObject)|URLRepresentation))|Thumbnail(?:C(?:ancel|opy(?:DocumentURL|Image|Options)|reate)|DispatchAsync|Get(?:ContentRect|MaximumSize|TypeID)|IsCancelled|Request(?:C(?:opy(?:ContentUTI|Options|URL)|reateContext)|FlushContext|Get(?:DocumentObject|GeneratorBundle|MaximumSize|TypeID)|IsCancelled|Set(?:DocumentObject|Image(?:AtURL|WithData)?|ThumbnailWith(?:DataRepresentation|URLRepresentation))))))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.10.10.c" + } + }, + "match": "(\\s*)(\\b(?:C(?:GLGetDeviceFromGLRenderer|MS(?:DecoderCopySignerTimestampWithPolicy|EncoderCopySignerTimestampWithPolicy)|TRubyAnnotation(?:Create(?:Copy)?|Get(?:Alignment|Overhang|SizeFactor|T(?:extForPosition|ypeID))))|JSGlobalContext(?:CopyName|SetName)|LSCopy(?:ApplicationURLsForBundleIdentifier|DefaultApplicationURLFor(?:ContentType|URL))|SecAccessControl(?:CreateWithFlags|GetTypeID)|UTType(?:CopyAllTagsWithClass|IsD(?:eclared|ynamic))|launch_activate_socket|os_re(?:lease|tain)|qos_class_(?:main|self)|simd_inverse)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.10.11.c" + } + }, + "match": "(\\s*)(\\b(?:Audio(?:ComponentInstantiate|ServicesPlay(?:AlertSoundWithCompletion|SystemSoundWithCompletion))|C(?:MSEncoderSetSignerAlgorithm|T(?:LineEnumerateCaretOffsets|RunGetBaseAdvancesAndOrigins))|IORegistryEntryCopy(?:FromPath|Path)|JSValueIs(?:Array|Date)|MIDI(?:ClientCreateWithBlock|DestinationCreateWithBlock|InputPortCreateWithBlock)|connectx|disconnectx|xpc_(?:array_get_(?:array|dictionary)|dictionary_get_(?:array|dictionary)))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.10.12.c" + } + }, + "match": "(\\s*)(\\b(?:CTRubyAnnotationCreateWithAttributes|IOSurface(?:AllowsPixelSizeCasting|SetPurgeable)|JS(?:Object(?:Get(?:ArrayBufferByte(?:Length|sPtr)|TypedArray(?:B(?:uffer|yte(?:Length|Offset|sPtr))|Length))|Make(?:ArrayBufferWithBytesNoCopy|TypedArray(?:With(?:ArrayBuffer(?:AndOffset)?|BytesNoCopy))?))|ValueGetTypedArrayType)|MDItemsCopyAttributes|Sec(?:CertificateCopyNormalized(?:IssuerSequence|SubjectSequence)|Key(?:C(?:opy(?:Attributes|ExternalRepresentation|KeyExchangeResult|PublicKey)|reate(?:DecryptedData|EncryptedData|RandomKey|Signature|WithData))|IsAlgorithmSupported|VerifySignature))|os_(?:log_(?:create|type_enabled)|unfair_lock_(?:assert_(?:not_owner|owner)|lock|trylock|unlock))|xpc_connection_activate)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.10.13.c" + } + }, + "match": "(\\s*)(\\b(?:AudioUnitExtension(?:CopyComponentList|SetComponentList)|C(?:GImage(?:DestinationAddAuxiliaryDataInfo|SourceCopyAuxiliaryDataInfoAtIndex)|TFontManagerCreateFontDescriptorsFromData|V(?:ColorPrimariesGet(?:IntegerCodePointForString|StringForIntegerCodePoint)|TransferFunctionGet(?:IntegerCodePointForString|StringForIntegerCodePoint)|YCbCrMatrixGet(?:IntegerCodePointForString|StringForIntegerCodePoint)))|IOSurfaceGet(?:Bit(?:DepthOfComponentOfPlane|OffsetOfComponentOfPlane)|N(?:ameOfComponentOfPlane|umberOfComponentsOfPlane)|RangeOfComponentOfPlane|Subsampling|TypeOfComponentOfPlane)|SecCertificateCopySerialNumberData)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.10.14.c" + } + }, + "match": "(\\s*)(\\b(?:AEDeterminePermissionToAutomateTarget|C(?:GImageSourceGetPrimaryImageIndex|TFramesetterCreateWithTypesetter)|Sec(?:CertificateCopyKey|Trust(?:EvaluateWithError|SetSignedCertificateTimestamps))|sec_(?:certificate_c(?:opy_ref|reate)|identity_c(?:opy_(?:certificates_ref|ref)|reate(?:_with_certificates)?)|protocol_(?:metadata_(?:access_(?:distinguished_names|ocsp_response|peer_certificate_chain|supported_signature_algorithms)|c(?:hallenge_parameters_are_equal|opy_peer_public_key|reate_secret(?:_with_context)?)|get_(?:early_data_accepted|negotiated_(?:protocol|tls_ciphersuite)|server_name)|peers_are_equal)|options_(?:add_(?:pre_shared_key|tls_application_protocol)|set_(?:challenge_block|key_update_block|local_identity|peer_authentication_required|tls_(?:false_start_enabled|is_fallback_attempt|ocsp_enabled|re(?:negotiation_enabled|sumption_enabled)|s(?:ct_enabled|erver_name)|tickets_enabled)|verify_block)))|trust_c(?:opy_ref|reate)))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.10.15.c" + } + }, + "match": "(\\s*)(\\b(?:C(?:GAnimateImage(?:AtURLWithBlock|DataWithBlock)|T(?:FontManager(?:RegisterFont(?:Descriptors|URLs)|UnregisterFont(?:Descriptors|URLs))|GlyphInfoGetGlyph))|JS(?:Object(?:DeletePropertyForKey|GetPropertyForKey|HasPropertyForKey|MakeDeferredPromise|SetPropertyForKey)|Value(?:IsSymbol|MakeSymbol))|SecTrustEvaluateAsyncWithError|aligned_alloc|sec_(?:identity_access_certificates|protocol_(?:metadata_(?:access_pre_shared_keys|get_negotiated_tls_protocol_version)|options_(?:a(?:ppend_tls_ciphersuite(?:_group)?|re_equal)|get_default_m(?:ax_(?:dtls_protocol_version|tls_protocol_version)|in_(?:dtls_protocol_version|tls_protocol_version))|set_(?:m(?:ax_tls_protocol_version|in_tls_protocol_version)|pre_shared_key_selection_block|tls_pre_shared_key_identity_hint))))|xpc_type_get_name)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.10.8.c" + } + }, + "match": "(\\s*)(\\b(?:A(?:ECompareDesc|udioQueueProcessingTapGetQueueTime)|C(?:GImage(?:Destination(?:AddImageAndMetadata|CopyImageSource)|Metadata(?:C(?:opy(?:StringValueWithPath|Tag(?:MatchingImageProperty|WithPath|s))|reate(?:FromXMPData|Mutable(?:Copy)?|XMPData))|EnumerateTagsUsingBlock|Re(?:gisterNamespaceForPrefix|moveTagWithPath)|Set(?:TagWithPath|Value(?:MatchingImageProperty|WithPath))|Tag(?:C(?:opy(?:Name(?:space)?|Prefix|Qualifiers|Value)|reate)|GetType(?:ID)?))|SourceCopyMetadataAtIndex)|MS(?:DecoderCopySigner(?:SigningTime|Timestamp(?:Certificates)?)|EncoderCopySignerTimestamp)|T(?:Font(?:CopyDefaultCascadeListForLanguages|GetOpticalBoundsForGlyphs|Manager(?:RegisterGraphicsFont|UnregisterGraphicsFont))|LineGetBoundsWithOptions)|VImageBufferCreateColorSpaceFromAttachments|opyInstrumentInfoFromSoundBank))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.10.9.c" + } + }, + "match": "(\\s*)(\\b(?:A(?:XIsProcessTrustedWithOptions|udioHardware(?:CreateAggregateDevice|DestroyAggregateDevice))|C(?:GImageSourceRemoveCacheAtIndex|TFont(?:CreateForStringWithLanguage|Descriptor(?:CreateCopyWith(?:Family|SymbolicTraits)|MatchFontDescriptorsWithProgressHandler)))|FSEventStreamSetExclusionPaths|Sec(?:PolicyCreate(?:Revocation|WithProperties)|Trust(?:Copy(?:Exceptions|Result)|GetNetworkFetchAllowed|Set(?:Exceptions|NetworkFetchAllowed|OCSPResponse)))|xpc_activity_(?:copy_criteria|get_state|register|s(?:et_(?:criteria|state)|hould_defer)|unregister))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.c" + } + }, + "match": "(\\s*)(\\b(?:A(?:E(?:Build(?:AppleEvent|Desc|Parameters)|C(?:allObjectAccessor|heckIsRecord|o(?:erce(?:Desc|Ptr)|untItems)|reate(?:AppleEvent|Desc(?:FromExternalPtr)?|List|RemoteProcessResolver))|D(?:e(?:codeMessage|lete(?:Item|Param))|ispose(?:Desc|RemoteProcessResolver|Token)|uplicateDesc)|FlattenDesc|Get(?:A(?:rray|ttribute(?:Desc|Ptr))|CoercionHandler|DescData(?:Range|Size)?|EventHandler|InteractionAllowed|Nth(?:Desc|Ptr)|ObjectAccessor|Param(?:Desc|Ptr)|RegisteredMachPort|SpecialHandler|TheCurrentEvent)|In(?:itializeDesc|stall(?:CoercionHandler|EventHandler|ObjectAccessor|SpecialHandler)|teractWithUser)|ManagerInfo|ObjectInit|P(?:r(?:intDescToHandle|ocess(?:AppleEvent|Event|Message))|ut(?:A(?:rray|ttribute(?:Desc|Ptr))|Desc|P(?:aram(?:Desc|Ptr)|tr)))|Re(?:mo(?:teProcessResolver(?:GetProcesses|ScheduleWithRunLoop)|ve(?:CoercionHandler|EventHandler|ObjectAccessor|SpecialHandler))|placeDescData|s(?:etTimer|olve|umeTheCurrentEvent))|S(?:e(?:nd(?:Message)?|t(?:InteractionAllowed|ObjectCallbacks|TheCurrentEvent))|izeOf(?:Attribute|FlattenedDesc|NthItem|Param)|tream(?:C(?:lose(?:Desc|List|Record)?|reateEvent)|Op(?:en(?:Desc|Event|KeyDesc|List|Record)?|tionalParam)|SetRecordType|Write(?:AEDesc|D(?:ata|esc)|Key(?:Desc)?))|uspendTheCurrentEvent)|UnflattenDesc)|H(?:GotoPage|LookupAnchor|RegisterHelpBookWithURL|Search)|S(?:CopySourceAttributes|GetSourceStyleNames|Init|SetSourceAttributes)|U(?:EventListener(?:AddEventType|Create(?:WithDispatchQueue)?|Notify|RemoveEventType)|Listener(?:AddParameter|Create(?:WithDispatchQueue)?|Dispose|RemoveParameter)|Parameter(?:FormatValue|ListenerNotify|Set|Value(?:FromLinear|ToLinear)))|X(?:IsProcessTrusted|Observer(?:AddNotification|Create(?:WithInfoCallback)?|Get(?:RunLoopSource|TypeID)|RemoveNotification)|UIElement(?:C(?:opy(?:A(?:ction(?:Description|Names)|ttribute(?:Names|Value(?:s)?))|ElementAtPosition|MultipleAttributeValues|ParameterizedAttribute(?:Names|Value))|reate(?:Application|SystemWide))|Get(?:AttributeValueCount|Pid|TypeID)|IsAttributeSettable|PerformAction|Set(?:AttributeValue|MessagingTimeout))|Value(?:Create|Get(?:Type(?:ID)?|Value)))|cquireFirstMatchingEventInQueue|ddEventTypesToHandler|u(?:dio(?:C(?:hannelLayoutTag_GetNumberOfChannels|o(?:dec(?:AppendInput(?:BufferList|Data)|GetProperty(?:Info)?|Initialize|ProduceOutput(?:BufferList|Packets)|Reset|SetProperty|Uninitialize)|mponent(?:Co(?:py(?:ConfigurationInfo|Name)|unt)|FindNext|Get(?:Description|Version)|Instance(?:CanDo|Dispose|GetComponent|New)|Register|Validate)|nverter(?:Convert(?:Buffer|ComplexBuffer)|Dispose|FillComplexBuffer|GetProperty(?:Info)?|New(?:Specific)?|Reset|SetProperty)))|Device(?:CreateIOProcID(?:WithBlock)?|DestroyIOProcID|Get(?:CurrentTime|NearestStartTime)|St(?:art(?:AtTime)?|op)|TranslateTime)|F(?:ile(?:C(?:lose|o(?:mponent(?:C(?:loseFile|ountUserData|reateURL)|ExtensionIsThisFormat|FileDataIsThisFormat|Get(?:GlobalInfo(?:Size)?|Property(?:Info)?|UserData(?:Size)?)|InitializeWithCallbacks|Op(?:en(?:URL|WithCallbacks)|timize)|Re(?:ad(?:Bytes|Packet(?:Data|s))|moveUserData)|Set(?:Property|UserData)|Write(?:Bytes|Packets))|untUserData)|reateWithURL)|Get(?:GlobalInfo(?:Size)?|Property(?:Info)?|UserData(?:Size)?)|InitializeWithCallbacks|Op(?:en(?:URL|WithCallbacks)|timize)|Re(?:ad(?:Bytes|PacketData)|moveUserData)|S(?:et(?:Property|UserData)|tream(?:Close|GetProperty(?:Info)?|Open|ParseBytes|Se(?:ek|tProperty)))|Write(?:Bytes|Packets))|ormatGetProperty(?:Info)?)|HardwareUnload|O(?:bject(?:AddPropertyListener(?:Block)?|GetPropertyData(?:Size)?|HasProperty|IsPropertySettable|RemovePropertyListener(?:Block)?|S(?:etPropertyData|how))|utputUnitSt(?:art|op))|Queue(?:A(?:ddPropertyListener|llocateBuffer(?:WithPacketDescriptions)?)|CreateTimeline|D(?:evice(?:Get(?:CurrentTime|NearestStartTime)|TranslateTime)|ispose(?:Timeline)?)|EnqueueBuffer(?:WithParameters)?|F(?:lush|reeBuffer)|Get(?:CurrentTime|P(?:arameter|roperty(?:Size)?))|New(?:Input(?:WithDispatchQueue)?|Output(?:WithDispatchQueue)?)|OfflineRender|P(?:ause|r(?:ime|ocessingTap(?:Dispose|GetSourceAudio|New)))|Re(?:movePropertyListener|set)|S(?:et(?:OfflineRenderFormat|P(?:arameter|roperty))|t(?:art|op)))|Services(?:AddSystemSoundCompletion|CreateSystemSoundID|DisposeSystemSoundID|GetProperty(?:Info)?|Play(?:AlertSound|SystemSound)|RemoveSystemSoundCompletion|SetProperty)|Unit(?:Add(?:PropertyListener|RenderNotify)|GetP(?:arameter|roperty(?:Info)?)|Initialize|Process(?:Multiple)?|Re(?:move(?:PropertyListenerWithUserData|RenderNotify)|nder|set)|S(?:cheduleParameters|etP(?:arameter|roperty))|Uninitialize))|thorization(?:C(?:opy(?:Info|Rights(?:Async)?)|reate(?:FromExternalForm)?)|Free(?:ItemSet)?|MakeExternalForm|Right(?:Get|Remove|Set))))|C(?:A(?:C(?:lock(?:A(?:ddListener|rm)|B(?:arBeatTimeToBeats|eatsToBarBeatTime)|Dis(?:arm|pose)|Get(?:CurrentT(?:empo|ime)|P(?:layRate|roperty(?:Info)?)|StartTime)|New|ParseMIDI|RemoveListener|S(?:MPTETimeToSeconds|e(?:condsToSMPTETime|t(?:CurrentT(?:empo|ime)|P(?:layRate|roperty)))|t(?:art|op))|TranslateTime)|urrentMediaTime)|Show(?:File)?|Transform3D(?:Concat|EqualToTransform|GetAffineTransform|I(?:nvert|s(?:Affine|Identity))|Make(?:AffineTransform|Rotation|Scale|Translation)|Rotate|Scale|Translate))|C_SHA(?:1(?:_(?:Final|Init|Update))?|2(?:24(?:_(?:Final|Init|Update))?|56(?:_(?:Final|Init|Update))?)|384(?:_(?:Final|Init|Update))?|512(?:_(?:Final|Init|Update))?)|F(?:H(?:TTP(?:Authentication(?:AppliesToRequest|C(?:opy(?:Domains|Method|Realm)|reateFromResponse)|GetTypeID|IsValid|Requires(?:AccountDomain|OrderedRequests|UserNameAndPassword))|Message(?:A(?:ddAuthentication|pp(?:endBytes|lyCredential(?:Dictionary|s)))|C(?:opy(?:AllHeaderFields|Body|HeaderFieldValue|Re(?:quest(?:Method|URL)|sponseStatusLine)|SerializedMessage|Version)|reate(?:Copy|Empty|Re(?:quest|sponse)))|Get(?:ResponseStatusCode|TypeID)|Is(?:HeaderComplete|Request)|Set(?:Body|HeaderFieldValue)))|ost(?:C(?:ancelInfoResolution|reate(?:Copy|With(?:Address|Name)))|Get(?:Addressing|Names|Reachability|TypeID)|S(?:cheduleWithRunLoop|etClient|tartInfoResolution)|UnscheduleFromRunLoop))|Net(?:Service(?:Browser(?:Create|GetTypeID|Invalidate|S(?:cheduleWithRunLoop|earchFor(?:Domains|Services)|topSearch)|UnscheduleFromRunLoop)|C(?:ancel|reate(?:Copy|DictionaryWithTXTData|TXTDataWithDictionary)?)|Get(?:Addressing|Domain|Name|PortNumber|T(?:XTData|argetHost|ype(?:ID)?))|Monitor(?:Create|GetTypeID|Invalidate|S(?:cheduleWithRunLoop|t(?:art|op))|UnscheduleFromRunLoop)|Re(?:gisterWithOptions|solveWithTimeout)|S(?:cheduleWithRunLoop|et(?:Client|TXTData))|UnscheduleFromRunLoop)|work(?:Copy(?:ProxiesFor(?:AutoConfigurationScript|URL)|SystemProxySettings)|ExecuteProxyAutoConfiguration(?:Script|URL)))|S(?:ocketStreamSOCKSGetError(?:Subdomain)?|treamCreatePairWithSocketTo(?:CFHost|NetService)))|G(?:Display(?:CreateUUIDFromDisplayID|GetDisplayIDFromUUID)|Image(?:Destination(?:AddImage(?:FromSource)?|C(?:opyTypeIdentifiers|reateWith(?:Data(?:Consumer)?|URL))|Finalize|GetTypeID|SetProperties)|MetadataGetTypeID|Source(?:C(?:opy(?:Properties(?:AtIndex)?|TypeIdentifiers)|reate(?:I(?:mageAtIndex|ncremental)|ThumbnailAtIndex|With(?:Data(?:Provider)?|URL)))|Get(?:Count|Status(?:AtIndex)?|Type(?:ID)?)|UpdateData(?:Provider)?))|L(?:C(?:hoosePixelFormat|learDrawable|opyContext|reate(?:Context|PBuffer))|D(?:es(?:cribe(?:P(?:Buffer|ixelFormat)|Renderer)|troy(?:Context|P(?:Buffer|ixelFormat)|RendererInfo))|isable)|E(?:nable|rrorString)|FlushDrawable|Get(?:C(?:ontextRetainCount|urrentContext)|GlobalOption|O(?:ffScreen|ption)|P(?:Buffer(?:RetainCount)?|arameter|ixelFormat(?:RetainCount)?)|ShareGroup|V(?:ersion|irtualScreen))|IsEnabled|LockContext|QueryRendererInfo|Re(?:lease(?:Context|P(?:Buffer|ixelFormat))|tain(?:Context|P(?:Buffer|ixelFormat)))|Set(?:CurrentContext|FullScreen(?:OnDisplay)?|GlobalOption|O(?:ffScreen|ption)|P(?:Buffer|arameter)|VirtualScreen)|TexImage(?:IOSurface2D|PBuffer)|U(?:nlockContext|pdateContext)))|M(?:CalibrateDisplay|Plugin(?:ExamineContext|HandleSelection|PostMenuCleanup)|S(?:Decoder(?:C(?:opy(?:AllCerts|Content|DetachedContent|EncapsulatedContentType|Signer(?:Cert|EmailAddress|Status))|reate)|FinalizeMessage|Get(?:NumSigners|TypeID)|IsContentEncrypted|SetDetachedContent|UpdateMessage)|Encode(?:Content|r(?:Add(?:Recipients|S(?:igne(?:dAttributes|rs)|upportingCerts))|C(?:opy(?:Enc(?:apsulatedContentType|odedContent)|Recipients|S(?:igners|upportingCerts))|reate)|Get(?:CertificateChainMode|HasDetachedContent|TypeID)|Set(?:CertificateChainMode|EncapsulatedContentTypeOID|HasDetachedContent)|UpdateContent))))|S(?:Backup(?:IsItemExcluded|SetItemExcluded)|DiskSpace(?:CancelRecovery|GetRecoveryEstimate|StartRecovery)|Get(?:DefaultIdentityAuthority|LocalIdentityAuthority|ManagedIdentityAuthority)|Identity(?:A(?:dd(?:Alias|Member)|uth(?:enticateUsingPassword|ority(?:CopyLocalizedName|GetTypeID)))|C(?:ommit(?:Asynchronously)?|reate(?:Copy|GroupMembershipQuery|PersistentReference)?)|Delete|Get(?:A(?:liases|uthority)|C(?:ertificate|lass)|EmailAddress|FullName|Image(?:Data(?:Type)?|URL)|Posix(?:ID|Name)|TypeID|UUID)|Is(?:Committing|Enabled|Hidden|MemberOfGroup)|Query(?:C(?:opyResults|reate(?:For(?:CurrentUser|Name|P(?:ersistentReference|osixID)|UUID))?)|Execute(?:Asynchronously)?|GetTypeID|Stop)|Remove(?:Alias|Client|Member)|Set(?:Certificate|EmailAddress|FullName|I(?:mage(?:Data|URL)|sEnabled)|Password)))|T(?:F(?:ont(?:C(?:o(?:llection(?:C(?:opy(?:ExclusionDescriptors|FontAttribute(?:s)?|QueryDescriptors)|reate(?:CopyWithFontDescriptors|FromAvailableFonts|M(?:atchingFontDescriptors(?:ForFamily|SortedWithCallback|WithOptions)?|utableCopy)|WithFontDescriptors))|GetTypeID|Set(?:ExclusionDescriptors|QueryDescriptors))|py(?:A(?:ttribute|vailableTables)|CharacterSet|DisplayName|F(?:amilyName|eature(?:Settings|s)|ontDescriptor|ullName)|GraphicsFont|LocalizedName|Name|PostScriptName|SupportedLanguages|T(?:able|raits)|Variation(?:Axes)?))|reate(?:CopyWith(?:Attributes|Family|SymbolicTraits)|ForString|PathForGlyph|UIFontForLanguage|With(?:FontDescriptor(?:AndOptions)?|GraphicsFont|Name(?:AndOptions)?|PlatformFont)))|D(?:escriptor(?:C(?:opy(?:Attribute(?:s)?|LocalizedAttribute)|reate(?:CopyWith(?:Attributes|Feature|Variation)|MatchingFontDescriptor(?:s)?|With(?:Attributes|NameAndSize)))|GetTypeID)|rawGlyphs)|Get(?:A(?:dvancesForGlyphs|scent)|Bounding(?:Box|RectsForGlyphs)|CapHeight|Descent|Glyph(?:Count|WithName|sForCharacters)|L(?:eading|igatureCaretPositions)|Matrix|PlatformFont|S(?:ize|lantAngle|tringEncoding|ymbolicTraits)|TypeID|Un(?:derline(?:Position|Thickness)|itsPerEm)|VerticalTranslationsForGlyphs|XHeight)|Manager(?:C(?:o(?:mpareFontFamilyNames|py(?:Available(?:Font(?:FamilyNames|URLs)|PostScriptNames)|RegisteredFontDescriptors))|reateFont(?:Descriptor(?:FromData|sFromURL)|RequestRunLoopSource))|EnableFontDescriptors|Get(?:AutoActivationSetting|ScopeForURL)|IsSupportedFont|Re(?:gisterFonts(?:ForURL|WithAssetNames)|questFonts)|SetAutoActivationSetting|UnregisterFontsForURL))|rame(?:Draw|Get(?:FrameAttributes|Line(?:Origins|s)|Path|StringRange|TypeID|VisibleStringRange)|setter(?:Create(?:Frame|WithAttributedString)|GetType(?:ID|setter)|SuggestFrameSizeWithConstraints)))|G(?:etCoreTextVersion|lyphInfo(?:CreateWith(?:CharacterIdentifier|Glyph(?:Name)?)|Get(?:Character(?:Collection|Identifier)|GlyphName|TypeID)))|Line(?:Create(?:JustifiedLine|TruncatedLine|WithAttributedString)|Draw|Get(?:Glyph(?:Count|Runs)|ImageBounds|OffsetForStringIndex|PenOffsetForFlush|String(?:IndexForPosition|Range)|T(?:railingWhitespaceWidth|yp(?:eID|ographicBounds))))|ParagraphStyle(?:Create(?:Copy)?|Get(?:TypeID|ValueForSpecifier))|Run(?:D(?:elegate(?:Create|Get(?:RefCon|TypeID))|raw)|Get(?:A(?:dvances(?:Ptr)?|ttributes)|Glyph(?:Count|s(?:Ptr)?)|ImageBounds|Positions(?:Ptr)?|St(?:atus|ring(?:Indices(?:Ptr)?|Range))|T(?:extMatrix|yp(?:eID|ographicBounds))))|T(?:extTab(?:Create|Get(?:Alignment|Location|Options|TypeID))|ypesetter(?:Create(?:Line(?:WithOffset)?|WithAttributedString(?:AndOptions)?)|GetTypeID|Suggest(?:ClusterBreak(?:WithOffset)?|LineBreak(?:WithOffset)?))))|V(?:Buffer(?:GetAttachment(?:s)?|PropagateAttachments|Re(?:lease|moveA(?:llAttachments|ttachment)|tain)|SetAttachment(?:s)?)|DisplayLink(?:CreateWith(?:ActiveCGDisplays|CGDisplay(?:s)?|OpenGLDisplayMask)|Get(?:ActualOutputVideoRefreshPeriod|Current(?:CGDisplay|Time)|NominalOutputVideoRefreshPeriod|OutputVideoLatency|TypeID)|IsRunning|Re(?:lease|tain)|S(?:et(?:CurrentCGDisplay(?:FromOpenGLContext)?|Output(?:Callback|Handler))|t(?:art|op))|TranslateTime)|Get(?:CurrentHostTime|HostClock(?:Frequency|MinimumTimeDelta))|ImageBuffer(?:Get(?:C(?:leanRect|olorSpace)|DisplaySize|EncodedSize)|IsFlipped)|Pixel(?:Buffer(?:Create(?:ResolvedAttributesDictionary|With(?:Bytes|IOSurface|PlanarBytes))?|FillExtendedPixels|Get(?:B(?:aseAddress(?:OfPlane)?|ytesPerRow(?:OfPlane)?)|DataSize|ExtendedPixels|Height(?:OfPlane)?|IOSurface|P(?:ixelFormatType|laneCount)|TypeID|Width(?:OfPlane)?)|IsPlanar|LockBaseAddress|Pool(?:Create(?:PixelBuffer(?:WithAuxAttributes)?)?|Flush|Get(?:Attributes|PixelBufferAttributes|TypeID)|Re(?:lease|tain))|Re(?:lease|tain)|UnlockBaseAddress)|FormatDescription(?:ArrayCreateWithAllPixelFormatTypes|CreateWithPixelFormatType|RegisterDescriptionWithPixelFormatType)))|allNextEventHandler|h(?:ange(?:TextToUnicodeInfo|UnicodeToTextInfo)|eckEventQueueForUserCancel)|o(?:lorSync(?:C(?:MM(?:C(?:opy(?:CMMIdentifier|LocalizedName)|reate)|Get(?:Bundle|TypeID))|reateCodeFragment)|Device(?:CopyDeviceInfo|SetCustomProfiles)|Iterate(?:DeviceProfiles|Installed(?:CMMs|Profiles))|Profile(?:C(?:o(?:ntainsTag|py(?:D(?:ata|escriptionString)|Header|Tag(?:Signatures)?))|reate(?:D(?:eviceProfile|isplayTransferTablesFromVCGT)|Link|Mutable(?:Copy)?|With(?:DisplayID|Name|URL))?)|EstimateGamma(?:WithDisplayID)?|Get(?:DisplayTransferFormulaFromVCGT|MD5|TypeID|URL)|Install|RemoveTag|Set(?:Header|Tag)|Uninstall|Verify)|RegisterDevice|Transform(?:C(?:o(?:nvert|pyProperty)|reate)|GetTypeID|SetProperty)|UnregisterDevice)|n(?:tinueSpeech|vertFrom(?:PStringToUnicode|TextToUnicode|UnicodeTo(?:PString|ScriptCodeRun|Text(?:Run)?)))|py(?:Event(?:As|CGEvent)?|NameFromSoundBank|PhonemesFromText|S(?:peechProperty|ymbolicHotKeys)|ThemeIdentifier)|unt(?:UnicodeMappings|Voices))|reate(?:CompDescriptor|Event(?:WithCGEvent)?|LogicalDescriptor|O(?:bjSpecifier|ffsetDescriptor)|RangeDescriptor|Text(?:Encoding|ToUnicodeInfo(?:ByEncoding)?)|UnicodeToText(?:Info(?:ByEncoding)?|RunInfo(?:By(?:Encoding|ScriptCode))?)))|D(?:A(?:A(?:ddCallbackToSession|pprovalSession(?:Create|GetTypeID|ScheduleWithRunLoop|UnscheduleFromRunLoop))|CallbackCreate|Disk(?:C(?:opy(?:Description|IOMedia|WholeDisk)|reateFrom(?:BSDName|IOMedia|VolumePath))|Get(?:BSDName|TypeID))|GetCallbackFromSession|RemoveCallbackFromSession(?:WithKey)?|Session(?:Create|GetTypeID|S(?:cheduleWithRunLoop|etDispatchQueue)|UnscheduleFromRunLoop))|CS(?:CopyTextDefinition|GetTermRangeInString)|R(?:AudioTrackCreateWithURL|Burn(?:Abort|C(?:opyStatus|reate)|Get(?:Device|Properties|TypeID)|SetProperties|WriteLayout)|C(?:DTextBlock(?:Create(?:ArrayFromPackList)?|Flatten|Get(?:Properties|T(?:rackDictionaries|ypeID)|Value)|Set(?:Properties|TrackDictionaries|Value))|opy(?:DeviceArray|LocalizedStringFor(?:AdditionalSense|DiscRecordingError|SenseCode|Value)))|Device(?:Acquire(?:ExclusiveAccess|MediaReservation)|C(?:loseTray|opy(?:DeviceFor(?:BSDName|IORegistryEntryPath)|Info|Status))|EjectMedia|GetTypeID|IsValid|KPSForXFactor|OpenTray|Release(?:ExclusiveAccess|MediaReservation)|XFactorForKPS)|Erase(?:C(?:opyStatus|reate)|Get(?:Device|Properties|TypeID)|S(?:etProperties|tart))|F(?:SObject(?:Copy(?:BaseName|FilesystemPropert(?:ies|y)|MangledName(?:s)?|RealURL|SpecificName(?:s)?)|Get(?:FilesystemMask|Parent)|IsVirtual|Set(?:BaseName|Filesystem(?:Mask|Propert(?:ies|y))|SpecificName(?:s)?))|ile(?:Create(?:RealWithURL|Virtual(?:Link|With(?:Callback|Data)))|GetTypeID|systemTrack(?:Create|EstimateOverhead))|older(?:AddChild|C(?:o(?:nvertRealToVirtual|pyChildren|untChildren)|reate(?:RealWithURL|Virtual))|GetTypeID|RemoveChild))|Get(?:RefCon|Version)|NotificationCenter(?:AddObserver|Create(?:RunLoopSource)?|GetTypeID|RemoveObserver)|SetRefCon|Track(?:Create|EstimateLength|Get(?:Properties|TypeID)|S(?:etProperties|peedTest)))|ebugPrint(?:Event|MainEventQueue)|is(?:ableSecureEventInput|pose(?:AE(?:Coerce(?:DescUPP|PtrUPP)|DisposeExternalUPP|EventHandlerUPP|FilterUPP|IdleUPP)|C(?:a(?:librate(?:EventUPP|UPP)|nCalibrateUPP)|ontrol(?:ActionUPP|EditTextValidationUPP|KeyFilterUPP|UserPane(?:ActivateUPP|DrawUPP|FocusUPP|HitTestUPP|IdleUPP|KeyDownUPP|TrackingUPP)))|D(?:ataBrowser(?:A(?:cceptDragUPP|ddDragItemUPP)|DrawItemUPP|EditItemUPP|GetContextualMenuUPP|HitTestUPP|Item(?:AcceptDragUPP|CompareUPP|D(?:ataUPP|ragRgnUPP)|HelpContentUPP|Notification(?:UPP|WithItemUPP)|ReceiveDragUPP|UPP)|PostProcessDragUPP|ReceiveDragUPP|SelectContextualMenuUPP|TrackingUPP)|ragInputUPP)|E(?:ditUnicodePostUpdateUPP|vent(?:ComparatorUPP|HandlerUPP|Loop(?:IdleTimerUPP|TimerUPP)))|HM(?:ControlContentUPP|Menu(?:ItemContentUPP|TitleContentUPP)|WindowContentUPP)|I(?:con(?:ActionUPP|GetterUPP)|ndexToUCStringUPP)|M(?:odalFilter(?:UPP|YDUPP)|usic(?:EventIterator|Player|Sequence))|N(?:ColorChangedUPP|MUPP)|OS(?:A(?:ActiveUPP|CreateAppleEventUPP|SendUPP)|L(?:A(?:ccessorUPP|djustMarksUPP)|Co(?:mpareUPP|untUPP)|DisposeTokenUPP|Get(?:ErrDescUPP|MarkTokenUPP)|MarkUPP))|SpeechChannel|T(?:XN(?:ActionNameMapperUPP|ContextualMenuSetupUPP|FindUPP|ScrollInfoUPP)|extToUnicodeInfo)|U(?:nicodeToText(?:FallbackUPP|Info|RunInfo)|serItemUPP))))|E(?:nableSecureEventInput|xtAudioFile(?:CreateWithURL|Dispose|GetProperty(?:Info)?|OpenURL|Read|Se(?:ek|tProperty)|Tell|Wr(?:apAudioFileID|ite(?:Async)?)))|F(?:C(?:Add(?:Collection|FontDescriptorToCollection)|Copy(?:CollectionNames|FontDescriptorsInCollection)|FontDescriptorCreateWith(?:FontAttributes|Name)|Remove(?:Collection|FontDescriptorFromCollection))|P(?:IsFontPanelVisible|ShowHideFontPanel)|SEvent(?:Stream(?:C(?:opy(?:Description|PathsBeingWatched)|reate(?:RelativeToDevice)?)|Flush(?:Async|Sync)|Get(?:DeviceBeingWatched|LatestEventId)|Invalidate|Re(?:lease|tain)|S(?:cheduleWithRunLoop|etDispatchQueue|how|t(?:art|op))|UnscheduleFromRunLoop)|s(?:CopyUUIDForDevice|Get(?:CurrentEventId|LastEventIdForDeviceBeforeTime)|PurgeEventsForDeviceUpToEventId))|indSpecificEventInQueue|lush(?:Event(?:Queue|sMatchingListFromQueue)|SpecificEventsFromQueue))|Get(?:A(?:pplication(?:EventTarget|TextEncoding)|udioUnitParameterDisplayType)|C(?:FRunLoopFromEventLoop|olor|urrent(?:ButtonState|Event(?:ButtonState|KeyModifiers|Loop|Queue|Time)?|KeyModifiers))|Event(?:Class|DispatcherTarget|Kind|MonitorTarget|Parameter|RetainCount|Time)|I(?:con(?:FamilyData|RefVariant)|ndVoice)|Keys|M(?:ainEvent(?:Loop|Queue)|enuTrackingData)|NumEventsInQueue|S(?:criptInfoFromTextEncoding|peech(?:Pitch|Rate)|y(?:mbolicHotKeyMode|stemUIMode))|T(?:extEncoding(?:Base|F(?:ormat|romScriptInfo)|Name|Variant)|hemeMe(?:nu(?:ItemExtra|SeparatorHeight|TitleExtra)|tric))|Voice(?:Description|Info))|HI(?:DictionaryWindowShow|GetMousePosition|MouseTrackingGetParameters|Object(?:AddDelegate|C(?:opy(?:ClassID|Delegates)|reate(?:FromBundle)?)|DynamicCast|FromEventTarget|GetEvent(?:HandlerObject|Target)|Is(?:ArchivingIgnored|OfClass)|PrintDebugInfo|Re(?:gisterSubclass|moveDelegate)|UnregisterClass)|PointConvert|RectConvert|S(?:earchWindowShow|hape(?:C(?:ontainsPoint|reate(?:Copy|Difference|Empty|Intersection|Mutable(?:Copy|WithRect)?|Union|With(?:QDRgn|Rect)|Xor))|Difference|Enumerate|Get(?:AsQDRgn|Bounds|TypeID)|I(?:n(?:set|tersect(?:sRect)?)|s(?:Empty|Rectangular))|Offset|ReplacePathInCGContext|Set(?:Empty|WithShape)|Union(?:WithRect)?|Xor)|izeConvert)|Theme(?:ApplyBackground|B(?:eginFocus|rushCreateCGColor)|Draw(?:B(?:ackground|utton)|ChasingArrows|F(?:ocusRect|rame)|G(?:enericWell|r(?:abber|o(?:upBox|wBox)))|Header|Menu(?:Ba(?:ckground|rBackground)|Item|Separator|Title)|P(?:aneSplitter|lacard|opupArrow)|S(?:crollBarDelimiters|e(?:gment|parator))|T(?:ab(?:Pane)?|extBox|i(?:ckMark|tleBarWidget)|rack(?:TickMarks)?)|WindowFrame)|EndFocus|Get(?:Button(?:BackgroundBounds|ContentBounds|Shape)|GrowBoxBounds|MenuBackgroundShape|ScrollBarTrackRect|T(?:ab(?:DrawShape|Pane(?:ContentShape|DrawShape)|Shape)|ext(?:ColorForThemeBrush|Dimensions)|rack(?:Bounds|DragRect|LiveValue|Part(?:Bounds|s)|Thumb(?:PositionFrom(?:Bounds|Offset)|Shape)))|UIFontType|Window(?:RegionHit|Shape))|HitTest(?:ScrollBarArrows|Track)|Set(?:Fill|Stroke|TextFill)))|I(?:O(?:BSDNameMatching|C(?:atalogue(?:GetData|ModuleLoaded|Reset|SendData|Terminate)|onnect(?:Add(?:Client|Ref)|Call(?:Async(?:Method|S(?:calarMethod|tructMethod))|Method|S(?:calarMethod|tructMethod))|GetService|MapMemory(?:64)?|Release|Set(?:CFPropert(?:ies|y)|NotificationPort)|Trap(?:0|1|2|3|4|5|6)|UnmapMemory(?:64)?)|reateReceivePort)|DispatchCalloutFromMessage|Iterator(?:IsValid|Next|Reset)|Kit(?:GetBusyState|WaitQuiet)|MasterPort|NotificationPort(?:Create|Destroy|Get(?:MachPort|RunLoopSource)|Set(?:DispatchQueue|ImportanceReceiver))|O(?:bject(?:Co(?:nformsTo|py(?:BundleIdentifierForClass|Class|SuperclassForClass))|Get(?:Class|KernelRetainCount|RetainCount|UserRetainCount)|IsEqualTo|Re(?:lease|tain))|penFirmwarePathMatching)|Registry(?:CreateIterator|Entry(?:Create(?:CFPropert(?:ies|y)|Iterator)|FromPath|Get(?:Child(?:Entry|Iterator)|LocationInPlane|Name(?:InPlane)?|P(?:a(?:rent(?:Entry|Iterator)|th)|roperty)|RegistryEntryID)|I(?:DMatching|nPlane)|Se(?:archCFProperty|tCFPropert(?:ies|y)))|GetRootEntry|IteratorE(?:nterEntry|xitEntry))|S(?:ervice(?:A(?:dd(?:InterestNotification|MatchingNotification|Notification)|uthorize)|Close|Get(?:BusyState|MatchingService(?:s)?)|Match(?:PropertyTable|ing)|NameMatching|O(?:FPathToBSDName|pen(?:AsFileDescriptor)?)|RequestProbe|WaitQuiet)|urface(?:AlignProperty|C(?:opy(?:AllValues|Value)|reate(?:MachPort|XPCObject)?)|DecrementUseCount|Get(?:AllocSize|B(?:aseAddress(?:OfPlane)?|ytesPer(?:Element(?:OfPlane)?|Row(?:OfPlane)?))|Element(?:Height(?:OfPlane)?|Width(?:OfPlane)?)|Height(?:OfPlane)?|ID|P(?:ixelFormat|laneCount|roperty(?:Alignment|Maximum))|Seed|TypeID|UseCount|Width(?:OfPlane)?)|I(?:ncrementUseCount|sInUse)|Lo(?:ck|okup(?:From(?:MachPort|XPCObject))?)|Remove(?:AllValues|Value)|SetValue(?:s)?|Unlock)))|conRef(?:ContainsCGPoint|IntersectsCGRect|To(?:HIShape|IconFamily))|n(?:stallEvent(?:Handler|LoopTimer)|voke(?:AE(?:Coerce(?:DescUPP|PtrUPP)|DisposeExternalUPP|EventHandlerUPP|FilterUPP|IdleUPP)|C(?:a(?:librate(?:EventUPP|UPP)|nCalibrateUPP)|ontrol(?:ActionUPP|EditTextValidationUPP|KeyFilterUPP|UserPane(?:ActivateUPP|DrawUPP|FocusUPP|HitTestUPP|IdleUPP|KeyDownUPP|TrackingUPP)))|D(?:ataBrowser(?:A(?:cceptDragUPP|ddDragItemUPP)|DrawItemUPP|EditItemUPP|GetContextualMenuUPP|HitTestUPP|Item(?:AcceptDragUPP|CompareUPP|D(?:ataUPP|ragRgnUPP)|HelpContentUPP|Notification(?:UPP|WithItemUPP)|ReceiveDragUPP|UPP)|PostProcessDragUPP|ReceiveDragUPP|SelectContextualMenuUPP|TrackingUPP)|ragInputUPP)|E(?:ditUnicodePostUpdateUPP|vent(?:ComparatorUPP|HandlerUPP|Loop(?:IdleTimerUPP|TimerUPP)))|HM(?:ControlContentUPP|Menu(?:ItemContentUPP|TitleContentUPP)|WindowContentUPP)|I(?:con(?:ActionUPP|GetterUPP)|ndexToUCStringUPP)|ModalFilter(?:UPP|YDUPP)|N(?:ColorChangedUPP|MUPP)|OS(?:A(?:ActiveUPP|CreateAppleEventUPP|SendUPP)|L(?:A(?:ccessorUPP|djustMarksUPP)|Co(?:mpareUPP|untUPP)|DisposeTokenUPP|Get(?:ErrDescUPP|MarkTokenUPP)|MarkUPP))|TXN(?:ActionNameMapperUPP|ContextualMenuSetupUPP|FindUPP|ScrollInfoUPP)|U(?:nicodeToTextFallbackUPP|serItemUPP)))|s(?:EventInQueue|IconRefMaskEmpty|SecureEventInputEnabled|UserCancelEventRef))|JS(?:C(?:heckScriptSyntax|lass(?:Create|Re(?:lease|tain))|ontextG(?:etG(?:lobal(?:Context|Object)|roup)|roup(?:Create|Re(?:lease|tain))))|EvaluateScript|G(?:arbageCollect|lobalContext(?:Create(?:InGroup)?|Re(?:lease|tain)))|Object(?:C(?:allAs(?:Constructor|Function)|opyPropertyNames)|DeleteProperty|GetPr(?:ivate|o(?:perty(?:AtIndex)?|totype))|HasProperty|Is(?:Constructor|Function)|Make(?:Array|Constructor|Date|Error|Function(?:WithCallback)?|RegExp)?|SetPr(?:ivate|o(?:perty(?:AtIndex)?|totype)))|PropertyNameA(?:ccumulatorAddName|rray(?:Get(?:Count|NameAtIndex)|Re(?:lease|tain)))|String(?:C(?:opyCFString|reateWith(?:C(?:FString|haracters)|UTF8CString))|Get(?:CharactersPtr|Length|MaximumUTF8CStringSize|UTF8CString)|IsEqual(?:ToUTF8CString)?|Re(?:lease|tain))|Value(?:CreateJSONString|GetType|Is(?:Boolean|Equal|InstanceOfConstructor|Nu(?:ll|mber)|Object(?:OfClass)?|Stri(?:ctEqual|ng)|Undefined)|Make(?:Boolean|FromJSONString|Nu(?:ll|mber)|String|Undefined)|Protect|To(?:Boolean|Number|Object|StringCopy)|Unprotect))|KBGetLayoutType|L(?:MGetK(?:bd(?:Last|Type)|ey(?:RepThresh|Thresh))|S(?:C(?:anURLAcceptURL|opy(?:A(?:llRoleHandlersForContentType|pplicationURLsForURL)|DefaultRoleHandlerForContentType))|Open(?:CFURLRef|FromURLSpec)|RegisterURL|SetDefault(?:HandlerForURLScheme|RoleHandlerForContentType))|o(?:cale(?:Operation(?:CountNames|Get(?:IndName|Name))|Ref(?:FromL(?:angOrRegionCode|ocaleString)|GetPartString)|StringToLangAndRegionCodes)|ngDoubleTo(?:SInt64|UInt64)))|M(?:D(?:CopyLabel(?:Kinds|WithUUID|s(?:MatchingExpression|WithKind))|Item(?:C(?:opy(?:Attribute(?:List|Names|s)?|Labels)|reate(?:WithURL)?)|GetTypeID|RemoveLabel|SetLabel|sCreateWithURLs)|Label(?:C(?:opyAttribute(?:Name)?|reate)|Delete|GetTypeID|SetAttributes)|Query(?:C(?:opy(?:QueryString|SortingAttributes|Value(?:ListAttributes|sOfAttribute))|reate(?:ForItems|Subset)?)|DisableUpdates|E(?:nableUpdates|xecute)|Get(?:AttributeValueOfResultAtIndex|BatchingParameters|CountOfResultsWithAttributeValue|IndexOfResult|Result(?:AtIndex|Count)|SortOptionFlagsForAttribute|TypeID)|IsGatheringComplete|S(?:et(?:BatchingParameters|Create(?:ResultFunction|ValueFunction)|DispatchQueue|MaxCount|S(?:earchScope|ort(?:Comparator(?:Block)?|O(?:ptionFlagsForAttribute|rder))))|top))|SchemaCopy(?:A(?:llAttributes|ttributesForContentType)|Display(?:DescriptionForAttribute|NameForAttribute)|MetaAttributesForAttribute))|IDI(?:Client(?:Create|Dispose)|De(?:stinationCreate|viceGet(?:Entity|NumberOfEntities))|En(?:dpoint(?:Dispose|GetEntity)|tityGet(?:De(?:stination|vice)|NumberOf(?:Destinations|Sources)|Source))|FlushOutput|Get(?:De(?:stination|vice)|ExternalDevice|NumberOf(?:De(?:stinations|vices)|ExternalDevices|Sources)|Source)|InputPortCreate|O(?:bject(?:FindByUniqueID|Get(?:D(?:ataProperty|ictionaryProperty)|IntegerProperty|Properties|StringProperty)|RemoveProperty|Set(?:D(?:ataProperty|ictionaryProperty)|IntegerProperty|StringProperty))|utputPortCreate)|P(?:acket(?:List(?:Add|Init)|Next)|ort(?:ConnectSource|Dis(?:connectSource|pose)))|Re(?:ceived|start)|S(?:end(?:Sysex)?|ourceCreate))|akeVoiceSpec|usic(?:Device(?:MIDIEvent|S(?:t(?:artNote|opNote)|ysEx))|EventIterator(?:DeleteEvent|GetEventInfo|Has(?:CurrentEvent|NextEvent|PreviousEvent)|NextEvent|PreviousEvent|Se(?:ek|tEvent(?:Info|Time)))|Player(?:Get(?:BeatsForHostTime|HostTimeForBeats|PlayRateScalar|Sequence|Time)|IsPlaying|Preroll|S(?:et(?:PlayRateScalar|Sequence|Time)|t(?:art|op)))|Sequence(?:B(?:arBeatTimeToBeats|eatsToBarBeatTime)|DisposeTrack|File(?:Create(?:Data)?|Load(?:Data)?)|Get(?:AUGraph|BeatsForSeconds|In(?:dTrack|foDictionary)|S(?:MPTEResolution|e(?:condsForBeats|quenceType))|T(?:empoTrack|rack(?:Count|Index)))|NewTrack|Reverse|Set(?:AUGraph|MIDIEndpoint|S(?:MPTEResolution|equenceType)|UserCallback))|Track(?:C(?:lear|opyInsert|ut)|Get(?:Dest(?:MIDIEndpoint|Node)|Property|Sequence)|M(?:erge|oveEvents)|New(?:AUPresetEvent|Extended(?:NoteEvent|TempoEvent)|M(?:IDI(?:ChannelEvent|NoteEvent|RawDataEvent)|etaEvent)|ParameterEvent|UserEvent)|Set(?:Dest(?:MIDIEndpoint|Node)|Property))))|N(?:PickColor|X(?:Convert(?:Host(?:DoubleToSwapped|FloatToSwapped)|Swapped(?:DoubleToHost|FloatToHost))|HostByteOrder|Swap(?:Big(?:DoubleToHost|FloatToHost|IntToHost|Long(?:LongToHost|ToHost)|ShortToHost)|Double|Float|Host(?:DoubleTo(?:Big|Little)|FloatTo(?:Big|Little)|IntTo(?:Big|Little)|Long(?:LongTo(?:Big|Little)|To(?:Big|Little))|ShortTo(?:Big|Little))|Int|L(?:ittle(?:DoubleToHost|FloatToHost|IntToHost|Long(?:LongToHost|ToHost)|ShortToHost)|ong(?:Long)?)|Short))|e(?:arestMacTextEncodings|w(?:AE(?:Coerce(?:DescUPP|PtrUPP)|DisposeExternalUPP|EventHandlerUPP|FilterUPP|IdleUPP)|C(?:a(?:librate(?:EventUPP|UPP)|nCalibrateUPP)|ontrol(?:ActionUPP|EditTextValidationUPP|KeyFilterUPP|UserPane(?:ActivateUPP|DrawUPP|FocusUPP|HitTestUPP|IdleUPP|KeyDownUPP|TrackingUPP)))|D(?:ataBrowser(?:A(?:cceptDragUPP|ddDragItemUPP)|DrawItemUPP|EditItemUPP|GetContextualMenuUPP|HitTestUPP|Item(?:AcceptDragUPP|CompareUPP|D(?:ataUPP|ragRgnUPP)|HelpContentUPP|Notification(?:UPP|WithItemUPP)|ReceiveDragUPP|UPP)|PostProcessDragUPP|ReceiveDragUPP|SelectContextualMenuUPP|TrackingUPP)|ragInputUPP)|E(?:ditUnicodePostUpdateUPP|vent(?:ComparatorUPP|HandlerUPP|Loop(?:IdleTimerUPP|TimerUPP)))|HM(?:ControlContentUPP|Menu(?:ItemContentUPP|TitleContentUPP)|WindowContentUPP)|I(?:con(?:ActionUPP|GetterUPP)|ndexToUCStringUPP)|M(?:odalFilter(?:UPP|YDUPP)|usic(?:EventIterator|Player|Sequence))|N(?:ColorChangedUPP|MUPP)|OS(?:A(?:ActiveUPP|CreateAppleEventUPP|SendUPP)|L(?:A(?:ccessorUPP|djustMarksUPP)|Co(?:mpareUPP|untUPP)|DisposeTokenUPP|Get(?:ErrDescUPP|MarkTokenUPP)|MarkUPP))|SpeechChannel|TXN(?:ActionNameMapperUPP|ContextualMenuSetupUPP|FindUPP|ScrollInfoUPP)|U(?:nicodeToTextFallbackUPP|serItemUPP))|xtAudioFileRegion)|um(?:AudioFileMarkersToNumBytes|BytesToNumAudioFileMarkers))|OS(?:A(?:A(?:ddStorageType|vailableDialect(?:CodeList|s))|Co(?:erce(?:FromDesc|ToDesc)|mpile(?:Execute)?|py(?:DisplayString|ID|S(?:cript(?:ingDefinition(?:FromURL)?)?|ourceString)))|D(?:isp(?:lay|ose)|o(?:Event|Script(?:File)?))|Execute(?:Event)?|Ge(?:nericToRealID|t(?:ActiveProc|C(?:reateProc|urrentDialect)|D(?:efaultScriptingComponent|ialectInfo)|Handler(?:Names)?|Property(?:Names)?|ResumeDispatchProc|S(?:cript(?:DataFromURL|Info|ingComponent(?:FromStored)?)|endProc|ource|torageType|ysTerminology)))|Load(?:Execute(?:File)?|File|ScriptData)?|MakeContext|Re(?:alToGenericID|moveStorageType)|S(?:cript(?:Error|ingComponentName)|et(?:ActiveProc|C(?:reateProc|urrentDialect)|Default(?:ScriptingComponent|Target)|Handler|Property|ResumeDispatchProc|S(?:criptInfo|endProc))|t(?:artRecording|o(?:pRecording|re(?:File)?)))|tomic(?:Dequeue|Enqueue|Fifo(?:Dequeue|Enqueue)))|GetNotificationFromMessage)|P(?:M(?:C(?:GImageCreateWithEPSDataProvider|opy(?:AvailablePPDs|LocalizedPPD|P(?:PDData|ageFormat|rintSettings))|reate(?:GenericPrinter|P(?:ageFormat(?:WithPMPaper)?|rintSettings)|Session))|Get(?:AdjustedPa(?:geRect|perRect)|Co(?:llate|pies)|Duplex|FirstPage|LastPage|Orientation|Page(?:Format(?:ExtendedData|Paper)|Range)|Scale|UnadjustedPa(?:geRect|perRect))|P(?:a(?:geFormat(?:Create(?:DataRepresentation|WithDataRepresentation)|GetPrinterID)|per(?:Create(?:Custom|LocalizedName)|Get(?:Height|ID|Margins|P(?:PDPaperName|rinterID)|Width)|IsCustom))|r(?:eset(?:C(?:opyName|reatePrintSettings)|GetAttributes)|int(?:Settings(?:C(?:opy(?:AsDictionary|Keys)|reate(?:DataRepresentation|WithDataRepresentation))|Get(?:JobName|Value)|Set(?:JobName|Value)|ToOptions(?:WithPrinterAndPageFormat)?)|er(?:C(?:opy(?:De(?:scriptionURL|viceURI)|HostName|Presets|State)|reateFromPrinterID)|Get(?:CommInfo|Driver(?:Creator|ReleaseInfo)|I(?:D|ndexedPrinterResolution)|L(?:anguageInfo|ocation)|M(?:akeAndModelName|imeTypes)|Name|OutputResolution|P(?:aperList|rinterResolutionCount)|State)|Is(?:Default|Favorite|PostScript(?:Capable|Printer)|Remote)|PrintWith(?:File|Provider)|Se(?:ndCommand|t(?:Default|OutputResolution))|WritePostScriptToURL))))|Re(?:lease|tain)|Se(?:rver(?:CreatePrinterList|LaunchPrinterBrowser)|ssion(?:Begin(?:CGDocumentNoDialog|PageNoDialog)|C(?:opy(?:Destination(?:Format|Location)|OutputFormatList)|reateP(?:ageFormatList|rinterList))|DefaultP(?:ageFormat|rintSettings)|E(?:nd(?:DocumentNoDialog|PageNoDialog)|rror)|Get(?:C(?:GGraphicsContext|urrentPrinter)|D(?:ataFromSession|estinationType))|Set(?:CurrentPMPrinter|D(?:ataInSession|estination)|Error)|ValidateP(?:ageFormat|rintSettings))|t(?:Co(?:llate|pies)|Duplex|FirstPage|LastPage|Orientation|Page(?:FormatExtendedData|Range)|Scale))|Workflow(?:CopyItems|SubmitPDFWith(?:Options|Settings)))|a(?:steboard(?:C(?:lear|opy(?:ItemFlavor(?:Data|s)|Name|PasteLocation)|reate)|Get(?:Item(?:Count|FlavorFlags|Identifier)|TypeID)|PutItemFlavor|ResolvePromises|S(?:etP(?:asteLocation|romiseKeeper)|ynchronize))|useSpeechAt)|lotIconRefInContext|o(?:pSymbolicHotKeyMode|stEventToQueue)|rocessHICommand|ushSymbolicHotKeyMode)|Q(?:LThumbnailImageCreate|u(?:eryUnicodeMappings|itEventLoop))|R(?:e(?:ceiveNextEvent|gisterEventHotKey|leaseEvent|moveEvent(?:FromQueue|Handler|LoopTimer|Parameter|TypesFromHandler)|s(?:et(?:TextToUnicodeInfo|UnicodeToText(?:Info|RunInfo))|olveDefaultTextEncoding)|tainEvent|vertTextEncodingToScriptInfo)|unCurrentEventLoop)|S(?:32Set|64(?:A(?:dd|nd)|Bitwise(?:And|Eor|Not|Or)|Div(?:ide)?|Eor|M(?:ax|in|od|ultiply)|N(?:egate|ot)|Or|S(?:et(?:U)?|hift(?:Left|Right)|ubtract))|C(?:Bond(?:Interface(?:C(?:opy(?:A(?:ll|vailableMemberInterfaces)|Status)|reate)|Get(?:MemberInterfaces|Options)|Remove|Set(?:LocalizedDisplayName|MemberInterfaces|Options))|StatusGet(?:InterfaceStatus|MemberInterfaces|TypeID))|CopyLastError|DynamicStore(?:Add(?:TemporaryValue|Value)|C(?:opy(?:Co(?:mputerName|nsoleUser)|KeyList|Loca(?:lHostName|tion)|Multiple|NotifiedKeys|Proxies|Value)|reate(?:RunLoopSource|WithOptions)?)|GetTypeID|KeyCreate(?:Co(?:mputerName|nsoleUser)|HostNames|Location|Network(?:GlobalEntity|Interface(?:Entity)?|ServiceEntity)|Proxies)?|NotifyValue|RemoveValue|Set(?:DispatchQueue|Multiple|NotificationKeys|Value))|Error(?:String)?|Network(?:Connection(?:C(?:opy(?:ExtendedStatus|S(?:erviceID|tatistics)|User(?:Options|Preferences))|reateWithServiceID)|Get(?:Status|TypeID)|S(?:cheduleWithRunLoop|etDispatchQueue|t(?:art|op))|UnscheduleFromRunLoop)|Interface(?:C(?:opy(?:All|M(?:TU|edia(?:Options|SubType(?:Options|s))))|reateWithInterface)|ForceConfigurationRefresh|Get(?:BSDName|Configuration|ExtendedConfiguration|HardwareAddressString|Interface(?:Type)?|LocalizedDisplayName|Supported(?:InterfaceTypes|ProtocolTypes)|TypeID)|Set(?:Configuration|ExtendedConfiguration|M(?:TU|ediaOptions)))|Protocol(?:Get(?:Configuration|Enabled|ProtocolType|TypeID)|Set(?:Configuration|Enabled))|Reachability(?:CreateWith(?:Address(?:Pair)?|Name)|Get(?:Flags|TypeID)|S(?:cheduleWithRunLoop|et(?:Callback|DispatchQueue))|UnscheduleFromRunLoop)|Se(?:rvice(?:AddProtocolType|C(?:opy(?:All|Protocol(?:s)?)?|reate)|EstablishDefaultConfiguration|Get(?:Enabled|Interface|Name|ServiceID|TypeID)|Remove(?:ProtocolType)?|Set(?:Enabled|Name))|t(?:AddService|C(?:o(?:ntainsInterface|py(?:All|Current|Services)?)|reate)|Get(?:Name|Se(?:rviceOrder|tID)|TypeID)|Remove(?:Service)?|Set(?:Current|Name|ServiceOrder))))|Preferences(?:A(?:ddValue|pplyChanges)|C(?:o(?:mmitChanges|pyKeyList)|reate(?:WithAuthorization)?)|Get(?:Signature|TypeID|Value)|Lock|Path(?:CreateUniqueChild|Get(?:Link|Value)|RemoveValue|Set(?:Link|Value))|RemoveValue|S(?:cheduleWithRunLoop|et(?:C(?:allback|omputerName)|DispatchQueue|LocalHostName|Value)|ynchronize)|Un(?:lock|scheduleFromRunLoop))|VLANInterface(?:C(?:opyA(?:ll|vailablePhysicalInterfaces)|reate)|Get(?:Options|PhysicalInterface|Tag)|Remove|Set(?:LocalizedDisplayName|Options|PhysicalInterfaceAndTag)))|Int64To(?:LongDouble|UInt64|Wide)|K(?:Document(?:C(?:opyURL|reate(?:WithURL)?)|Get(?:Name|Parent|SchemeName|TypeID))|Index(?:AddDocument(?:WithText)?|C(?:lose|o(?:mpact|py(?:Document(?:ForDocumentID|IDArrayForTermID|Properties|RefsForDocumentIDs|URLsForDocumentIDs)|InfoForDocumentIDs|Term(?:IDArrayForDocumentID|StringForTermID)))|reateWith(?:MutableData|URL))|DocumentIterator(?:C(?:opyNext|reate)|GetTypeID)|Flush|Get(?:AnalysisProperties|Document(?:Count|ID|State|Term(?:Count|Frequency))|IndexType|Maximum(?:BytesBeforeFlush|DocumentID|TermID)|T(?:erm(?:DocumentCount|IDForTermString)|ypeID))|MoveDocument|OpenWith(?:Data|MutableData|URL)|Re(?:moveDocument|nameDocument)|Set(?:DocumentProperties|MaximumBytesBeforeFlush))|LoadDefaultExtractorPlugIns|S(?:earch(?:C(?:ancel|reate)|FindMatches|GetTypeID)|ummary(?:C(?:opy(?:Paragraph(?:AtIndex|SummaryString)|Sentence(?:AtIndex|SummaryString))|reateWithString)|Get(?:Paragraph(?:Count|SummaryInfo)|Sentence(?:Count|SummaryInfo)|TypeID))))|e(?:c(?:A(?:CL(?:C(?:opy(?:Authorizations|Contents)|reateWithSimpleContents)|GetTypeID|Remove|SetContents|UpdateAuthorizations)|ccess(?:C(?:opy(?:ACLList|MatchingACLList|OwnerAndACL)|reate(?:WithOwnerAndACL)?)|GetTypeID)|ddSharedWebCredential)|C(?:ertificate(?:AddToKeychain|C(?:opy(?:CommonName|Data|EmailAddresses|LongDescription|Preferred|S(?:hortDescription|ubjectSummary)|Values)|reateWithData)|GetTypeID|SetPreferred)|o(?:de(?:C(?:heckValidity(?:WithErrors)?|opy(?:DesignatedRequirement|GuestWithAttributes|Host|Path|S(?:elf|igningInformation|taticCode)))|GetTypeID|MapMemory)|pyErrorMessageString)|reateSharedWebCredentialPassword)|D(?:ec(?:odeTransformCreate|ryptTransform(?:Create|GetTypeID))|igestTransform(?:Create|GetTypeID))|Enc(?:odeTransformCreate|ryptTransform(?:Create|GetTypeID))|GroupTransformGetTypeID|I(?:dentity(?:C(?:opy(?:Certificate|Pr(?:eferred|ivateKey)|SystemIdentity)|reateWithCertificate)|GetTypeID|Set(?:Preferred|SystemIdentity))|tem(?:Add|CopyMatching|Delete|Export|Import|Update))|Key(?:CreateFromData|DeriveFromPassword|Ge(?:nerate(?:Pair(?:Async)?|Symmetric)|t(?:BlockSize|TypeID))|UnwrapSymmetric|WrapSymmetric|chain(?:A(?:dd(?:Callback|GenericPassword|InternetPassword)|ttributeInfoForItemID)|C(?:opy(?:D(?:efault|omain(?:Default|SearchList))|Se(?:archList|ttings))|reate)|Delete|F(?:ind(?:GenericPassword|InternetPassword)|reeAttributeInfo)|Get(?:P(?:ath|referenceDomain)|Status|TypeID|UserInteractionAllowed|Version)|Item(?:C(?:opy(?:A(?:ccess|ttributesAndData)|Content|FromPersistentReference|Keychain)|reate(?:Copy|FromContent|PersistentReference))|Delete|Free(?:AttributesAndData|Content)|GetTypeID|Modify(?:AttributesAndData|Content)|SetAccess)|Lock(?:All)?|Open|RemoveCallback|Set(?:D(?:efault|omain(?:Default|SearchList))|PreferenceDomain|Se(?:archList|ttings)|UserInteractionAllowed)|Unlock))|P(?:KCS12Import|olicy(?:C(?:opyProperties|reate(?:BasicX509|SSL))|GetTypeID))|R(?:andomCopyBytes|equ(?:estSharedWebCredential|irement(?:C(?:opy(?:Data|String)|reateWith(?:Data|String(?:AndErrors)?))|GetTypeID)))|S(?:ignTransformCreate|taticCode(?:C(?:heckValidity(?:WithErrors)?|reateWithPath(?:AndAttributes)?)|GetTypeID))|T(?:ask(?:C(?:opy(?:SigningIdentifier|Value(?:ForEntitlement|sForEntitlements))|reate(?:FromSelf|WithAuditToken))|Get(?:CodeSignStatus|TypeID))|r(?:ansform(?:C(?:o(?:nnectTransforms|pyExternalRepresentation)|reate(?:FromExternalRepresentation|GroupTransform|ReadTransformWithReadStream)?|ustom(?:GetAttribute|SetAttribute))|Execute(?:Async)?|FindByName|Get(?:Attribute|TypeID)|NoData|PushbackAttribute|Register|Set(?:Attribute(?:Action)?|DataAction|TransformAction))|ust(?:C(?:opy(?:AnchorCertificates|CustomAnchorCertificates|P(?:olicies|roperties|ublicKey))|reateWithCertificates)|Get(?:Certificate(?:AtIndex|Count)|T(?:rustResult|ypeID)|VerifyTime)|Set(?:AnchorCertificates(?:Only)?|Options|Policies|VerifyDate|tings(?:C(?:opy(?:Certificates|ModificationDate|TrustSettings)|reateExternalRepresentation)|ImportExternalRepresentation|RemoveTrustSettings|SetTrustSettings))|edApplicationGetTypeID)))|VerifyTransformCreate)|ndEventToEventTarget(?:WithOptions)?|ssion(?:Create|GetInfo)|t(?:AudioUnitParameterDisplayType|Event(?:LoopTimerNextFireTime|Parameter|Time)|F(?:allbackUnicodeToText(?:Run)?|ontInfoForSelection)|IconFamilyData|S(?:peech(?:P(?:itch|roperty)|Rate)|ystemUIMode)))|pe(?:akCFString|ech(?:Busy(?:SystemWide)?|ManagerVersion|Synthesis(?:RegisterModuleURL|UnregisterModuleURL)))|topSpeech(?:At)?)|T(?:EC(?:C(?:lear(?:ConverterContextInfo|SnifferContextInfo)|o(?:nvertText(?:ToMultipleEncodings)?|pyTextEncodingInternetNameAndMIB|unt(?:Available(?:Sniffers|TextEncodings)|D(?:estinationTextEncodings|irectTextEncodingConversions)|MailTextEncodings|SubTextEncodings|WebTextEncodings))|reate(?:Converter(?:FromPath)?|OneToManyConverter|Sniffer))|Dispose(?:Converter|Sniffer)|Flush(?:MultipleEncodings|Text)|Get(?:Available(?:Sniffers|TextEncodings)|D(?:estinationTextEncodings|irectTextEncodingConversions)|EncodingList|Info|MailTextEncodings|SubTextEncodings|TextEncoding(?:FromInternetName(?:OrMIB)?|InternetName)|WebTextEncodings)|S(?:etBasicOptions|niffTextEncoding))|IS(?:C(?:opy(?:Current(?:ASCIICapableKeyboard(?:InputSource|LayoutInputSource)|Keyboard(?:InputSource|LayoutInputSource))|Input(?:MethodKeyboardLayoutOverride|SourceForLanguage))|reate(?:ASCIICapableInputSourceList|InputSourceList))|D(?:eselectInputSource|isableInputSource)|EnableInputSource|GetInputSourceProperty|InputSourceGetTypeID|RegisterInputSource|Se(?:lectInputSource|tInputMethodKeyboardLayoutOverride))|SM(?:Get(?:ActiveDocument|DocumentProperty)|RemoveDocumentProperty|SetDocumentProperty)|r(?:ans(?:formProcessType|lation(?:C(?:opy(?:DestinationType|SourceType)|reate(?:WithSourceArray)?)|GetT(?:ranslationFlags|ypeID)|PerformFor(?:Data|File|URL)))|uncateFor(?:TextToUnicode|UnicodeToText)))|U(?:32SetU|64(?:A(?:dd|nd)|Bitwise(?:And|Eor|Not|Or)|Div(?:ide)?|Eor|M(?:ax|od|ultiply)|Not|Or|S(?:et(?:U)?|hift(?:Left|Right)|ubtract))|AZoom(?:ChangeFocus|Enabled)|C(?:C(?:o(?:mpare(?:CollationKeys|Text(?:Default|NoLocale)?)|nvert(?:CFAbsoluteTimeTo(?:LongDateTime|Seconds|UTCDateTime)|LongDateTimeToCFAbsoluteTime|SecondsToCFAbsoluteTime|UTCDateTimeToCFAbsoluteTime))|reateCollator)|DisposeCollator|Get(?:C(?:harProperty|ollationKey)|UnicodeScalarValueForSurrogatePair)|IsSurrogate(?:HighCharacter|LowCharacter)|KeyTranslate|TypeSelect(?:AddKeyToSelector|C(?:ompare|reateSelector)|F(?:indItem|lushSelectorData)|ReleaseSelector|W(?:alkList|ouldResetBuffer)))|Int64To(?:LongDouble|SInt64|UnsignedWide)|T(?:CreateStringForOSType|GetOSTypeFromString|Type(?:C(?:o(?:nformsTo|py(?:De(?:clar(?:ation|ingBundleURL)|scription)|PreferredTagWithClass))|reate(?:AllIdentifiersForTag|PreferredIdentifierForTag))|Equal))|n(?:registerEventHotKey|signedWideToUInt64)|pgradeScriptInfoToTextEncoding|seSpeechDictionary)|WideToSInt64|a(?:c(?:cept|l_(?:add_(?:flag_np|perm)|c(?:alc_mask|lear_(?:flags_np|perms)|opy_(?:e(?:ntry|xt(?:_native)?)|int(?:_native)?)|reate_entry(?:_np)?)|d(?:elete_(?:def_file|entry|flag_np|perm)|up)|fr(?:ee|om_text)|get_(?:entry|f(?:d(?:_np)?|ile|lag(?:_np|set_np))|link_np|perm(?:_np|set(?:_mask_np)?)|qualifier|tag_type)|init|maximal_permset_mask_np|s(?:et_(?:f(?:d(?:_np)?|ile|lagset_np)|link_np|permset(?:_mask_np)?|qualifier|tag_type)|ize)|to_text|valid(?:_(?:f(?:d_np|ile_np)|link_np))?)|t_(?:get_state|set_state))|udit(?:_session_(?:join|port|self)|ctl|on)?)|bind|c(?:a(?:bs(?:f|l)?|cos(?:f|h(?:f|l)?|l)?|lloc|rg(?:f|l)?|sin(?:f|h(?:f|l)?|l)?|tan(?:f|h(?:f|l)?|l)?)|cos(?:f|h(?:f|l)?|l)?|exp(?:f|l)?|imag(?:f|l)?|lo(?:ck_(?:get_res|s(?:et_(?:attributes|res|time)|leep(?:_trap)?))|g(?:f|l)?)|on(?:j(?:f|l)?|nect)|p(?:ow(?:f|l)?|roj(?:f|l)?)|real(?:f|l)?|s(?:in(?:f|h(?:f|l)?|l)?|qrt(?:f|l)?|sm(?:AlgToOid|OidToAlg|Perror))|t(?:an(?:f|h(?:f|l)?|l)?|ermid))|d(?:e(?:bug_control_port_for_pid|c2numl)|igittoint)|etap_trace_thread|f(?:e(?:clearexcept|get(?:e(?:nv|xceptflag)|round)|holdexcept|raiseexcept|set(?:e(?:nv|xceptflag)|round)|testexcept|updateenv)|ree)|g(?:et(?:au(?:dit_addr|id)|peername|sock(?:name|opt))|l(?:A(?:c(?:cum|tive(?:StencilFaceEXT|Texture(?:ARB)?))|lphaFunc|r(?:eTexturesResident|rayElement)|ttach(?:ObjectARB|Shader))|B(?:egin(?:ConditionalRenderNV|Query(?:ARB)?|TransformFeedbackEXT)?|i(?:nd(?:AttribLocation(?:ARB)?|Buffer(?:ARB|BaseEXT|OffsetEXT|RangeEXT)?|Fra(?:gDataLocationEXT|mebuffer(?:EXT)?)|ProgramARB|Renderbuffer(?:EXT)?|Texture|VertexArrayAPPLE)|tmap)|l(?:end(?:Color(?:EXT)?|Equation(?:EXT|Separate(?:ATI|EXT)?)?|Func(?:Separate(?:EXT)?)?)|itFramebuffer(?:EXT)?)|uffer(?:Data(?:ARB)?|ParameteriAPPLE|SubData(?:ARB)?))|C(?:allList(?:s)?|heckFramebufferStatus(?:EXT)?|l(?:ampColorARB|ear(?:Accum|Color(?:I(?:iEXT|uiEXT))?|Depth|Index|Stencil)?|i(?:ent(?:ActiveTexture(?:ARB)?|WaitSync)|pPlane))|o(?:lor(?:3(?:b(?:v)?|d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?|u(?:b(?:v)?|i(?:v)?|s(?:v)?))|4(?:b(?:v)?|d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?|u(?:b(?:v)?|i(?:v)?|s(?:v)?))|Ma(?:sk(?:IndexedEXT)?|terial)|Pointer|SubTable|Table(?:Parameter(?:fv|iv))?)|mp(?:ileShader(?:ARB)?|ressedTex(?:Image(?:1D(?:ARB)?|2D(?:ARB)?|3D(?:ARB)?)|SubImage(?:1D(?:ARB)?|2D(?:ARB)?|3D(?:ARB)?)))|nvolution(?:Filter(?:1D|2D)|Parameter(?:f(?:v)?|i(?:v)?))|py(?:Co(?:lor(?:SubTable|Table)|nvolutionFilter(?:1D|2D))|Pixels|Tex(?:Image(?:1D|2D)|SubImage(?:1D|2D|3D))))|reate(?:Program(?:ObjectARB)?|Shader(?:ObjectARB)?)|ullFace)|D(?:e(?:lete(?:Buffers(?:ARB)?|F(?:encesAPPLE|ramebuffers(?:EXT)?)|Lists|ObjectARB|Program(?:sARB)?|Queries(?:ARB)?|Renderbuffers(?:EXT)?|S(?:hader|ync)|Textures|VertexArraysAPPLE)|pth(?:BoundsEXT|Func|Mask|Range)|tach(?:ObjectARB|Shader))|isable(?:ClientState|IndexedEXT|VertexAttribA(?:PPLE|rray(?:ARB)?))?|raw(?:Arrays(?:InstancedARB)?|Buffer(?:s(?:ARB)?)?|Element(?:ArrayAPPLE|s(?:BaseVertex|Instanced(?:ARB|BaseVertex))?)|Pixels|RangeElement(?:ArrayAPPLE|s(?:BaseVertex|EXT)?)))|E(?:dgeFlag(?:Pointer|v)?|lementPointerAPPLE|n(?:able(?:ClientState|IndexedEXT|VertexAttribA(?:PPLE|rray(?:ARB)?))?|d(?:ConditionalRenderNV|List|Query(?:ARB)?|TransformFeedbackEXT)?)|val(?:Coord(?:1(?:d(?:v)?|f(?:v)?)|2(?:d(?:v)?|f(?:v)?))|Mesh(?:1|2)|Point(?:1|2)))|F(?:e(?:edbackBuffer|nceSync)|inish(?:FenceAPPLE|ObjectAPPLE|RenderAPPLE)?|lush(?:MappedBufferRangeAPPLE|RenderAPPLE|VertexArrayRangeAPPLE)?|og(?:Coord(?:Pointer(?:EXT)?|d(?:EXT|v(?:EXT)?)?|f(?:EXT|v(?:EXT)?)?)|f(?:v)?|i(?:v)?)|r(?:amebuffer(?:Renderbuffer(?:EXT)?|Texture(?:1D(?:EXT)?|2D(?:EXT)?|3D(?:EXT)?|EXT|FaceEXT|Layer(?:EXT)?))|ontFace|ustum))|Ge(?:n(?:Buffers(?:ARB)?|F(?:encesAPPLE|ramebuffers(?:EXT)?)|Lists|ProgramsARB|Queries(?:ARB)?|Renderbuffers(?:EXT)?|Textures|VertexArraysAPPLE|erateMipmap(?:EXT)?)|t(?:A(?:ctive(?:Attrib(?:ARB)?|Uniform(?:ARB)?)|tt(?:ached(?:ObjectsARB|Shaders)|ribLocation(?:ARB)?))|B(?:oolean(?:IndexedvEXT|v)|uffer(?:P(?:arameteriv(?:ARB)?|ointerv(?:ARB)?)|SubData(?:ARB)?))|C(?:lipPlane|o(?:lorTable(?:Parameter(?:fv|iv))?|mpressedTexImage(?:ARB)?|nvolution(?:Filter|Parameter(?:fv|iv))))|Doublev|Error|F(?:loatv|ra(?:gDataLocationEXT|mebufferAttachmentParameteriv(?:EXT)?))|H(?:andleARB|istogram(?:Parameter(?:fv|iv))?)|In(?:foLogARB|teger(?:64v|IndexedvEXT|v))|Light(?:fv|iv)|M(?:a(?:p(?:dv|fv|iv)|terial(?:fv|iv))|inmax(?:Parameter(?:fv|iv))?)|Object(?:LabelEXT|Parameter(?:fvARB|ivA(?:PPLE|RB)))|P(?:ixelMap(?:fv|u(?:iv|sv))|o(?:interv|lygonStipple)|rogram(?:EnvParameter(?:dvARB|fvARB)|InfoLog|LocalParameter(?:dvARB|fvARB)|StringARB|iv(?:ARB)?))|Query(?:Object(?:i(?:64vEXT|v(?:ARB)?)|ui(?:64vEXT|v(?:ARB)?))|iv(?:ARB)?)|RenderbufferParameteriv(?:EXT)?|S(?:eparableFilter|hader(?:InfoLog|Source(?:ARB)?|iv)|tring|ynciv)|T(?:ex(?:Env(?:fv|iv)|Gen(?:dv|fv|iv)|Image|LevelParameter(?:fv|iv)|Parameter(?:I(?:ivEXT|uivEXT)|PointervAPPLE|fv|iv))|ransformFeedbackVaryingEXT)|Uniform(?:BufferSizeEXT|Location(?:ARB)?|OffsetEXT|fv(?:ARB)?|iv(?:ARB)?|uivEXT)|VertexAttrib(?:I(?:ivEXT|uivEXT)|Pointerv(?:ARB)?|dv(?:ARB)?|fv(?:ARB)?|iv(?:ARB)?)))|Hi(?:nt|stogram)|I(?:n(?:dex(?:Mask|Pointer|d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?|ub(?:v)?)|itNames|sertEventMarkerEXT|terleavedArrays)|s(?:Buffer(?:ARB)?|Enabled(?:IndexedEXT)?|F(?:enceAPPLE|ramebuffer(?:EXT)?)|List|Program(?:ARB)?|Query(?:ARB)?|Renderbuffer(?:EXT)?|S(?:hader|ync)|Texture|VertexA(?:rrayAPPLE|ttribEnabledAPPLE)))|L(?:abelObjectEXT|i(?:ght(?:Model(?:f(?:v)?|i(?:v)?)|f(?:v)?|i(?:v)?)|n(?:e(?:Stipple|Width)|kProgram(?:ARB)?)|stBase)|o(?:ad(?:Identity|Matrix(?:d|f)|Name|TransposeMatrix(?:d(?:ARB)?|f(?:ARB)?))|gicOp))|M(?:a(?:p(?:1(?:d|f)|2(?:d|f)|Buffer(?:ARB)?|Grid(?:1(?:d|f)|2(?:d|f))|VertexAttrib(?:1(?:dAPPLE|fAPPLE)|2(?:dAPPLE|fAPPLE)))|t(?:erial(?:f(?:v)?|i(?:v)?)|rixMode))|inmax|ult(?:Matrix(?:d|f)|TransposeMatrix(?:d(?:ARB)?|f(?:ARB)?)|i(?:Draw(?:Arrays(?:EXT)?|Element(?:ArrayAPPLE|s(?:BaseVertex|EXT)?)|RangeElementArrayAPPLE)|TexCoord(?:1(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)|2(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)|3(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)|4(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)))))|N(?:ewList|ormal(?:3(?:b(?:v)?|d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|Pointer))|O(?:bject(?:PurgeableAPPLE|UnpurgeableAPPLE)|rtho)|P(?:assThrough|ixel(?:Map(?:fv|u(?:iv|sv))|Store(?:f|i)|Transfer(?:f|i)|Zoom)|o(?:int(?:Parameter(?:f(?:ARB|v(?:ARB)?)?|i(?:NV|v(?:NV)?)?)|Size(?:PointerAPPLE)?)|lygon(?:Mode|Offset|Stipple)|p(?:Attrib|ClientAttrib|GroupMarkerEXT|Matrix|Name))|r(?:ioritizeTextures|o(?:gram(?:EnvParameter(?:4(?:d(?:ARB|vARB)|f(?:ARB|vARB))|s4fvEXT)|LocalParameter(?:4(?:d(?:ARB|vARB)|f(?:ARB|vARB))|s4fvEXT)|ParameteriEXT|StringARB)|vokingVertex(?:EXT)?))|ush(?:Attrib|ClientAttrib|GroupMarkerEXT|Matrix|Name))|R(?:asterPos(?:2(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|3(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|4(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?))|e(?:ad(?:Buffer|Pixels)|ct(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|nder(?:Mode|bufferStorage(?:EXT|Multisample(?:EXT)?)?)|set(?:Histogram|Minmax))|otate(?:d|f))|S(?:ampleCoverage(?:ARB)?|c(?:ale(?:d|f)|issor)|e(?:condaryColor(?:3(?:b(?:EXT|v(?:EXT)?)?|d(?:EXT|v(?:EXT)?)?|f(?:EXT|v(?:EXT)?)?|i(?:EXT|v(?:EXT)?)?|s(?:EXT|v(?:EXT)?)?|u(?:b(?:EXT|v(?:EXT)?)?|i(?:EXT|v(?:EXT)?)?|s(?:EXT|v(?:EXT)?)?))|Pointer(?:EXT)?)|lectBuffer|parableFilter2D|tFenceAPPLE)|hade(?:Model|rSource(?:ARB)?)|tencil(?:Func(?:Separate(?:ATI)?)?|Mask(?:Separate)?|Op(?:Separate(?:ATI)?)?)|wapAPPLE)|T(?:e(?:st(?:FenceAPPLE|ObjectAPPLE)|x(?:Coord(?:1(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|2(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|3(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|4(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|Pointer)|Env(?:f(?:v)?|i(?:v)?)|Gen(?:d(?:v)?|f(?:v)?|i(?:v)?)|Image(?:1D|2D|3D)|Parameter(?:I(?:ivEXT|uivEXT)|f(?:v)?|i(?:v)?)|SubImage(?:1D|2D|3D)|ture(?:BarrierNV|RangeAPPLE)))|rans(?:formFeedbackVaryingsEXT|late(?:d|f)))|U(?:n(?:iform(?:1(?:f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|ui(?:EXT|vEXT))|2(?:f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|ui(?:EXT|vEXT))|3(?:f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|ui(?:EXT|vEXT))|4(?:f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|ui(?:EXT|vEXT))|BufferEXT|Matrix(?:2(?:fv(?:ARB)?|x(?:3fv|4fv))|3(?:fv(?:ARB)?|x(?:2fv|4fv))|4(?:fv(?:ARB)?|x(?:2fv|3fv))))|mapBuffer(?:ARB)?)|seProgram(?:ObjectARB)?)|V(?:alidateProgram(?:ARB)?|ertex(?:2(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|3(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|4(?:d(?:v)?|f(?:v)?|i(?:v)?|s(?:v)?)|A(?:rray(?:ParameteriAPPLE|RangeAPPLE)|ttrib(?:1(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)|2(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)|3(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)|4(?:N(?:bv(?:ARB)?|iv(?:ARB)?|sv(?:ARB)?|u(?:b(?:ARB|v(?:ARB)?)?|iv(?:ARB)?|sv(?:ARB)?))|bv(?:ARB)?|d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|iv(?:ARB)?|s(?:ARB|v(?:ARB)?)?|u(?:bv(?:ARB)?|iv(?:ARB)?|sv(?:ARB)?))|DivisorARB|I(?:1(?:i(?:EXT|vEXT)|ui(?:EXT|vEXT))|2(?:i(?:EXT|vEXT)|ui(?:EXT|vEXT))|3(?:i(?:EXT|vEXT)|ui(?:EXT|vEXT))|4(?:bvEXT|i(?:EXT|vEXT)|svEXT|u(?:bvEXT|i(?:EXT|vEXT)|svEXT))|PointerEXT)|Pointer(?:ARB)?))|BlendARB|Point(?:SizefAPPLE|er))|iewport)|W(?:aitSync|eight(?:PointerARB|bvARB|dvARB|fvARB|ivARB|svARB|u(?:bvARB|ivARB|svARB))|indowPos(?:2(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)|3(?:d(?:ARB|v(?:ARB)?)?|f(?:ARB|v(?:ARB)?)?|i(?:ARB|v(?:ARB)?)?|s(?:ARB|v(?:ARB)?)?)))))|host_(?:c(?:heck_multiuser_mode|reate_mach_voucher(?:_trap)?)|default_memory_manager|get_(?:UNDServer|atm_diagnostic_flag|boot_info|clock_(?:control|service)|exception_ports|io_master|multiuser_config_flags|special_port)|info|kernel_version|lockgroup_info|p(?:age_size|r(?:iv_statistics|ocessor(?:_(?:info|set(?:_priv|s))|s)))|re(?:boot|gister_(?:mach_voucher_attr_manager|well_known_mach_voucher_attr_manager)|quest_notification)|s(?:e(?:curity_(?:create_task_token|set_task_token)|t_(?:UNDServer|atm_diagnostic_flag|exception_ports|multiuser_config_flags|special_port))|tatistics(?:64)?|wap_exception_ports)|virtual_physical_table_info)|i(?:max(?:abs|div)|s(?:a(?:l(?:num|pha)|scii)|blank|cntrl|digit|graph|hexnumber|ideogram|lower|number|p(?:honogram|rint|unct)|rune|sp(?:ace|ecial)|upper|xdigit))|k(?:ext_request|mod_(?:c(?:ontrol|reate)|destroy|get_info))|l(?:dtox80|isten|ock_(?:acquire|handoff(?:_accept)?|make_stable|release|set_(?:create|destroy)|try))|m(?:a(?:c(?:h_(?:error(?:_(?:string|type))?|generate_activity_id|host_self|m(?:ake_memory_entry(?:_64)?|emory_(?:info|object_memory_entry(?:_64)?)|sg(?:_(?:destroy|overwrite|receive|se(?:nd|rver(?:_(?:importance|once))?)))?)|port(?:_(?:allocate(?:_(?:full|name|qos))?|construct|d(?:e(?:allocate|str(?:oy|uct))|nrequest_info)|extract_(?:member|right)|g(?:et_(?:attributes|context|refs|s(?:et_status|rights))|uard(?:_with_flags)?)|insert_(?:member|right)|k(?:ernel_object|object(?:_description)?)|mo(?:d_refs|ve_member)|names|peek|re(?:name|quest_notification)|s(?:et_(?:attributes|context|mscount|seqno)|pace_(?:basic_info|info)|wap_guard)|type|unguard)|s_(?:lookup|register))|thread_self|v(?:m_(?:region_info(?:_64)?|wire)|oucher_(?:deallocate|extract_attr_recipe_trap))|zone_info(?:_for_zone)?)|x_(?:backing_store_(?:recovery|suspend)|swapo(?:ff|n)|triggers))|dvise|lloc|trix_(?:multiply|scale))|i(?:g_(?:allocate|dealloc(?:_reply_port|ate)|get_reply_port|put_reply_port|reply_setup|strncpy(?:_zerofill)?)|n(?:core|herit))|lock(?:all)?|map|protect|sync|un(?:lock(?:all)?|map))|num2decl|p(?:anic(?:_init)?|fctlinput|id_for_task|osix_m(?:advise|emalign)|rocessor_(?:assign|control|exit|get_assignment|info|s(?:et_(?:create|de(?:fault|stroy)|info|max_priority|policy_(?:control|disable|enable)|sta(?:ck_usage|tistics)|t(?:asks|hreads))|tart)))|re(?:alloc|cv(?:from|msg)?|lationl)|s(?:afe_gets|e(?:c_re(?:lease|tain)|maphore_(?:create|destroy|signal(?:_(?:all|thread))?|timedwait(?:_signal)?|wait(?:_signal)?)|nd(?:file|msg|to)?|t(?:au(?:dit_addr|id)|sockopt))|h(?:m_(?:open|unlink)|utdown)|imd_(?:a(?:bs|ct|dd|l(?:l|most_equal_elements(?:_relative)?)|n(?:gle|y)|xis)|b(?:ezier|itselect)|c(?:har(?:_sat)?|lamp|onjugate|ross)|d(?:eterminant|i(?:agonal_matrix|stance(?:_squared)?)|o(?:t|uble))|equal|f(?:ast_(?:distance|length|normalize|project|r(?:ecip|sqrt))|loat|ract)|i(?:mag|n(?:circle|sphere|t(?:_sat)?|verse))|l(?:ength(?:_squared)?|inear_combination|ong(?:_sat)?)|m(?:a(?:ke_(?:char(?:16(?:_undef)?|2(?:_undef)?|3(?:2(?:_undef)?|_undef)?|4(?:_undef)?|64(?:_undef)?|8(?:_undef)?)|double(?:2(?:_undef)?|3(?:_undef)?|4(?:_undef)?|8(?:_undef)?)|float(?:16(?:_undef)?|2(?:_undef)?|3(?:_undef)?|4(?:_undef)?|8(?:_undef)?)|int(?:16(?:_undef)?|2(?:_undef)?|3(?:_undef)?|4(?:_undef)?|8(?:_undef)?)|long(?:2(?:_undef)?|3(?:_undef)?|4(?:_undef)?|8(?:_undef)?)|short(?:16(?:_undef)?|2(?:_undef)?|3(?:2(?:_undef)?|_undef)?|4(?:_undef)?|8(?:_undef)?)|u(?:char(?:16(?:_undef)?|2(?:_undef)?|3(?:2(?:_undef)?|_undef)?|4(?:_undef)?|64(?:_undef)?|8(?:_undef)?)|int(?:16(?:_undef)?|2(?:_undef)?|3(?:_undef)?|4(?:_undef)?|8(?:_undef)?)|long(?:2(?:_undef)?|3(?:_undef)?|4(?:_undef)?|8(?:_undef)?)|short(?:16(?:_undef)?|2(?:_undef)?|3(?:2(?:_undef)?|_undef)?|4(?:_undef)?|8(?:_undef)?)))|trix(?:3x3|4x4|_from_rows)?|x)|i(?:n|x)|ul)|n(?:egate|orm(?:_(?:inf|one)|alize))|orient|pr(?:ecise_(?:distance|length|normalize|project|r(?:ecip|sqrt))|oject)|quaternion|r(?:e(?:al|cip|duce_(?:add|m(?:ax|in))|f(?:lect|ract))|sqrt)|s(?:elect|hort(?:_sat)?|ign|lerp(?:_longest)?|moothstep|pline|tep|ub)|transpose|u(?:char(?:_sat)?|int(?:_sat)?|long(?:_sat)?|short(?:_sat)?))|lot_name|ock(?:atmark|et(?:pair)?)|trto(?:imax|umax)|wtch(?:_pri)?)|t(?:ask_(?:assign(?:_default)?|create(?:_suid_cred)?|for_pid|ge(?:nerate_corpse|t_(?:assignment|dyld_image_infos|e(?:mulation_vector|xc(?:_guard_behavior|eption_ports))|mach_voucher|s(?:pecial_port|tate)))|in(?:fo|spect)|map_corpse_info(?:_64)?|name_for_pid|p(?:olicy(?:_(?:get|set))?|urgable_info)|re(?:gister_dyld_(?:get_process_state|image_infos|s(?:et_dyld_state|hared_cache_image_info))|sume(?:2)?)|s(?:ample|e(?:lf_trap|t_(?:e(?:mulation(?:_vector)?|xc(?:_guard_behavior|eption_ports))|info|mach_voucher|p(?:hys_footprint_limit|o(?:licy|rt_space))|ras_pc|s(?:pecial_port|tate)))|uspend(?:2)?|wap_(?:exception_ports|mach_voucher))|t(?:erminate|hreads)|unregister_dyld_image_infos|wire|zone_info)|hread_(?:a(?:bort(?:_safely)?|ssign(?:_default)?)|create(?:_running)?|depress_abort|get_(?:assignment|exception_ports|mach_voucher|s(?:pecial_port|tate))|info|policy(?:_(?:get|set))?|resume|s(?:ample|et_(?:exception_ports|mach_voucher|policy|s(?:pecial_port|tate))|uspend|w(?:ap_(?:exception_ports|mach_voucher)|itch))|terminate|wire)|o(?:ascii|lower|upper))|uuid_(?:c(?:lear|o(?:mpare|py))|generate(?:_(?:early_random|random|time))?|is_null|parse|unparse(?:_(?:lower|upper))?)|v(?:AEBuild(?:AppleEvent|Desc|Parameters)|alloc|ector(?:16|2|3(?:2)?|4|8)|m_(?:allocate(?:_cpm)?|behavior_set|copy|deallocate|inherit|m(?:a(?:chine_attribute|p(?:_(?:64|exec_lockdown|page_query)|ped_pages_info)?)|sync)|p(?:rotect|urgable_control)|re(?:ad(?:_(?:list|overwrite))?|gion(?:_(?:64|recurse(?:_64)?))?|map)|w(?:ire|rite))|oucher_mach_msg_(?:adopt|clear|revert|set))|wcsto(?:imax|umax)|x(?:80told|pc_(?:array_(?:app(?:end_value|ly)|create(?:_connection)?|dup_fd|get_(?:bool|count|d(?:at(?:a|e)|ouble)|int64|string|u(?:int64|uid)|value)|set_(?:bool|connection|d(?:at(?:a|e)|ouble)|fd|int64|string|u(?:int64|uid)|value))|bool_(?:create|get_value)|co(?:nnection_(?:c(?:ancel|reate(?:_(?:from_endpoint|mach_service))?)|get_(?:asid|context|e(?:gid|uid)|name|pid)|resume|s(?:e(?:nd_(?:barrier|message(?:_with_reply(?:_sync)?)?)|t_(?:context|event_handler|finalizer_f|target_queue))|uspend))|py(?:_description)?)|d(?:at(?:a_(?:create(?:_with_dispatch_data)?|get_(?:bytes(?:_ptr)?|length))|e_(?:create(?:_from_current)?|get_value))|ebugger_api_misuse_info|ictionary_(?:apply|create(?:_(?:connection|reply))?|dup_fd|get_(?:bool|count|d(?:at(?:a|e)|ouble)|int64|remote_connection|string|u(?:int64|uid)|value)|set_(?:bool|connection|d(?:at(?:a|e)|ouble)|fd|int64|string|u(?:int64|uid)|value))|ouble_(?:create|get_value))|e(?:ndpoint_create|qual)|fd_(?:create|dup)|get_type|hash|int64_(?:create|get_value)|main|null_create|re(?:lease|tain)|s(?:et_event_stream_handler|hmem_(?:create|map)|tring_(?:create(?:_with_format(?:_and_arguments)?)?|get_(?:length|string_ptr)))|transaction_(?:begin|end)|u(?:int64_(?:create|get_value)|uid_(?:create|get_bytes)))))\\b)" + }, { "captures": { "1": { @@ -376,7 +898,7 @@ "name": "support.function.cf.c" } }, - "match": "(\\s*)(\\bCF(?:A(?:bsoluteTimeGetCurrent|llocator(?:Allocate|Create|Deallocate|Get(?:Context|Default|PreferredSizeForSize|TypeID)|Reallocate|SetDefault)|rray(?:App(?:end(?:Array|Value)|lyFunction)|BSearchValues|C(?:ontainsValue|reate(?:Copy|Mutable(?:Copy)?)?)|ExchangeValuesAtIndices|Get(?:Count(?:OfValue)?|FirstIndexOfValue|LastIndexOfValue|TypeID|Value(?:AtIndex|s))|InsertValueAtIndex|Re(?:move(?:AllValues|ValueAtIndex)|placeValues)|S(?:etValueAtIndex|ortValues))|ttributedString(?:BeginEditing|Create(?:Copy|Mutable(?:Copy)?|WithSubstring)?|EndEditing|Get(?:Attribute(?:AndLongestEffectiveRange|s(?:AndLongestEffectiveRange)?)?|Length|MutableString|String|TypeID)|Re(?:moveAttribute|place(?:AttributedString|String))|SetAttribute(?:s)?))|B(?:ag(?:A(?:ddValue|pplyFunction)|C(?:ontainsValue|reate(?:Copy|Mutable(?:Copy)?)?)|Get(?:Count(?:OfValue)?|TypeID|Value(?:IfPresent|s)?)|Re(?:move(?:AllValues|Value)|placeValue)|SetValue)|i(?:naryHeap(?:A(?:ddValue|pplyFunction)|C(?:ontainsValue|reate(?:Copy)?)|Get(?:Count(?:OfValue)?|Minimum(?:IfPresent)?|TypeID|Values)|Remove(?:AllValues|MinimumValue))|tVector(?:C(?:ontainsBit|reate(?:Copy|Mutable(?:Copy)?)?)|FlipBit(?:AtIndex|s)|Get(?:Bit(?:AtIndex|s)|Count(?:OfBit)?|FirstIndexOfBit|LastIndexOfBit|TypeID)|Set(?:AllBits|Bit(?:AtIndex|s)|Count)))|ooleanGet(?:TypeID|Value)|undle(?:C(?:loseBundleResourceMap|opy(?:AuxiliaryExecutableURL|Bu(?:iltInPlugInsURL|ndle(?:Localizations|URL))|Executable(?:Architectures(?:ForURL)?|URL)|InfoDictionary(?:ForURL|InDirectory)|Localiz(?:ationsFor(?:Preferences|URL)|edString)|Pr(?:eferredLocalizationsFromArray|ivateFrameworksURL)|Resource(?:URL(?:ForLocalization|InDirectory|sOfType(?:ForLocalization|InDirectory)?)?|sDirectoryURL)|S(?:hared(?:FrameworksURL|SupportURL)|upportFilesDirectoryURL))|reate(?:BundlesFromDirectory)?)|Get(?:AllBundles|BundleWithIdentifier|D(?:ataPointer(?:ForName|sForNames)|evelopmentRegion)|FunctionPointer(?:ForName|sForNames)|I(?:dentifier|nfoDictionary)|LocalInfoDictionary|MainBundle|P(?:ackageInfo(?:InDirectory)?|lugIn)|TypeID|V(?:alueForInfoDictionaryKey|ersionNumber))|IsExecutableLoaded|LoadExecutable(?:AndReturnError)?|OpenBundleResource(?:Files|Map)|PreflightExecutable|UnloadExecutable)|yteOrderGetCurrent)|C(?:alendar(?:AddComponents|C(?:o(?:mposeAbsoluteTime|py(?:Current|Locale|TimeZone))|reateWithIdentifier)|DecomposeAbsoluteTime|Get(?:ComponentDifference|FirstWeekday|Identifier|M(?:aximumRangeOfUnit|inimum(?:DaysInFirstWeek|RangeOfUnit))|OrdinalityOfUnit|RangeOfUnit|T(?:imeRangeOfUnit|ypeID))|Set(?:FirstWeekday|Locale|MinimumDaysInFirstWeek|TimeZone))|haracterSet(?:AddCharactersIn(?:Range|String)|Create(?:BitmapRepresentation|Copy|InvertedSet|Mutable(?:Copy)?|With(?:BitmapRepresentation|CharactersIn(?:Range|String)))|Get(?:Predefined|TypeID)|HasMemberInPlane|I(?:n(?:tersect|vert)|s(?:CharacterMember|LongCharacterMember|SupersetOfSet))|RemoveCharactersIn(?:Range|String)|Union)|o(?:nvert(?:Double(?:HostToSwapped|SwappedToHost)|Float(?:32(?:HostToSwapped|SwappedToHost)|64(?:HostToSwapped|SwappedToHost)|HostToSwapped|SwappedToHost))|py(?:Description|HomeDirectoryURL|TypeIDDescription)))|D(?:at(?:a(?:AppendBytes|Create(?:Copy|Mutable(?:Copy)?|WithBytesNoCopy)?|DeleteBytes|Find|Get(?:Byte(?:Ptr|s)|Length|MutableBytePtr|TypeID)|IncreaseLength|ReplaceBytes|SetLength)|e(?:C(?:ompare|reate)|Formatter(?:C(?:opyProperty|reate(?:DateF(?:ormatFromTemplate|romString)|StringWith(?:AbsoluteTime|Date))?)|Get(?:AbsoluteTimeFromString|DateStyle|Format|Locale|T(?:imeStyle|ypeID))|Set(?:Format|Property))|Get(?:AbsoluteTime|T(?:imeIntervalSinceDate|ypeID))))|ictionary(?:A(?:ddValue|pplyFunction)|C(?:ontains(?:Key|Value)|reate(?:Copy|Mutable(?:Copy)?)?)|Get(?:Count(?:Of(?:Key|Value))?|KeysAndValues|TypeID|Value(?:IfPresent)?)|Re(?:move(?:AllValues|Value)|placeValue)|SetValue))|E(?:qual|rror(?:C(?:opy(?:Description|FailureReason|RecoverySuggestion|UserInfo)|reate(?:WithUserInfoKeysAndValues)?)|Get(?:Code|Domain|TypeID)))|File(?:Descriptor(?:Create(?:RunLoopSource)?|DisableCallBacks|EnableCallBacks|Get(?:Context|NativeDescriptor|TypeID)|I(?:nvalidate|sValid))|Security(?:C(?:opy(?:AccessControlList|GroupUUID|OwnerUUID)|reate(?:Copy)?)|Get(?:Group|Mode|Owner|TypeID)|Set(?:AccessControlList|Group(?:UUID)?|Mode|Owner(?:UUID)?)))|Get(?:Allocator|RetainCount|TypeID)|Hash|Locale(?:C(?:opy(?:AvailableLocaleIdentifiers|C(?:ommonISOCurrencyCodes|urrent)|DisplayNameForPropertyValue|ISO(?:C(?:ountryCodes|urrencyCodes)|LanguageCodes)|PreferredLanguages)|reate(?:C(?:anonicalL(?:anguageIdentifierFromString|ocaleIdentifierFromS(?:criptManagerCodes|tring))|o(?:mponentsFromLocaleIdentifier|py))|LocaleIdentifierFrom(?:Components|WindowsLocaleCode))?)|Get(?:Identifier|Language(?:CharacterDirection|LineDirection)|System|TypeID|Value|WindowsLocaleCodeFromLocaleIdentifier))|M(?:a(?:chPort(?:Create(?:RunLoopSource|WithPort)?|Get(?:Context|InvalidationCallBack|Port|TypeID)|I(?:nvalidate|sValid)|SetInvalidationCallBack)|keCollectable)|essagePort(?:Create(?:Local|R(?:emote|unLoopSource))|Get(?:Context|InvalidationCallBack|Name|TypeID)|I(?:nvalidate|s(?:Remote|Valid))|Se(?:ndRequest|t(?:DispatchQueue|InvalidationCallBack|Name))))|N(?:otificationCenter(?:AddObserver|Get(?:D(?:arwinNotifyCenter|istributedCenter)|LocalCenter|TypeID)|PostNotification(?:WithOptions)?|Remove(?:EveryObserver|Observer))|u(?:llGetTypeID|mber(?:C(?:ompare|reate)|Formatter(?:C(?:opyProperty|reate(?:NumberFromString|StringWith(?:Number|Value))?)|Get(?:DecimalInfoForCurrencyCode|Format|Locale|Style|TypeID|ValueFromString)|Set(?:Format|Property))|Get(?:ByteSize|Type(?:ID)?|Value)|IsFloatType)))|P(?:lugIn(?:AddInstanceForFactory|Create|FindFactoriesForPlugInType(?:InPlugIn)?|Get(?:Bundle|TypeID)|I(?:nstance(?:Create(?:WithInstanceDataSize)?|Get(?:FactoryName|In(?:stanceData|terfaceFunctionTable)|TypeID))|sLoadOnDemand)|Re(?:gister(?:FactoryFunction(?:ByName)?|PlugInType)|moveInstanceForFactory)|SetLoadOnDemand|Unregister(?:Factory|PlugInType))|r(?:eferences(?:A(?:ddSuitePreferencesToApp|pp(?:Synchronize|ValueIsForced))|Copy(?:AppValue|KeyList|Multiple|Value)|GetApp(?:BooleanValue|IntegerValue)|RemoveSuitePreferencesFromApp|S(?:et(?:AppValue|Multiple|Value)|ynchronize))|opertyList(?:Create(?:D(?:ata|eepCopy)|With(?:Data|Stream))|IsValid|Write)))|R(?:angeMake|e(?:adStream(?:C(?:lose|opy(?:Error|Property)|reateWith(?:BytesNoCopy|File))|Get(?:Buffer|Error|Status|TypeID)|HasBytesAvailable|Open|Read|S(?:cheduleWithRunLoop|et(?:Client|Property))|UnscheduleFromRunLoop)|lease|tain)|unLoop(?:Add(?:CommonMode|Observer|Source|Timer)|Co(?:ntains(?:Observer|Source|Timer)|py(?:AllModes|CurrentMode))|Get(?:Current|Main|NextTimerFireDate|TypeID)|IsWaiting|Observer(?:Create(?:WithHandler)?|DoesRepeat|Get(?:Activities|Context|Order|TypeID)|I(?:nvalidate|sValid))|PerformBlock|R(?:emove(?:Observer|Source|Timer)|un(?:InMode)?)|S(?:ource(?:Create|Get(?:Context|Order|TypeID)|I(?:nvalidate|sValid)|Signal)|top)|Timer(?:Create(?:WithHandler)?|DoesRepeat|Get(?:Context|Interval|NextFireDate|Order|TypeID)|I(?:nvalidate|sValid)|SetNextFireDate)|WakeUp))|S(?:et(?:A(?:ddValue|pplyFunction)|C(?:ontainsValue|reate(?:Copy|Mutable(?:Copy)?)?)|Get(?:Count(?:OfValue)?|TypeID|Value(?:IfPresent|s)?)|Re(?:move(?:AllValues|Value)|placeValue)|SetValue)|how(?:Str)?|ocket(?:C(?:o(?:nnectToAddress|py(?:Address|PeerAddress|Registered(?:SocketSignature|Value)))|reate(?:ConnectedToSocketSignature|RunLoopSource|With(?:Native|SocketSignature))?)|DisableCallBacks|EnableCallBacks|Get(?:Context|DefaultNameRegistryPortNumber|Native|SocketFlags|TypeID)|I(?:nvalidate|sValid)|Register(?:SocketSignature|Value)|Se(?:ndData|t(?:Address|DefaultNameRegistryPortNumber|SocketFlags))|Unregister)|tr(?:eamCreate(?:BoundPair|PairWith(?:PeerSocketSignature|Socket(?:ToHost)?))|ing(?:Append(?:C(?:String|haracters)|Format(?:AndArguments)?|PascalString)?|C(?:apitalize|o(?:mpare(?:WithOptions(?:AndLocale)?)?|nvert(?:EncodingTo(?:IANACharSetName|NSStringEncoding|WindowsCodepage)|IANACharSetNameToEncoding|NSStringEncodingToEncoding|WindowsCodepageToEncoding))|reate(?:Array(?:BySeparatingStrings|WithFindResults)|ByCombiningStrings|Copy|ExternalRepresentation|FromExternalRepresentation|Mutable(?:Copy|WithExternalCharactersNoCopy)?|With(?:Bytes(?:NoCopy)?|C(?:String(?:NoCopy)?|haracters(?:NoCopy)?)|F(?:ileSystemRepresentation|ormat(?:AndArguments)?)|PascalString(?:NoCopy)?|Substring)))|Delete|F(?:ind(?:AndReplace|CharacterFromSet|WithOptions(?:AndLocale)?)?|old)|Get(?:Bytes|C(?:String(?:Ptr)?|haracter(?:AtIndex|FromInlineBuffer|s(?:Ptr)?))|DoubleValue|F(?:astestEncoding|ileSystemRepresentation)|HyphenationLocationBeforeIndex|IntValue|L(?:ength|i(?:neBounds|stOfAvailableEncodings)|ongCharacterForSurrogatePair)|M(?:aximumSize(?:ForEncoding|OfFileSystemRepresentation)|ostCompatibleMacStringEncoding)|NameOfEncoding|Pa(?:ragraphBounds|scalString(?:Ptr)?)|RangeOfComposedCharactersAtIndex|S(?:mallestEncoding|urrogatePairForLongCharacter|ystemEncoding)|TypeID)|Has(?:Prefix|Suffix)|I(?:n(?:itInlineBuffer|sert)|s(?:EncodingAvailable|HyphenationAvailableForLocale|Surrogate(?:HighCharacter|LowCharacter)))|Lowercase|Normalize|Pad|Replace(?:All)?|SetExternalCharactersNoCopy|T(?:okenizer(?:AdvanceToNextToken|C(?:opy(?:BestStringLanguage|CurrentTokenAttribute)|reate)|G(?:et(?:Current(?:SubTokens|TokenRange)|TypeID)|oToTokenAtIndex)|SetString)|r(?:ansform|im(?:Whitespace)?))|Uppercase))|wapInt(?:16(?:BigToHost|HostTo(?:Big|Little)|LittleToHost)?|32(?:BigToHost|HostTo(?:Big|Little)|LittleToHost)?|64(?:BigToHost|HostTo(?:Big|Little)|LittleToHost)?))|T(?:imeZone(?:C(?:opy(?:Abbreviation(?:Dictionary)?|Default|KnownNames|LocalizedName|System)|reate(?:With(?:Name|TimeIntervalFromGMT))?)|Get(?:Da(?:ta|ylightSavingTimeOffset)|N(?:ame|extDaylightSavingTimeTransition)|SecondsFromGMT|TypeID)|IsDaylightSavingTime|ResetSystem|Set(?:AbbreviationDictionary|Default))|ree(?:App(?:endChild|lyFunctionToChildren)|Create|FindRoot|Get(?:C(?:hild(?:AtIndex|Count|ren)|ontext)|FirstChild|NextSibling|Parent|TypeID)|InsertSibling|PrependChild|Remove(?:AllChildren)?|S(?:etContext|ortChildren)))|U(?:RL(?:C(?:anBeDecomposed|learResourcePropertyCache(?:ForKey)?|opy(?:AbsoluteURL|F(?:ileSystemPath|ragment)|HostName|LastPathComponent|NetLocation|Pa(?:rameterString|ssword|th(?:Extension)?)|QueryString|Resource(?:Propert(?:iesForKeys|yForKey)|Specifier)|S(?:cheme|trictPath)|UserName)|reate(?:AbsoluteURLWithBytes|B(?:ookmarkData(?:From(?:AliasRecord|File))?|yResolvingBookmarkData)|Copy(?:AppendingPath(?:Component|Extension)|Deleting(?:LastPathComponent|PathExtension))|Data|F(?:ile(?:PathURL|ReferenceURL)|romFileSystemRepresentation(?:RelativeToBase)?)|ResourcePropert(?:iesForKeysFromBookmarkData|yForKeyFromBookmarkData)|StringByReplacingPercentEscapes|With(?:Bytes|FileSystemPath(?:RelativeToBase)?|String)))|Enumerator(?:CreateFor(?:DirectoryURL|MountedVolumes)|Get(?:DescendentLevel|NextURL|TypeID)|SkipDescendents)|Get(?:B(?:aseURL|yte(?:RangeForComponent|s))|FileSystemRepresentation|PortNumber|String|TypeID)|HasDirectoryPath|ResourceIsReachable|S(?:et(?:ResourcePropert(?:iesForKeys|yForKey)|TemporaryResourcePropertyForKey)|t(?:artAccessingSecurityScopedResource|opAccessingSecurityScopedResource))|WriteBookmarkDataToFile)|UID(?:Create(?:From(?:String|UUIDBytes)|String|WithBytes)?|Get(?:ConstantUUIDWithBytes|TypeID|UUIDBytes))|serNotification(?:C(?:ancel|heckBoxChecked|reate(?:RunLoopSource)?)|Display(?:Alert|Notice)|Get(?:Response(?:Dictionary|Value)|TypeID)|PopUpSelection|ReceiveResponse|SecureTextField|Update))|WriteStream(?:C(?:anAcceptBytes|lose|opy(?:Error|Property)|reateWith(?:AllocatedBuffers|Buffer|File))|Get(?:Error|Status|TypeID)|Open|S(?:cheduleWithRunLoop|et(?:Client|Property))|UnscheduleFromRunLoop|Write)|XMLCreateStringBy(?:EscapingEntities|UnescapingEntities))\\b)" + "match": "(\\s*)(\\bCF(?:A(?:bsoluteTimeGetCurrent|llocator(?:Allocate|Create|Deallocate|Get(?:Context|Default|PreferredSizeForSize|TypeID)|Reallocate|SetDefault)|rray(?:App(?:end(?:Array|Value)|lyFunction)|BSearchValues|C(?:ontainsValue|reate(?:Copy|Mutable(?:Copy)?)?)|ExchangeValuesAtIndices|Get(?:Count(?:OfValue)?|FirstIndexOfValue|LastIndexOfValue|TypeID|Value(?:AtIndex|s))|InsertValueAtIndex|Re(?:move(?:AllValues|ValueAtIndex)|placeValues)|S(?:etValueAtIndex|ortValues))|ttributedString(?:BeginEditing|Create(?:Copy|Mutable(?:Copy)?|WithSubstring)?|EndEditing|Get(?:Attribute(?:AndLongestEffectiveRange|s(?:AndLongestEffectiveRange)?)?|Length|MutableString|String|TypeID)|Re(?:moveAttribute|place(?:AttributedString|String))|SetAttribute(?:s)?))|B(?:ag(?:A(?:ddValue|pplyFunction)|C(?:ontainsValue|reate(?:Copy|Mutable(?:Copy)?)?)|Get(?:Count(?:OfValue)?|TypeID|Value(?:IfPresent|s)?)|Re(?:move(?:AllValues|Value)|placeValue)|SetValue)|i(?:naryHeap(?:A(?:ddValue|pplyFunction)|C(?:ontainsValue|reate(?:Copy)?)|Get(?:Count(?:OfValue)?|Minimum(?:IfPresent)?|TypeID|Values)|Remove(?:AllValues|MinimumValue))|tVector(?:C(?:ontainsBit|reate(?:Copy|Mutable(?:Copy)?)?)|FlipBit(?:AtIndex|s)|Get(?:Bit(?:AtIndex|s)|Count(?:OfBit)?|FirstIndexOfBit|LastIndexOfBit|TypeID)|Set(?:AllBits|Bit(?:AtIndex|s)|Count)))|ooleanGet(?:TypeID|Value)|undle(?:C(?:opy(?:AuxiliaryExecutableURL|Bu(?:iltInPlugInsURL|ndle(?:Localizations|URL))|Executable(?:Architectures(?:ForURL)?|URL)|InfoDictionary(?:ForURL|InDirectory)|Localiz(?:ationsFor(?:Preferences|URL)|edString)|Pr(?:eferredLocalizationsFromArray|ivateFrameworksURL)|Resource(?:URL(?:ForLocalization|InDirectory|sOfType(?:ForLocalization|InDirectory)?)?|sDirectoryURL)|S(?:hared(?:FrameworksURL|SupportURL)|upportFilesDirectoryURL))|reate(?:BundlesFromDirectory)?)|Get(?:AllBundles|BundleWithIdentifier|D(?:ataPointer(?:ForName|sForNames)|evelopmentRegion)|FunctionPointer(?:ForName|sForNames)|I(?:dentifier|nfoDictionary)|LocalInfoDictionary|MainBundle|P(?:ackageInfo(?:InDirectory)?|lugIn)|TypeID|V(?:alueForInfoDictionaryKey|ersionNumber))|IsExecutableLoaded|LoadExecutable(?:AndReturnError)?|PreflightExecutable|UnloadExecutable)|yteOrderGetCurrent)|C(?:alendar(?:AddComponents|C(?:o(?:mposeAbsoluteTime|py(?:Current|Locale|TimeZone))|reateWithIdentifier)|DecomposeAbsoluteTime|Get(?:ComponentDifference|FirstWeekday|Identifier|M(?:aximumRangeOfUnit|inimum(?:DaysInFirstWeek|RangeOfUnit))|OrdinalityOfUnit|RangeOfUnit|T(?:imeRangeOfUnit|ypeID))|Set(?:FirstWeekday|Locale|MinimumDaysInFirstWeek|TimeZone))|haracterSet(?:AddCharactersIn(?:Range|String)|Create(?:BitmapRepresentation|Copy|InvertedSet|Mutable(?:Copy)?|With(?:BitmapRepresentation|CharactersIn(?:Range|String)))|Get(?:Predefined|TypeID)|HasMemberInPlane|I(?:n(?:tersect|vert)|s(?:CharacterMember|LongCharacterMember|SupersetOfSet))|RemoveCharactersIn(?:Range|String)|Union)|o(?:nvert(?:Double(?:HostToSwapped|SwappedToHost)|Float(?:32(?:HostToSwapped|SwappedToHost)|64(?:HostToSwapped|SwappedToHost)|HostToSwapped|SwappedToHost))|py(?:Description|HomeDirectoryURL|TypeIDDescription)))|D(?:at(?:a(?:AppendBytes|Create(?:Copy|Mutable(?:Copy)?|WithBytesNoCopy)?|DeleteBytes|Find|Get(?:Byte(?:Ptr|s)|Length|MutableBytePtr|TypeID)|IncreaseLength|ReplaceBytes|SetLength)|e(?:C(?:ompare|reate)|Formatter(?:C(?:opyProperty|reate(?:DateF(?:ormatFromTemplate|romString)|StringWith(?:AbsoluteTime|Date))?)|Get(?:AbsoluteTimeFromString|DateStyle|Format|Locale|T(?:imeStyle|ypeID))|Set(?:Format|Property))|Get(?:AbsoluteTime|T(?:imeIntervalSinceDate|ypeID))))|ictionary(?:A(?:ddValue|pplyFunction)|C(?:ontains(?:Key|Value)|reate(?:Copy|Mutable(?:Copy)?)?)|Get(?:Count(?:Of(?:Key|Value))?|KeysAndValues|TypeID|Value(?:IfPresent)?)|Re(?:move(?:AllValues|Value)|placeValue)|SetValue))|E(?:qual|rror(?:C(?:opy(?:Description|FailureReason|RecoverySuggestion|UserInfo)|reate(?:WithUserInfoKeysAndValues)?)|Get(?:Code|Domain|TypeID)))|File(?:Descriptor(?:Create(?:RunLoopSource)?|DisableCallBacks|EnableCallBacks|Get(?:Context|NativeDescriptor|TypeID)|I(?:nvalidate|sValid))|Security(?:C(?:opy(?:AccessControlList|GroupUUID|OwnerUUID)|reate(?:Copy)?)|Get(?:Group|Mode|Owner|TypeID)|Set(?:AccessControlList|Group(?:UUID)?|Mode|Owner(?:UUID)?)))|Get(?:Allocator|RetainCount|TypeID)|Hash|Locale(?:C(?:opy(?:AvailableLocaleIdentifiers|C(?:ommonISOCurrencyCodes|urrent)|DisplayNameForPropertyValue|ISO(?:C(?:ountryCodes|urrencyCodes)|LanguageCodes)|PreferredLanguages)|reate(?:C(?:anonicalL(?:anguageIdentifierFromString|ocaleIdentifierFromS(?:criptManagerCodes|tring))|o(?:mponentsFromLocaleIdentifier|py))|LocaleIdentifierFrom(?:Components|WindowsLocaleCode))?)|Get(?:Identifier|Language(?:CharacterDirection|LineDirection)|System|TypeID|Value|WindowsLocaleCodeFromLocaleIdentifier))|M(?:a(?:chPort(?:Create(?:RunLoopSource|WithPort)?|Get(?:Context|InvalidationCallBack|Port|TypeID)|I(?:nvalidate|sValid)|SetInvalidationCallBack)|keCollectable)|essagePort(?:Create(?:Local|R(?:emote|unLoopSource))|Get(?:Context|InvalidationCallBack|Name|TypeID)|I(?:nvalidate|s(?:Remote|Valid))|Se(?:ndRequest|t(?:DispatchQueue|InvalidationCallBack|Name))))|N(?:otificationCenter(?:AddObserver|Get(?:D(?:arwinNotifyCenter|istributedCenter)|LocalCenter|TypeID)|PostNotification(?:WithOptions)?|Remove(?:EveryObserver|Observer))|u(?:llGetTypeID|mber(?:C(?:ompare|reate)|Formatter(?:C(?:opyProperty|reate(?:NumberFromString|StringWith(?:Number|Value))?)|Get(?:DecimalInfoForCurrencyCode|Format|Locale|Style|TypeID|ValueFromString)|Set(?:Format|Property))|Get(?:ByteSize|Type(?:ID)?|Value)|IsFloatType)))|P(?:lugIn(?:AddInstanceForFactory|Create|FindFactoriesForPlugInType(?:InPlugIn)?|Get(?:Bundle|TypeID)|I(?:nstance(?:Create(?:WithInstanceDataSize)?|Get(?:FactoryName|In(?:stanceData|terfaceFunctionTable)|TypeID))|sLoadOnDemand)|Re(?:gister(?:FactoryFunction(?:ByName)?|PlugInType)|moveInstanceForFactory)|SetLoadOnDemand|Unregister(?:Factory|PlugInType))|r(?:eferences(?:A(?:ddSuitePreferencesToApp|pp(?:Synchronize|ValueIsForced))|Copy(?:AppValue|KeyList|Multiple|Value)|GetApp(?:BooleanValue|IntegerValue)|RemoveSuitePreferencesFromApp|S(?:et(?:AppValue|Multiple|Value)|ynchronize))|opertyList(?:Create(?:D(?:ata|eepCopy)|With(?:Data|Stream))|IsValid|Write)))|R(?:angeMake|e(?:adStream(?:C(?:lose|opy(?:Error|Property)|reateWith(?:BytesNoCopy|File))|Get(?:Buffer|Error|Status|TypeID)|HasBytesAvailable|Open|Read|S(?:cheduleWithRunLoop|et(?:Client|Property))|UnscheduleFromRunLoop)|lease|tain)|unLoop(?:Add(?:CommonMode|Observer|Source|Timer)|Co(?:ntains(?:Observer|Source|Timer)|py(?:AllModes|CurrentMode))|Get(?:Current|Main|NextTimerFireDate|TypeID)|IsWaiting|Observer(?:Create(?:WithHandler)?|DoesRepeat|Get(?:Activities|Context|Order|TypeID)|I(?:nvalidate|sValid))|PerformBlock|R(?:emove(?:Observer|Source|Timer)|un(?:InMode)?)|S(?:ource(?:Create|Get(?:Context|Order|TypeID)|I(?:nvalidate|sValid)|Signal)|top)|Timer(?:Create(?:WithHandler)?|DoesRepeat|Get(?:Context|Interval|NextFireDate|Order|TypeID)|I(?:nvalidate|sValid)|SetNextFireDate)|WakeUp))|S(?:et(?:A(?:ddValue|pplyFunction)|C(?:ontainsValue|reate(?:Copy|Mutable(?:Copy)?)?)|Get(?:Count(?:OfValue)?|TypeID|Value(?:IfPresent|s)?)|Re(?:move(?:AllValues|Value)|placeValue)|SetValue)|how(?:Str)?|ocket(?:C(?:o(?:nnectToAddress|py(?:Address|PeerAddress|Registered(?:SocketSignature|Value)))|reate(?:ConnectedToSocketSignature|RunLoopSource|With(?:Native|SocketSignature))?)|DisableCallBacks|EnableCallBacks|Get(?:Context|DefaultNameRegistryPortNumber|Native|SocketFlags|TypeID)|I(?:nvalidate|sValid)|Register(?:SocketSignature|Value)|Se(?:ndData|t(?:Address|DefaultNameRegistryPortNumber|SocketFlags))|Unregister)|tr(?:eamCreate(?:BoundPair|PairWith(?:PeerSocketSignature|Socket(?:ToHost)?))|ing(?:Append(?:C(?:String|haracters)|Format(?:AndArguments)?|PascalString)?|C(?:apitalize|o(?:mpare(?:WithOptions(?:AndLocale)?)?|nvert(?:EncodingTo(?:IANACharSetName|NSStringEncoding|WindowsCodepage)|IANACharSetNameToEncoding|NSStringEncodingToEncoding|WindowsCodepageToEncoding))|reate(?:Array(?:BySeparatingStrings|WithFindResults)|ByCombiningStrings|Copy|ExternalRepresentation|FromExternalRepresentation|Mutable(?:Copy|WithExternalCharactersNoCopy)?|With(?:Bytes(?:NoCopy)?|C(?:String(?:NoCopy)?|haracters(?:NoCopy)?)|F(?:ileSystemRepresentation|ormat(?:AndArguments)?)|PascalString(?:NoCopy)?|Substring)))|Delete|F(?:ind(?:AndReplace|CharacterFromSet|WithOptions(?:AndLocale)?)?|old)|Get(?:Bytes|C(?:String(?:Ptr)?|haracter(?:AtIndex|FromInlineBuffer|s(?:Ptr)?))|DoubleValue|F(?:astestEncoding|ileSystemRepresentation)|HyphenationLocationBeforeIndex|IntValue|L(?:ength|i(?:neBounds|stOfAvailableEncodings)|ongCharacterForSurrogatePair)|M(?:aximumSize(?:ForEncoding|OfFileSystemRepresentation)|ostCompatibleMacStringEncoding)|NameOfEncoding|Pa(?:ragraphBounds|scalString(?:Ptr)?)|RangeOfComposedCharactersAtIndex|S(?:mallestEncoding|urrogatePairForLongCharacter|ystemEncoding)|TypeID)|Has(?:Prefix|Suffix)|I(?:n(?:itInlineBuffer|sert)|s(?:EncodingAvailable|HyphenationAvailableForLocale|Surrogate(?:HighCharacter|LowCharacter)))|Lowercase|Normalize|Pad|Replace(?:All)?|SetExternalCharactersNoCopy|T(?:okenizer(?:AdvanceToNextToken|C(?:opy(?:BestStringLanguage|CurrentTokenAttribute)|reate)|G(?:et(?:Current(?:SubTokens|TokenRange)|TypeID)|oToTokenAtIndex)|SetString)|r(?:ansform|im(?:Whitespace)?))|Uppercase))|wapInt(?:16(?:BigToHost|HostTo(?:Big|Little)|LittleToHost)?|32(?:BigToHost|HostTo(?:Big|Little)|LittleToHost)?|64(?:BigToHost|HostTo(?:Big|Little)|LittleToHost)?))|T(?:imeZone(?:C(?:opy(?:Abbreviation(?:Dictionary)?|Default|KnownNames|LocalizedName|System)|reate(?:With(?:Name|TimeIntervalFromGMT))?)|Get(?:Da(?:ta|ylightSavingTimeOffset)|N(?:ame|extDaylightSavingTimeTransition)|SecondsFromGMT|TypeID)|IsDaylightSavingTime|ResetSystem|Set(?:AbbreviationDictionary|Default))|ree(?:App(?:endChild|lyFunctionToChildren)|Create|FindRoot|Get(?:C(?:hild(?:AtIndex|Count|ren)|ontext)|FirstChild|NextSibling|Parent|TypeID)|InsertSibling|PrependChild|Remove(?:AllChildren)?|S(?:etContext|ortChildren)))|U(?:RL(?:C(?:anBeDecomposed|learResourcePropertyCache(?:ForKey)?|opy(?:AbsoluteURL|F(?:ileSystemPath|ragment)|HostName|LastPathComponent|NetLocation|Pa(?:ssword|th(?:Extension)?)|QueryString|Resource(?:Propert(?:iesForKeys|yForKey)|Specifier)|S(?:cheme|trictPath)|UserName)|reate(?:AbsoluteURLWithBytes|B(?:ookmarkData(?:From(?:AliasRecord|File))?|yResolvingBookmarkData)|Copy(?:AppendingPath(?:Component|Extension)|Deleting(?:LastPathComponent|PathExtension))|Data|F(?:ile(?:PathURL|ReferenceURL)|romFileSystemRepresentation(?:RelativeToBase)?)|ResourcePropert(?:iesForKeysFromBookmarkData|yForKeyFromBookmarkData)|StringByReplacingPercentEscapes|With(?:Bytes|FileSystemPath(?:RelativeToBase)?|String)))|Enumerator(?:CreateFor(?:DirectoryURL|MountedVolumes)|Get(?:DescendentLevel|NextURL|TypeID)|SkipDescendents)|Get(?:B(?:aseURL|yte(?:RangeForComponent|s))|FileSystemRepresentation|PortNumber|String|TypeID)|HasDirectoryPath|ResourceIsReachable|S(?:et(?:ResourcePropert(?:iesForKeys|yForKey)|TemporaryResourcePropertyForKey)|t(?:artAccessingSecurityScopedResource|opAccessingSecurityScopedResource))|WriteBookmarkDataToFile)|UID(?:Create(?:From(?:String|UUIDBytes)|String|WithBytes)?|Get(?:ConstantUUIDWithBytes|TypeID|UUIDBytes))|serNotification(?:C(?:ancel|heckBoxChecked|reate(?:RunLoopSource)?)|Display(?:Alert|Notice)|Get(?:Response(?:Dictionary|Value)|TypeID)|PopUpSelection|ReceiveResponse|SecureTextField|Update))|WriteStream(?:C(?:anAcceptBytes|lose|opy(?:Error|Property)|reateWith(?:AllocatedBuffers|Buffer|File))|Get(?:Error|Status|TypeID)|Open|S(?:cheduleWithRunLoop|et(?:Client|Property))|UnscheduleFromRunLoop|Write)|XMLCreateStringBy(?:EscapingEntities|UnescapingEntities))\\b)" }, { "captures": { @@ -400,6 +922,28 @@ }, "match": "(\\s*)(\\b(?:clock_(?:get(?:res|time(?:_nsec_np)?)|settime)|mk(?:ostemp(?:s)?|pathat_np)|rename(?:atx_np|x_np)|timingsafe_bcmp)\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.clib.10.13.c" + } + }, + "match": "(\\s*)(\\b(?:fmemopen|mk(?:dtempat_np|ostempsat_np|stempsat_np)|open_memstream|ptsname_r|setattrlistat)\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.clib.10.15.c" + } + }, + "match": "(\\s*)(\\b(?:rpmatch|timespec_get)\\b)" + }, { "captures": { "1": { @@ -420,7 +964,7 @@ "name": "support.function.clib.10.9.c" } }, - "match": "(\\s*)(\\bf(?:fsll|lsll)\\b)" + "match": "(\\s*)(\\b(?:f(?:fsll|lsll)|memset_s)\\b)" }, { "captures": { @@ -431,7 +975,7 @@ "name": "support.function.clib.c" } }, - "match": "(\\s*)(\\b(?:a(?:64l|b(?:ort|s)|c(?:c(?:ess(?:x_np)?|t)|os(?:f|h(?:f|l)?|l)?)|dd_profil|l(?:arm|loca)|rc4random(?:_(?:addrandom|buf|stir|uniform))?|s(?:ctime(?:_r)?|in(?:f|h(?:f|l)?|l)?|printf)|t(?:an(?:2(?:f|l)?|f|h(?:f|l)?|l)?|exit(?:_b)?|o(?:f|i|l(?:l)?)))|b(?:c(?:mp|opy)|rk|s(?:d_signal|earch(?:_b)?)|zero)|c(?:alloc|brt(?:f|l)?|eil(?:f|l)?|get(?:c(?:ap|lose)|ent|first|match|n(?:ext|um)|s(?:et|tr)|ustr)|h(?:dir|own|root)|l(?:earerr|o(?:ck|se))|o(?:nfstr|pysign(?:f|l)?|s(?:f|h(?:f|l)?|l)?)|r(?:eat|ypt)|t(?:ermid(?:_r)?|ime(?:_r)?))|d(?:evname(?:_r)?|i(?:fftime|gittoint|spatch_(?:time|walltime)|v)|printf|rand48|up(?:2)?)|e(?:cvt|n(?:crypt|dusershell)|r(?:and48|f(?:c(?:f|l)?|f|l)?)|x(?:changedata|ec(?:l(?:e|p)?|v(?:P|e|p)?)|it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|f(?:abs(?:f|l)?|c(?:h(?:dir|own)|lose|ntl|vt)|d(?:im(?:f|l)?|open)|e(?:of|rror)|f(?:l(?:agstostr|ush)|s(?:ctl|l)?)|get(?:attrlist|c|ln|pos|s)|ile(?:no|sec_(?:dup|free|get_property|init|query_property|set_property|unset_property))|l(?:o(?:ck(?:file)?|or(?:f|l)?)|s(?:l)?)|m(?:a(?:f|l|x(?:f|l)?)?|in(?:f|l)?|od(?:f|l)?|tcheck)|o(?:pen|rk)|p(?:athconf|rintf|u(?:rge|t(?:c|s)))|re(?:ad|e|open|xp(?:f|l)?)|s(?:c(?:anf|tl)|e(?:ek(?:o)?|t(?:attrlist|pos))|ync)|t(?:ell(?:o)?|r(?:uncate|ylockfile))|un(?:lockfile|open)|write)|g(?:cvt|et(?:attrlist|bsize|c(?:_unlocked|har(?:_unlocked)?|wd)?|d(?:ate|elim|irentriesattr|omainname|tablesize)|e(?:gid|nv|uid)|g(?:id|roup(?:list|s))|host(?:id|name)|iopolicy_np|l(?:ine|o(?:adavg|gin(?:_r)?))|mode|opt|p(?:a(?:gesize|ss)|eereid|g(?:id|rp)|id|pid|r(?:iority|ogname))|r(?:limit|usage)|s(?:groups_np|id|ubopt)?|u(?:id|sershell)|w(?:d|groups_np)?)|mtime(?:_r)?|rantpt)|h(?:eapsort(?:_b)?|ypot(?:f|l)?)|i(?:logb(?:f|l)?|n(?:dex|it(?:groups|state))|ruserok(?:_sa)?|s(?:a(?:l(?:num|pha)|scii|tty)|blank|cntrl|digit|graph|hexnumber|ideogram|lower|number|p(?:honogram|rint|unct)|rune|s(?:etugid|p(?:ace|ecial))|upper|xdigit))|j(?:0|1|n|rand48)|kill(?:pg)?|l(?:64a|abs|c(?:hown|ong48)|d(?:exp(?:f|l)?|iv)|gamma(?:f|l)?|ink|l(?:abs|div|r(?:int(?:f|l)?|ound(?:f|l)?))|o(?:c(?:al(?:econv|time(?:_r)?)|kf)|g(?:1(?:0(?:f|l)?|p(?:f|l)?)|2(?:f|l)?|b(?:f|l)?|f|l)?|ngjmp(?:error)?)|r(?:and48|int(?:f|l)?|ound(?:f|l)?)|seek)|m(?:a(?:jor|kedev|lloc)|b(?:len|stowcs|towc)|e(?:m(?:c(?:cpy|hr|mp|py)|m(?:em|ove)|set(?:_pattern(?:16|4|8))?)|rgesort(?:_b)?)|inor|k(?:dtemp|nod|stemp(?:_dprotected_np|s)?|t(?:emp|ime))|odf(?:f|l)?|rand48)|n(?:an(?:f|l|osleep)?|e(?:arbyint(?:f|l)?|xt(?:after(?:f|l)?|toward(?:f|l)?))|fssvc|ice|rand48)|open(?:_dprotected_np|x_np)?|p(?:a(?:thconf|use)|close|error|ipe|o(?:pen|six(?:2time|_(?:memalign|openpt))|w(?:f|l)?)|r(?:ead|intf|ofil)|s(?:elect|ignal|ort(?:_(?:b|r))?)|t(?:hread_(?:getugid_np|kill|s(?:etugid_np|igmask))|sname)|ut(?:c(?:_unlocked|har(?:_unlocked)?)?|env|s|w)|write)|qsort(?:_(?:b|r))?|r(?:a(?:dixsort|ise|nd(?:_r|om)?)|cmd(?:_af)?|e(?:a(?:d(?:link)?|l(?:loc(?:f)?|path))|boot|m(?:ainder(?:f|l)?|ove|quo(?:f|l)?)|name|voke|wind)|in(?:dex|t(?:f|l)?)|mdir|ound(?:f|l)?|resvport(?:_af)?|userok)|s(?:brk|ca(?:lb(?:ln(?:f|l)?|n(?:f|l)?)?|nf)|e(?:archfs|ed48|lect|t(?:attrlist|buf(?:fer)?|domainname|e(?:gid|nv|uid)|g(?:id|roups)|host(?:id|name)|iopolicy_np|jmp|key|l(?:inebuf|o(?:cale|gin))|mode|p(?:g(?:id|rp)|r(?:iority|ogname))|r(?:e(?:gid|uid)|gid|limit|uid)|s(?:groups_np|id|tate)|u(?:id|sershell)|vbuf|wgroups_np))|i(?:g(?:a(?:ction|ddset|ltstack)|block|delset|emptyset|fillset|hold|i(?:gnore|nterrupt|smember)|longjmp|nal|p(?:ause|ending|rocmask)|relse|s(?:et(?:jmp|mask)?|uspend)|vec|wait)|n(?:f|h(?:f|l)?|l)?)|leep|nprintf|printf|qrt(?:f|l)?|ra(?:dixsort|nd(?:48|dev|om(?:dev)?)?)|scanf|t(?:p(?:cpy|ncpy)|r(?:c(?:a(?:se(?:cmp|str)|t)|hr|mp|oll|py|spn)|dup|error(?:_r)?|ftime|l(?:c(?:at|py)|en)|mode|n(?:c(?:a(?:secmp|t)|mp|py)|dup|len|str)|p(?:brk|time)|rchr|s(?:ep|ignal|pn|tr)|to(?:d|f(?:flags)?|k(?:_r)?|l(?:d|l)?|q|u(?:l(?:l)?|q))|xfrm))|wa(?:b|pon)|y(?:mlink|nc|s(?:conf|tem)))|t(?:an(?:f|h(?:f|l)?|l)?|c(?:getpgrp|setpgrp)|empnam|gamma(?:f|l)?|ime(?:2posix|gm|local)?|mp(?:file|nam)|o(?:ascii|lower|upper)|runc(?:ate|f|l)?|ty(?:name(?:_r)?|slot)|zset(?:wall)?)|u(?:alarm|n(?:delete|getc|l(?:ink|ockpt)|setenv|whiteout)|sleep)|v(?:a(?:lloc|sprintf)|dprintf|f(?:ork|printf|scanf)|printf|s(?:canf|nprintf|printf|scanf))|w(?:ait(?:3|4|id|pid)?|c(?:stombs|tomb)|rite)|y(?:0|1|n)|zopen)\\b)" + "match": "(\\s*)(\\b(?:a(?:64l|b(?:ort|s)|c(?:c(?:ess(?:x_np)?|t)|os(?:f|h(?:f|l)?|l)?)|d(?:d_profil|jtime)|l(?:arm|loca)|rc4random(?:_(?:buf|stir|uniform))?|s(?:ctime(?:_r)?|in(?:f|h(?:f|l)?|l)?|printf)|t(?:an(?:2(?:f|l)?|f|h(?:f|l)?|l)?|exit(?:_b)?|o(?:f|i|l(?:l)?)))|b(?:c(?:mp|opy)|rk|s(?:d_signal|earch(?:_b)?)|zero)|c(?:brt(?:f|l)?|eil(?:f|l)?|get(?:c(?:ap|lose)|ent|first|match|n(?:ext|um)|s(?:et|tr)|ustr)|h(?:dir|own|root)|l(?:earerr|o(?:ck|se))|o(?:nfstr|pysign(?:f|l)?|s(?:f|h(?:f|l)?|l)?)|r(?:eat|ypt)|t(?:ermid_r|ime(?:_r)?))|d(?:evname(?:_r)?|i(?:fftime|spatch_(?:time|walltime)|v)|printf|rand48|up(?:2)?)|e(?:cvt|n(?:crypt|dusershell)|r(?:and48|f(?:c(?:f|l)?|f|l)?)|x(?:changedata|ec(?:l(?:e|p)?|v(?:P|e|p)?)|it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|f(?:abs(?:f|l)?|c(?:h(?:dir|own)|lose|ntl|vt)|d(?:im(?:f|l)?|open)|e(?:of|rror)|f(?:l(?:agstostr|ush)|s(?:ctl|l)?)|get(?:attrlist|c|ln|pos|s)|ile(?:no|sec_(?:dup|free|get_property|init|query_property|set_property|unset_property))|l(?:o(?:ck(?:file)?|or(?:f|l)?)|s(?:l)?)|m(?:a(?:f|l|x(?:f|l)?)?|in(?:f|l)?|od(?:f|l)?|tcheck)|o(?:pen|rk)|p(?:athconf|rintf|u(?:rge|t(?:c|s)))|re(?:ad|open|xp(?:f|l)?)|s(?:c(?:anf|tl)|e(?:ek(?:o)?|t(?:attrlist|pos))|ync)|t(?:ell(?:o)?|r(?:uncate|ylockfile))|u(?:n(?:lockfile|open)|times)|write)|g(?:cvt|et(?:attrlist|bsize|c(?:_unlocked|har(?:_unlocked)?|wd)?|d(?:ate|elim|irentriesattr|omainname|tablesize)|e(?:gid|nv|uid)|g(?:id|roup(?:list|s))|host(?:id|name)|i(?:opolicy_np|timer)|l(?:ine|o(?:adavg|gin(?:_r)?))|mode|opt|p(?:a(?:gesize|ss)|eereid|g(?:id|rp)|id|pid|r(?:iority|ogname))|r(?:limit|usage)|s(?:groups_np|id|ubopt)?|timeofday|u(?:id|sershell)|w(?:d|groups_np)?)|mtime(?:_r)?|rantpt)|h(?:eapsort(?:_b)?|ypot(?:f|l)?)|i(?:logb(?:f|l)?|n(?:dex|it(?:groups|state))|ruserok(?:_sa)?|s(?:atty|setugid))|j(?:0|1|n|rand48)|kill(?:pg)?|l(?:64a|abs|c(?:hown|ong48)|d(?:exp(?:f|l)?|iv)|gamma(?:f|l)?|ink|l(?:abs|div|r(?:int(?:f|l)?|ound(?:f|l)?))|o(?:c(?:al(?:econv|time(?:_r)?)|kf)|g(?:1(?:0(?:f|l)?|p(?:f|l)?)|2(?:f|l)?|b(?:f|l)?|f|l)?|ngjmp(?:error)?)|r(?:and48|int(?:f|l)?|ound(?:f|l)?)|seek|utimes)|m(?:b(?:len|stowcs|towc)|e(?:m(?:c(?:cpy|hr|mp|py)|m(?:em|ove)|set(?:_pattern(?:16|4|8))?)|rgesort(?:_b)?)|k(?:dtemp|nod|stemp(?:_dprotected_np|s)?|t(?:emp|ime))|odf(?:f|l)?|rand48)|n(?:an(?:f|l|osleep)?|e(?:arbyint(?:f|l)?|xt(?:after(?:f|l)?|toward(?:f|l)?))|fssvc|ice|rand48)|open(?:_dprotected_np|x_np)?|p(?:a(?:thconf|use)|close|error|ipe|o(?:pen|six(?:2time|_openpt)|w(?:f|l)?)|r(?:ead|intf|ofil)|s(?:elect|ignal|ort(?:_(?:b|r))?)|t(?:hread_(?:getugid_np|kill|s(?:etugid_np|igmask))|sname)|ut(?:c(?:_unlocked|har(?:_unlocked)?)?|env|s|w)|write)|qsort(?:_(?:b|r))?|r(?:a(?:dixsort|ise|nd(?:_r|om)?)|cmd(?:_af)?|e(?:a(?:d(?:link)?|l(?:locf|path))|boot|m(?:ainder(?:f|l)?|ove|quo(?:f|l)?)|name|voke|wind)|in(?:dex|t(?:f|l)?)|mdir|ound(?:f|l)?|resvport(?:_af)?|userok)|s(?:brk|ca(?:lb(?:ln(?:f|l)?|n(?:f|l)?)?|nf)|e(?:archfs|ed48|lect|t(?:attrlist|buf(?:fer)?|domainname|e(?:gid|nv|uid)|g(?:id|roups)|host(?:id|name)|i(?:opolicy_np|timer)|jmp|key|l(?:inebuf|o(?:cale|gin))|mode|p(?:g(?:id|rp)|r(?:iority|ogname))|r(?:e(?:gid|uid)|gid|limit|uid)|s(?:groups_np|id|tate)|timeofday|u(?:id|sershell)|vbuf|wgroups_np))|i(?:g(?:a(?:ction|ddset|ltstack)|block|delset|emptyset|fillset|hold|i(?:gnore|nterrupt|smember)|longjmp|nal|p(?:ause|ending|rocmask)|relse|s(?:et(?:jmp|mask)?|uspend)|vec|wait)|md_muladd|n(?:f|h(?:f|l)?|l)?)|leep|nprintf|printf|qrt(?:f|l)?|ra(?:dixsort|nd(?:48|dev|om(?:dev)?)?)|scanf|t(?:p(?:cpy|ncpy)|r(?:c(?:a(?:se(?:cmp|str)|t)|hr|mp|oll|py|spn)|dup|error(?:_r)?|ftime|l(?:c(?:at|py)|en)|mode|n(?:c(?:a(?:secmp|t)|mp|py)|dup|len|str)|p(?:brk|time)|rchr|s(?:ep|ignal|pn|tr)|to(?:d|f(?:flags)?|k(?:_r)?|l(?:d|l)?|q|u(?:l(?:l)?|q))|xfrm))|wa(?:b|pon)|y(?:mlink|nc|s(?:conf|tem)))|t(?:an(?:f|h(?:f|l)?|l)?|c(?:getpgrp|setpgrp)|empnam|gamma(?:f|l)?|ime(?:2posix|gm|local)?|mp(?:file|nam)|runc(?:ate|f|l)?|ty(?:name(?:_r)?|slot)|zset(?:wall)?)|u(?:alarm|n(?:delete|getc|l(?:ink|ockpt)|setenv|whiteout)|sleep|times)|v(?:a(?:lloc|sprintf)|dprintf|f(?:ork|printf|scanf)|printf|s(?:canf|nprintf|printf|scanf))|w(?:ait(?:3|4|id|pid)?|c(?:stombs|tomb)|rite)|y(?:0|1|n)|zopen)\\b)" }, { "captures": { @@ -455,6 +999,17 @@ }, "match": "(\\s*)(\\bdispatch_(?:a(?:ctivate|ssert_queue(?:_(?:barrier|not))?)|queue_(?:attr_make_(?:initially_inactive|with_autorelease_frequency)|create_with_target))\\b)" }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.dispatch.10.14.c" + } + }, + "match": "(\\s*)(\\bdispatch_(?:async_and_wait(?:_f)?|barrier_async_and_wait(?:_f)?|set_qos_class_floor|workloop_(?:create(?:_inactive)?|set_autorelease_frequency))\\b)" + }, { "captures": { "1": { @@ -466,17 +1021,6 @@ }, "match": "(\\s*)(\\bdispatch_(?:a(?:fter(?:_f)?|pply(?:_f)?|sync(?:_f)?)|barrier_(?:async(?:_f)?|sync(?:_f)?)|cancel|data_(?:apply|c(?:opy_region|reate(?:_(?:concat|map|subrange))?)|get_size)|g(?:et_(?:context|global_queue|main_queue|specific)|roup_(?:async(?:_f)?|create|enter|leave|notify(?:_f)?|wait))|io_(?:barrier|c(?:lose|reate(?:_with_(?:io|path))?)|get_descriptor|read|set_(?:high_water|interval|low_water)|write)|main|notify|once(?:_f)?|queue_(?:create|get_(?:label|specific)|set_specific)|re(?:ad|lease|sume|tain)|s(?:e(?:maphore_(?:create|signal|wait)|t_(?:context|finalizer_f|target_queue))|ource_(?:c(?:ancel|reate)|get_(?:data|handle|mask)|merge_data|set_(?:cancel_handler(?:_f)?|event_handler(?:_f)?|registration_handler(?:_f)?|timer)|testcancel)|uspend|ync(?:_f)?)|testcancel|w(?:ait|rite))\\b)" }, - { - "captures": { - "1": { - "name": "punctuation.whitespace.support.function.leading" - }, - "2": { - "name": "support.function.mac-classic.c" - } - }, - "match": "(\\s*)(\\bStrLength\\b)" - }, { "captures": { "1": { @@ -488,28 +1032,6 @@ }, "match": "(\\s*)(\\b(?:OS(?:HostByteOrder|ReadSwapInt(?:16|32|64)|WriteSwapInt(?:16|32|64))|gethostuuid)\\b)" }, - { - "captures": { - "1": { - "name": "punctuation.whitespace.support.function.leading" - }, - "2": { - "name": "support.function.pthread.10.10.c" - } - }, - "match": "(\\s*)(\\bpthread_(?:attr_(?:get_qos_class_np|set_qos_class_np)|get_qos_class_np|override_qos_class_(?:end_np|start_np)|set_qos_class_self_np)\\b)" - }, - { - "captures": { - "1": { - "name": "punctuation.whitespace.support.function.leading" - }, - "2": { - "name": "support.function.pthread.c" - } - }, - "match": "(\\s*)(\\b(?:pthread_(?:at(?:fork|tr_(?:destroy|get(?:detachstate|guardsize|inheritsched|s(?:c(?:hedp(?:aram|olicy)|ope)|tack(?:addr|size)?))|init|set(?:detachstate|guardsize|inheritsched|s(?:c(?:hedp(?:aram|olicy)|ope)|tack(?:addr|size)?))))|c(?:ancel|ond(?:_(?:broadcast|destroy|init|signal(?:_thread_np)?|timedwait(?:_relative_np)?|wait)|attr_(?:destroy|getpshared|init|setpshared))|reate(?:_suspended_np)?)|detach|e(?:qual|xit)|from_mach_thread_np|get(?:_stack(?:addr_np|size_np)|concurrency|name_np|s(?:chedparam|pecific))|is_threaded_np|join|k(?:ey_(?:create|delete)|ill)|m(?:a(?:ch_thread_np|in_np)|utex(?:_(?:destroy|getprioceiling|init|lock|setprioceiling|trylock|unlock)|attr_(?:destroy|get(?:p(?:r(?:ioceiling|otocol)|shared)|type)|init|set(?:p(?:r(?:ioceiling|otocol)|shared)|type))))|once|rwlock(?:_(?:destroy|init|rdlock|try(?:rdlock|wrlock)|unlock|wrlock)|attr_(?:destroy|getpshared|init|setpshared))|s(?:e(?:lf|t(?:c(?:ancel(?:state|type)|oncurrency)|name_np|s(?:chedparam|pecific)))|igmask)|t(?:estcancel|hreadid_np)|yield_np)|sched_(?:get_priority_m(?:ax|in)|yield))\\b)" - }, { "captures": { "1": { @@ -530,7 +1052,40 @@ "name": "support.function.quartz.10.12.c" } }, - "match": "(\\s*)(\\bCGColor(?:ConversionInfoCreate(?:FromList)?|Space(?:CopyICCData|IsWideGamutRGB|SupportsOutput))\\b)" + "match": "(\\s*)(\\bCGColor(?:ConversionInfoCreate(?:FromList)?|Space(?:C(?:opy(?:ICCData|PropertyList)|reateWith(?:ICCData|PropertyList))|IsWideGamutRGB|SupportsOutput))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.quartz.10.13.c" + } + }, + "match": "(\\s*)(\\bCG(?:Color(?:ConversionInfoCreateFromListWithArguments|SpaceGetName)|DataProviderGetInfo|EventCreateScrollWheelEvent2|P(?:DF(?:ContextSetOutline|DocumentGet(?:AccessPermissions|Outline))|athApplyWithBlock))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.quartz.10.14.c" + } + }, + "match": "(\\s*)(\\bCG(?:ColorConversionInfoCreateWithOptions|ImageGet(?:ByteOrderInfo|PixelFormatInfo)|PDF(?:ArrayApplyBlock|DictionaryApplyBlock))\\b)" + }, + { + "captures": { + "1": { + "name": "punctuation.whitespace.support.function.leading" + }, + "2": { + "name": "support.function.quartz.10.15.c" + } + }, + "match": "(\\s*)(\\bCG(?:ColorCreate(?:GenericGrayGamma2_2|SRGB)|PDF(?:Context(?:BeginTag|EndTag)|TagTypeGetName))\\b)" }, { "captures": { @@ -563,7 +1118,7 @@ "name": "support.function.quartz.c" } }, - "match": "(\\s*)(\\bCG(?:A(?:cquireDisplayFadeReservation|ffineTransform(?:Concat|EqualToTransform|I(?:nvert|sIdentity)|Make(?:Rotation|Scale|Translation)?|Rotate|Scale|Translate)|ssociateMouseAndMouseCursorPosition)|B(?:eginDisplayConfiguration|itmapContext(?:Create(?:Image|WithData)?|Get(?:AlphaInfo|B(?:it(?:mapInfo|sPer(?:Component|Pixel))|ytesPerRow)|ColorSpace|Data|Height|Width)))|C(?:a(?:ncelDisplayConfiguration|ptureAllDisplays(?:WithOptions)?)|o(?:lor(?:C(?:onversionInfoGetTypeID|reate(?:Copy(?:WithAlpha)?|Generic(?:CMYK|Gray|RGB)|WithPattern)?)|EqualToColor|Get(?:Alpha|Co(?:lorSpace|mponents|nstantColor)|NumberOfComponents|Pattern|TypeID)|Re(?:lease|tain)|Space(?:C(?:opy(?:ICCProfile|Name)|reate(?:Calibrated(?:Gray|RGB)|Device(?:CMYK|Gray|RGB)|I(?:CCBased|ndexed)|Lab|Pattern|With(?:ICCProfile|Name|PlatformColorSpace)))|Get(?:BaseColorSpace|ColorTable(?:Count)?|Model|NumberOfComponents|TypeID)|Re(?:lease|tain)))|mpleteDisplayConfiguration|n(?:figureDisplay(?:FadeEffect|MirrorOfDisplay|Origin|StereoOperation|WithDisplayMode)|text(?:Add(?:Arc(?:ToPoint)?|CurveToPoint|EllipseInRect|Line(?:ToPoint|s)|Path|QuadCurveToPoint|Rect(?:s)?)|Begin(?:Pa(?:ge|th)|TransparencyLayer(?:WithRect)?)|C(?:l(?:earRect|ip(?:To(?:Mask|Rect(?:s)?))?|osePath)|o(?:n(?:catCTM|vert(?:PointTo(?:DeviceSpace|UserSpace)|RectTo(?:DeviceSpace|UserSpace)|SizeTo(?:DeviceSpace|UserSpace)))|pyPath))|Draw(?:Image|L(?:ayer(?:AtPoint|InRect)|inearGradient)|P(?:DFPage|ath)|RadialGradient|Shading|TiledImage)|E(?:O(?:Clip|FillPath)|nd(?:Page|TransparencyLayer))|F(?:ill(?:EllipseInRect|Path|Rect(?:s)?)|lush)|Get(?:C(?:TM|lipBoundingBox)|InterpolationQuality|Path(?:BoundingBox|CurrentPoint)|T(?:ext(?:Matrix|Position)|ypeID)|UserSpaceToDeviceSpaceTransform)|IsPathEmpty|MoveToPoint|PathContainsPoint|R(?:e(?:lease|placePathWithStrokedPath|storeGState|tain)|otateCTM)|S(?:aveGState|caleCTM|et(?:Al(?:lows(?:Antialiasing|FontS(?:moothing|ubpixel(?:Positioning|Quantization)))|pha)|BlendMode|C(?:MYK(?:FillColor|StrokeColor)|haracterSpacing)|F(?:ill(?:Color(?:Space|WithColor)?|Pattern)|latness|ont(?:Size)?)|Gray(?:FillColor|StrokeColor)|InterpolationQuality|Line(?:Cap|Dash|Join|Width)|MiterLimit|PatternPhase|R(?:GB(?:FillColor|StrokeColor)|enderingIntent)|S(?:h(?:adow(?:WithColor)?|ould(?:Antialias|S(?:moothFonts|ubpixel(?:PositionFonts|QuantizeFonts))))|troke(?:Color(?:Space|WithColor)?|Pattern))|Text(?:DrawingMode|Matrix|Position))|howGlyphsAtPositions|troke(?:EllipseInRect|LineSegments|Path|Rect(?:WithWidth)?)|ynchronize)|TranslateCTM))))|D(?:ata(?:Consumer(?:Create(?:With(?:CFData|URL))?|GetTypeID|Re(?:lease|tain))|Provider(?:C(?:opyData|reate(?:Direct|Sequential|With(?:CFData|Data|Filename|URL)))|GetTypeID|Re(?:lease|tain)))|isplay(?:Bounds|C(?:apture(?:WithOptions)?|opy(?:AllDisplayModes|ColorSpace|DisplayMode)|reateImage(?:ForRect)?)|Fade|G(?:ammaTableCapacity|etDrawingContext)|HideCursor|I(?:DToOpenGLDisplayMask|s(?:A(?:ctive|lwaysInMirrorSet|sleep)|Builtin|In(?:HWMirrorSet|MirrorSet)|Main|Online|Stereo))|M(?:irrorsDisplay|o(?:de(?:Get(?:Height|IO(?:DisplayModeID|Flags)|RefreshRate|TypeID|Width)|IsUsableForDesktopGUI|Re(?:lease|tain)|lNumber)|veCursorToPoint))|P(?:ixels(?:High|Wide)|rimaryDisplay)|R(?:e(?:gisterReconfigurationCallback|lease|moveReconfigurationCallback|storeColorSyncSettings)|otation)|S(?:creenSize|e(?:rialNumber|t(?:DisplayMode|StereoOperation))|howCursor)|U(?:nitNumber|sesOpenGLAcceleration)|VendorNumber))|Event(?:Create(?:Copy|Data|FromData|KeyboardEvent|MouseEvent|S(?:crollWheelEvent|ourceFromEvent))?|Get(?:DoubleValueField|Flags|IntegerValueField|Location|T(?:imestamp|ype(?:ID)?)|UnflippedLocation)|Keyboard(?:GetUnicodeString|SetUnicodeString)|Post(?:ToPSN)?|S(?:et(?:DoubleValueField|Flags|IntegerValueField|Location|Source|T(?:imestamp|ype))|ource(?:ButtonState|C(?:ounterForEventType|reate)|FlagsState|Get(?:KeyboardType|LocalEvents(?:FilterDuringSuppressionState|SuppressionInterval)|PixelsPerLine|SourceStateID|TypeID|UserData)|KeyState|Se(?:condsSinceLastEventType|t(?:KeyboardType|LocalEvents(?:FilterDuringSuppressionState|SuppressionInterval)|PixelsPerLine|UserData))))|Tap(?:Create(?:ForPSN)?|Enable|IsEnabled|PostEvent))|F(?:ont(?:C(?:anCreatePostScriptSubset|opy(?:FullName|GlyphNameForGlyph|PostScriptName|Table(?:ForTag|Tags)|Variation(?:Axes|s))|reate(?:CopyWithVariations|PostScript(?:Encoding|Subset)|With(?:DataProvider|FontName)))|Get(?:Ascent|CapHeight|Descent|FontBBox|Glyph(?:Advances|BBoxes|WithGlyphName)|ItalicAngle|Leading|NumberOfGlyphs|StemV|TypeID|UnitsPerEm|XHeight)|Re(?:lease|tain))|unction(?:Create|GetTypeID|Re(?:lease|tain)))|G(?:et(?:ActiveDisplayList|Display(?:TransferBy(?:Formula|Table)|sWith(?:OpenGLDisplayMask|Point|Rect))|EventTapList|LastMouseDelta|OnlineDisplayList)|radient(?:CreateWithColor(?:Components|s)|GetTypeID|Re(?:lease|tain)))|Image(?:Create(?:Copy(?:WithColorSpace)?|With(?:ImageInRect|JPEGDataProvider|Mask(?:ingColors)?|PNGDataProvider))?|Get(?:AlphaInfo|B(?:it(?:mapInfo|sPer(?:Component|Pixel))|ytesPerRow)|ColorSpace|D(?:ataProvider|ecode)|Height|RenderingIntent|ShouldInterpolate|TypeID|Width)|IsMask|MaskCreate|Re(?:lease|tain))|Layer(?:CreateWithContext|Get(?:Context|Size|TypeID)|Re(?:lease|tain))|MainDisplayID|OpenGLDisplayMaskToDisplayID|P(?:DF(?:ArrayGet(?:Array|Boolean|Count|Dictionary|Integer|N(?:ame|u(?:ll|mber))|Object|Str(?:eam|ing))|Conte(?:ntStream(?:CreateWith(?:Page|Stream)|Get(?:Resource|Streams)|Re(?:lease|tain))|xt(?:AddD(?:estinationAtPoint|ocumentMetadata)|BeginPage|C(?:lose|reate(?:WithURL)?)|EndPage|Set(?:DestinationForRect|URLForRect)))|D(?:ictionary(?:ApplyFunction|Get(?:Array|Boolean|Count|Dictionary|Integer|N(?:ame|umber)|Object|Str(?:eam|ing)))|ocument(?:Allows(?:Copying|Printing)|CreateWith(?:Provider|URL)|Get(?:Catalog|I(?:D|nfo)|NumberOfPages|Page|TypeID|Version)|Is(?:Encrypted|Unlocked)|Re(?:lease|tain)|UnlockWithPassword))|O(?:bjectGet(?:Type|Value)|peratorTable(?:Create|Re(?:lease|tain)|SetCallback))|Page(?:Get(?:BoxRect|D(?:ictionary|ocument|rawingTransform)|PageNumber|RotationAngle|TypeID)|Re(?:lease|tain))|S(?:canner(?:Create|GetContentStream|Pop(?:Array|Boolean|Dictionary|Integer|N(?:ame|umber)|Object|Str(?:eam|ing))|Re(?:lease|tain)|Scan)|tr(?:eam(?:CopyData|GetDictionary)|ing(?:Copy(?:Date|TextString)|Get(?:BytePtr|Length)))))|SConverter(?:Abort|C(?:onvert|reate)|GetTypeID|IsConverting)|at(?:h(?:A(?:dd(?:Arc(?:ToPoint)?|CurveToPoint|EllipseInRect|Line(?:ToPoint|s)|Path|QuadCurveToPoint|Re(?:ct(?:s)?|lativeArc))|pply)|C(?:loseSubpath|ontainsPoint|reate(?:Copy(?:By(?:DashingPath|StrokingPath|TransformingPath))?|Mutable(?:Copy(?:ByTransformingPath)?)?|With(?:EllipseInRect|Rect)))|EqualToPath|Get(?:BoundingBox|CurrentPoint|PathBoundingBox|TypeID)|Is(?:Empty|Rect)|MoveToPoint|Re(?:lease|tain))|tern(?:Create|GetTypeID|Re(?:lease|tain)))|oint(?:ApplyAffineTransform|CreateDictionaryRepresentation|EqualToPoint|Make(?:WithDictionaryRepresentation)?))|Re(?:ct(?:ApplyAffineTransform|C(?:ontains(?:Point|Rect)|reateDictionaryRepresentation)|Divide|EqualToRect|Get(?:Height|M(?:ax(?:X|Y)|i(?:d(?:X|Y)|n(?:X|Y)))|Width)|I(?:n(?:set|te(?:gral|rsect(?:ion|sRect)))|s(?:Empty|Infinite|Null))|Make(?:WithDictionaryRepresentation)?|Offset|Standardize|Union)|lease(?:AllDisplays|DisplayFadeReservation)|storePermanentDisplayConfiguration)|S(?:e(?:ssionCopyCurrentDictionary|tDisplayTransferBy(?:ByteTable|Formula|Table))|h(?:ading(?:Create(?:Axial|Radial)|GetTypeID|Re(?:lease|tain))|ieldingWindow(?:ID|Level))|ize(?:ApplyAffineTransform|CreateDictionaryRepresentation|EqualToSize|Make(?:WithDictionaryRepresentation)?))|VectorMake|W(?:arpMouseCursorPosition|indowL(?:evelForKey|istC(?:opyWindowInfo|reate(?:DescriptionFromArray|Image(?:FromArray)?)?))))\\b)" + "match": "(\\s*)(\\bCG(?:A(?:cquireDisplayFadeReservation|ffineTransform(?:Concat|EqualToTransform|I(?:nvert|sIdentity)|Make(?:Rotation|Scale|Translation)?|Rotate|Scale|Translate)|ssociateMouseAndMouseCursorPosition)|B(?:eginDisplayConfiguration|itmapContext(?:Create(?:Image|WithData)?|Get(?:AlphaInfo|B(?:it(?:mapInfo|sPer(?:Component|Pixel))|ytesPerRow)|ColorSpace|Data|Height|Width)))|C(?:a(?:ncelDisplayConfiguration|ptureAllDisplays(?:WithOptions)?)|o(?:lor(?:C(?:onversionInfoGetTypeID|reate(?:Copy(?:WithAlpha)?|Generic(?:CMYK|Gray|RGB)|WithPattern)?)|EqualToColor|Get(?:Alpha|Co(?:lorSpace|mponents|nstantColor)|NumberOfComponents|Pattern|TypeID)|Re(?:lease|tain)|Space(?:C(?:opyName|reate(?:Calibrated(?:Gray|RGB)|Device(?:CMYK|Gray|RGB)|I(?:CCBased|ndexed)|Lab|Pattern|With(?:Name|PlatformColorSpace)))|Get(?:BaseColorSpace|ColorTable(?:Count)?|Model|NumberOfComponents|TypeID)|Re(?:lease|tain)))|mpleteDisplayConfiguration|n(?:figureDisplay(?:FadeEffect|MirrorOfDisplay|Origin|StereoOperation|WithDisplayMode)|text(?:Add(?:Arc(?:ToPoint)?|CurveToPoint|EllipseInRect|Line(?:ToPoint|s)|Path|QuadCurveToPoint|Rect(?:s)?)|Begin(?:Pa(?:ge|th)|TransparencyLayer(?:WithRect)?)|C(?:l(?:earRect|ip(?:To(?:Mask|Rect(?:s)?))?|osePath)|o(?:n(?:catCTM|vert(?:PointTo(?:DeviceSpace|UserSpace)|RectTo(?:DeviceSpace|UserSpace)|SizeTo(?:DeviceSpace|UserSpace)))|pyPath))|Draw(?:Image|L(?:ayer(?:AtPoint|InRect)|inearGradient)|P(?:DFPage|ath)|RadialGradient|Shading|TiledImage)|E(?:O(?:Clip|FillPath)|nd(?:Page|TransparencyLayer))|F(?:ill(?:EllipseInRect|Path|Rect(?:s)?)|lush)|Get(?:C(?:TM|lipBoundingBox)|InterpolationQuality|Path(?:BoundingBox|CurrentPoint)|T(?:ext(?:Matrix|Position)|ypeID)|UserSpaceToDeviceSpaceTransform)|IsPathEmpty|MoveToPoint|PathContainsPoint|R(?:e(?:lease|placePathWithStrokedPath|s(?:etClip|toreGState)|tain)|otateCTM)|S(?:aveGState|caleCTM|et(?:Al(?:lows(?:Antialiasing|FontS(?:moothing|ubpixel(?:Positioning|Quantization)))|pha)|BlendMode|C(?:MYK(?:FillColor|StrokeColor)|haracterSpacing)|F(?:ill(?:Color(?:Space|WithColor)?|Pattern)|latness|ont(?:Size)?)|Gray(?:FillColor|StrokeColor)|InterpolationQuality|Line(?:Cap|Dash|Join|Width)|MiterLimit|PatternPhase|R(?:GB(?:FillColor|StrokeColor)|enderingIntent)|S(?:h(?:adow(?:WithColor)?|ould(?:Antialias|S(?:moothFonts|ubpixel(?:PositionFonts|QuantizeFonts))))|troke(?:Color(?:Space|WithColor)?|Pattern))|Text(?:DrawingMode|Matrix|Position))|howGlyphsAtPositions|troke(?:EllipseInRect|LineSegments|Path|Rect(?:WithWidth)?)|ynchronize)|TranslateCTM))))|D(?:ata(?:Consumer(?:Create(?:With(?:CFData|URL))?|GetTypeID|Re(?:lease|tain))|Provider(?:C(?:opyData|reate(?:Direct|Sequential|With(?:CFData|Data|Filename|URL)))|GetTypeID|Re(?:lease|tain)))|isplay(?:Bounds|C(?:apture(?:WithOptions)?|opy(?:AllDisplayModes|ColorSpace|DisplayMode)|reateImage(?:ForRect)?)|Fade|G(?:ammaTableCapacity|etDrawingContext)|HideCursor|I(?:DToOpenGLDisplayMask|s(?:A(?:ctive|lwaysInMirrorSet|sleep)|Builtin|In(?:HWMirrorSet|MirrorSet)|Main|Online|Stereo))|M(?:irrorsDisplay|o(?:de(?:Get(?:Height|IO(?:DisplayModeID|Flags)|RefreshRate|TypeID|Width)|IsUsableForDesktopGUI|Re(?:lease|tain)|lNumber)|veCursorToPoint))|P(?:ixels(?:High|Wide)|rimaryDisplay)|R(?:e(?:gisterReconfigurationCallback|lease|moveReconfigurationCallback|storeColorSyncSettings)|otation)|S(?:creenSize|e(?:rialNumber|t(?:DisplayMode|StereoOperation))|howCursor)|U(?:nitNumber|sesOpenGLAcceleration)|VendorNumber))|Event(?:Create(?:Copy|Data|FromData|KeyboardEvent|MouseEvent|S(?:crollWheelEvent|ourceFromEvent))?|Get(?:DoubleValueField|Flags|IntegerValueField|Location|T(?:imestamp|ype(?:ID)?)|UnflippedLocation)|Keyboard(?:GetUnicodeString|SetUnicodeString)|Post(?:ToPSN)?|S(?:et(?:DoubleValueField|Flags|IntegerValueField|Location|Source|T(?:imestamp|ype))|ource(?:ButtonState|C(?:ounterForEventType|reate)|FlagsState|Get(?:KeyboardType|LocalEvents(?:FilterDuringSuppressionState|SuppressionInterval)|PixelsPerLine|SourceStateID|TypeID|UserData)|KeyState|Se(?:condsSinceLastEventType|t(?:KeyboardType|LocalEvents(?:FilterDuringSuppressionState|SuppressionInterval)|PixelsPerLine|UserData))))|Tap(?:Create(?:ForPSN)?|Enable|IsEnabled|PostEvent))|F(?:ont(?:C(?:anCreatePostScriptSubset|opy(?:FullName|GlyphNameForGlyph|PostScriptName|Table(?:ForTag|Tags)|Variation(?:Axes|s))|reate(?:CopyWithVariations|PostScript(?:Encoding|Subset)|With(?:DataProvider|FontName)))|Get(?:Ascent|CapHeight|Descent|FontBBox|Glyph(?:Advances|BBoxes|WithGlyphName)|ItalicAngle|Leading|NumberOfGlyphs|StemV|TypeID|UnitsPerEm|XHeight)|Re(?:lease|tain))|unction(?:Create|GetTypeID|Re(?:lease|tain)))|G(?:et(?:ActiveDisplayList|Display(?:TransferBy(?:Formula|Table)|sWith(?:OpenGLDisplayMask|Point|Rect))|EventTapList|LastMouseDelta|OnlineDisplayList)|radient(?:CreateWithColor(?:Components|s)|GetTypeID|Re(?:lease|tain)))|Image(?:Create(?:Copy(?:WithColorSpace)?|With(?:ImageInRect|JPEGDataProvider|Mask(?:ingColors)?|PNGDataProvider))?|Get(?:AlphaInfo|B(?:it(?:mapInfo|sPer(?:Component|Pixel))|ytesPerRow)|ColorSpace|D(?:ataProvider|ecode)|Height|RenderingIntent|ShouldInterpolate|TypeID|Width)|IsMask|MaskCreate|Re(?:lease|tain))|Layer(?:CreateWithContext|Get(?:Context|Size|TypeID)|Re(?:lease|tain))|MainDisplayID|OpenGLDisplayMaskToDisplayID|P(?:DF(?:ArrayGet(?:Array|Boolean|Count|Dictionary|Integer|N(?:ame|u(?:ll|mber))|Object|Str(?:eam|ing))|Conte(?:ntStream(?:CreateWith(?:Page|Stream)|Get(?:Resource|Streams)|Re(?:lease|tain))|xt(?:AddD(?:estinationAtPoint|ocumentMetadata)|BeginPage|C(?:lose|reate(?:WithURL)?)|EndPage|Set(?:DestinationForRect|URLForRect)))|D(?:ictionary(?:ApplyFunction|Get(?:Array|Boolean|Count|Dictionary|Integer|N(?:ame|umber)|Object|Str(?:eam|ing)))|ocument(?:Allows(?:Copying|Printing)|CreateWith(?:Provider|URL)|Get(?:Catalog|I(?:D|nfo)|NumberOfPages|Page|TypeID|Version)|Is(?:Encrypted|Unlocked)|Re(?:lease|tain)|UnlockWithPassword))|O(?:bjectGet(?:Type|Value)|peratorTable(?:Create|Re(?:lease|tain)|SetCallback))|Page(?:Get(?:BoxRect|D(?:ictionary|ocument|rawingTransform)|PageNumber|RotationAngle|TypeID)|Re(?:lease|tain))|S(?:canner(?:Create|GetContentStream|Pop(?:Array|Boolean|Dictionary|Integer|N(?:ame|umber)|Object|Str(?:eam|ing))|Re(?:lease|tain)|Scan)|tr(?:eam(?:CopyData|GetDictionary)|ing(?:Copy(?:Date|TextString)|Get(?:BytePtr|Length)))))|SConverter(?:Abort|C(?:onvert|reate)|GetTypeID|IsConverting)|at(?:h(?:A(?:dd(?:Arc(?:ToPoint)?|CurveToPoint|EllipseInRect|Line(?:ToPoint|s)|Path|QuadCurveToPoint|Re(?:ct(?:s)?|lativeArc))|pply)|C(?:loseSubpath|ontainsPoint|reate(?:Copy(?:By(?:DashingPath|StrokingPath|TransformingPath))?|Mutable(?:Copy(?:ByTransformingPath)?)?|With(?:EllipseInRect|Rect)))|EqualToPath|Get(?:BoundingBox|CurrentPoint|PathBoundingBox|TypeID)|Is(?:Empty|Rect)|MoveToPoint|Re(?:lease|tain))|tern(?:Create|GetTypeID|Re(?:lease|tain)))|oint(?:ApplyAffineTransform|CreateDictionaryRepresentation|EqualToPoint|Make(?:WithDictionaryRepresentation)?))|Re(?:ct(?:ApplyAffineTransform|C(?:ontains(?:Point|Rect)|reateDictionaryRepresentation)|Divide|EqualToRect|Get(?:Height|M(?:ax(?:X|Y)|i(?:d(?:X|Y)|n(?:X|Y)))|Width)|I(?:n(?:set|te(?:gral|rsect(?:ion|sRect)))|s(?:Empty|Infinite|Null))|Make(?:WithDictionaryRepresentation)?|Offset|Standardize|Union)|lease(?:AllDisplays|DisplayFadeReservation)|storePermanentDisplayConfiguration)|S(?:e(?:ssionCopyCurrentDictionary|tDisplayTransferBy(?:ByteTable|Formula|Table))|h(?:ading(?:Create(?:Axial|Radial)|GetTypeID|Re(?:lease|tain))|ieldingWindow(?:ID|Level))|ize(?:ApplyAffineTransform|CreateDictionaryRepresentation|EqualToSize|Make(?:WithDictionaryRepresentation)?))|VectorMake|W(?:arpMouseCursorPosition|indowL(?:evelForKey|istC(?:opyWindowInfo|reate(?:DescriptionFromArray|Image(?:FromArray)?)?))))\\b)" } ] } diff --git a/extensions/css-language-features/client/src/customData.ts b/extensions/css-language-features/client/src/customData.ts index 50540528d63..24b56f12b06 100644 --- a/extensions/css-language-features/client/src/customData.ts +++ b/extensions/css-language-features/client/src/customData.ts @@ -76,17 +76,13 @@ function getCustomDataPathsInAllWorkspaces(): string[] { function getCustomDataPathsFromAllExtensions(): string[] { const dataPaths: string[] = []; - for (const extension of extensions.all) { - const contributes = extension.packageJSON && extension.packageJSON.contributes; - - if (contributes && contributes.css && contributes.css.customData && Array.isArray(contributes.css.customData)) { - const relativePaths: string[] = contributes.css.customData; - relativePaths.forEach(rp => { + const customData = extension.packageJSON?.contributes?.css?.customData; + if (Array.isArray(customData)) { + for (const rp of customData) { dataPaths.push(joinPath(extension.extensionUri, rp).toString()); - }); + } } } - return dataPaths; } diff --git a/extensions/css-language-features/extension-browser.webpack.config.js b/extensions/css-language-features/extension-browser.webpack.config.js index 34a43e13336..cb2e13c7ed3 100644 --- a/extensions/css-language-features/extension-browser.webpack.config.js +++ b/extensions/css-language-features/extension-browser.webpack.config.js @@ -7,11 +7,10 @@ 'use strict'; -const withDefaults = require('../shared.webpack.config'); +const withBrowserDefaults = require('../shared.webpack.config').browser; const path = require('path'); -const clientConfig = withDefaults({ - target: 'webworker', +module.exports = withBrowserDefaults({ context: path.join(__dirname, 'client'), entry: { extension: './src/browser/cssClientMain.ts' @@ -19,16 +18,5 @@ const clientConfig = withDefaults({ output: { filename: 'cssClientMain.js', path: path.join(__dirname, 'client', 'dist', 'browser') - }, - performance: { - hints: false - }, - resolve: { - alias: { - 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') - } } }); -clientConfig.module.rules[0].use.shift(); // remove nls loader - -module.exports = clientConfig; diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index 2b030a4b535..0b632903b52 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -807,7 +807,7 @@ ] }, "dependencies": { - "vscode-languageclient": "7.0.0-next.5", + "vscode-languageclient": "7.0.0-next.5.1", "vscode-nls": "^4.1.2" }, "devDependencies": { diff --git a/extensions/css-language-features/server/extension-browser.webpack.config.js b/extensions/css-language-features/server/extension-browser.webpack.config.js index cd72c91f0e1..38816259ddf 100644 --- a/extensions/css-language-features/server/extension-browser.webpack.config.js +++ b/extensions/css-language-features/server/extension-browser.webpack.config.js @@ -7,11 +7,10 @@ 'use strict'; -const withDefaults = require('../../shared.webpack.config'); +const withBrowserDefaults = require('../../shared.webpack.config').browser; const path = require('path'); -const serverConfig = withDefaults({ - target: 'webworker', +module.exports = withBrowserDefaults({ context: __dirname, entry: { extension: './src/browser/cssServerMain.ts', @@ -20,16 +19,5 @@ const serverConfig = withDefaults({ filename: 'cssServerMain.js', path: path.join(__dirname, 'dist', 'browser'), libraryTarget: 'var' - }, - performance: { - hints: false - }, - resolve: { - alias: { - 'vscode-nls': path.resolve(__dirname, '../../../build/polyfills/vscode-nls.js') - } } }); -serverConfig.module.rules[0].use.shift(); // remove nls loader - -module.exports = serverConfig; diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 247b276dace..4c882c8f8b8 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -10,7 +10,7 @@ "main": "./out/node/cssServerMain", "browser": "./dist/browser/cssServerMain", "dependencies": { - "vscode-css-languageservice": "4.3.0-next.2", + "vscode-css-languageservice": "^4.3.0", "vscode-languageserver": "7.0.0-next.3", "vscode-uri": "^2.1.2" }, diff --git a/extensions/css-language-features/server/src/customData.ts b/extensions/css-language-features/server/src/customData.ts index 724dbf9de3f..ccfc706452c 100644 --- a/extensions/css-language-features/server/src/customData.ts +++ b/extensions/css-language-features/server/src/customData.ts @@ -29,7 +29,7 @@ function parseCSSData(source: string): ICSSDataProvider { } return newCSSDataProvider({ - version: 1, + version: rawData.version || 1, properties: rawData.properties || [], atDirectives: rawData.atDirectives || [], pseudoClasses: rawData.pseudoClasses || [], diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 2c75c197770..0a0c3c319cb 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -701,10 +701,10 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -vscode-css-languageservice@4.3.0-next.2: - version "4.3.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.3.0-next.2.tgz#a7a1289d8d68ddcdee55d4f18b12a455acaf5962" - integrity sha512-4h/s/N7wt6If/5EUNMtfAbwWwImH6EvveqZMf9SmQdMMMqekZkRLA68E98hGzuzI13rHEiLckwlAC+RNLq6FXg== +vscode-css-languageservice@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.3.0.tgz#40c797d664ab6188cace33cfbb19b037580a9318" + integrity sha512-BkQAMz4oVHjr0oOAz5PdeE72txlLQK7NIwzmclfr+b6fj6I8POwB+VoXvrZLTbWt9hWRgfvgiQRkh5JwrjPJ5A== dependencies: vscode-languageserver-textdocument "^1.0.1" vscode-languageserver-types "3.16.0-next.2" diff --git a/extensions/css-language-features/yarn.lock b/extensions/css-language-features/yarn.lock index 1276dce3423..241dd5e9437 100644 --- a/extensions/css-language-features/yarn.lock +++ b/extensions/css-language-features/yarn.lock @@ -640,10 +640,10 @@ vscode-jsonrpc@6.0.0-next.2: resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.2.tgz#3d73f86d812304cb91b9fb1efee40ec60b09ed7f" integrity sha512-dKQXRYNUY6BHALQJBJlyZyv9oWlYpbJ2vVoQNNVNPLAYQ3hzNp4zy+iSo7zGx1BPXByArJQDWTKLQh8dz3dnNw== -vscode-languageclient@7.0.0-next.5: - version "7.0.0-next.5" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-7.0.0-next.5.tgz#7ae84c598dff360bd2bc64322b74e10e5d0b9cd6" - integrity sha512-ec+fJg+JiNBIdbeKbzssSuORUaVdtLValtiYdNEUCUjpYE+Y6xXPtXwiZOlS/0OB9pC/RLCMxsj16UwWncQhYQ== +vscode-languageclient@7.0.0-next.5.1: + version "7.0.0-next.5.1" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-7.0.0-next.5.1.tgz#ed93f14e4c2cdccedf15002c7bf8ef9cb638f36c" + integrity sha512-OONvbk3IFpubwF8/Y5uPQaq5J5CEskpeET3SfK4iGlv5OUK+44JawH/SEW5wXuEPpfdMLEMZLuGLU5v5d7N7PQ== dependencies: semver "^6.3.0" vscode-languageserver-protocol "3.16.0-next.4" diff --git a/extensions/extension-editing/src/extensionLinter.ts b/extensions/extension-editing/src/extensionLinter.ts index b8514daface..3434bfbb4dc 100644 --- a/extensions/extension-editing/src/extensionLinter.ts +++ b/extensions/extension-editing/src/extensionLinter.ts @@ -16,6 +16,11 @@ import { languages, workspace, Disposable, TextDocument, Uri, Diagnostic, Range, const product = JSON.parse(fs.readFileSync(path.join(env.appRoot, 'product.json'), { encoding: 'utf-8' })); const allowedBadgeProviders: string[] = (product.extensionAllowedBadgeProviders || []).map((s: string) => s.toLowerCase()); +const allowedBadgeProvidersRegex: RegExp[] = (product.extensionAllowedBadgeProvidersRegex || []).map((r: string) => new RegExp(r)); + +function isTrustedSVGSource(uri: Uri): boolean { + return allowedBadgeProviders.includes(uri.authority.toLowerCase()) || allowedBadgeProvidersRegex.some(r => r.test(uri.toString())); +} const httpsRequired = localize('httpsRequired', "Images must use the HTTPS protocol."); const svgsNotValid = localize('svgsNotValid', "SVGs are not a valid image source."); @@ -321,7 +326,7 @@ export class ExtensionLinter { diagnostics.push(new Diagnostic(range, message, DiagnosticSeverity.Warning)); } - if (endsWith(uri.path.toLowerCase(), '.svg') && allowedBadgeProviders.indexOf(uri.authority.toLowerCase()) === -1) { + if (endsWith(uri.path.toLowerCase(), '.svg') && !isTrustedSVGSource(uri)) { const range = new Range(document.positionAt(begin), document.positionAt(end)); diagnostics.push(new Diagnostic(range, svgsNotValid, DiagnosticSeverity.Warning)); } diff --git a/extensions/git/package.json b/extensions/git/package.json index 2fc480eecaf..bb63c594582 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -432,8 +432,8 @@ }, { "command": "git.unstageSelectedRanges", - "key": "ctrl+k ctrl+u", - "mac": "cmd+k cmd+u", + "key": "ctrl+k ctrl+n", + "mac": "cmd+k cmd+n", "when": "isInDiffEditor" }, { @@ -1871,15 +1871,15 @@ { "view": "explorer", "contents": "%view.workbench.cloneRepository%", - "when": "config.git.enabled" + "when": "config.git.enabled && git.state == initialized" } ] }, "dependencies": { "byline": "^5.0.0", "file-type": "^7.2.0", - "iconv-lite": "^0.4.24", - "jschardet": "2.1.1", + "iconv-lite-umd": "0.6.5", + "jschardet": "2.2.1", "vscode-extension-telemetry": "0.1.1", "vscode-nls": "^4.0.0", "vscode-uri": "^2.0.0", diff --git a/extensions/git/src/api/extension.ts b/extensions/git/src/api/extension.ts index 8d7dc611e62..f7598fe2f8c 100644 --- a/extensions/git/src/api/extension.ts +++ b/extensions/git/src/api/extension.ts @@ -7,7 +7,6 @@ import { Model } from '../model'; import { GitExtension, Repository, API } from './git'; import { ApiRepository, ApiImpl } from './api1'; import { Event, EventEmitter } from 'vscode'; -import { latchEvent } from '../util'; export function deprecated(_target: any, key: string, descriptor: any): void { if (typeof descriptor.value !== 'function') { @@ -26,14 +25,20 @@ export class GitExtensionImpl implements GitExtension { enabled: boolean = false; private _onDidChangeEnablement = new EventEmitter(); - readonly onDidChangeEnablement: Event = latchEvent(this._onDidChangeEnablement.event); + readonly onDidChangeEnablement: Event = this._onDidChangeEnablement.event; private _model: Model | undefined = undefined; set model(model: Model | undefined) { this._model = model; - this.enabled = !!model; + const enabled = !!model; + + if (this.enabled === enabled) { + return; + } + + this.enabled = enabled; this._onDidChangeEnablement.fire(this.enabled); } @@ -73,4 +78,4 @@ export class GitExtensionImpl implements GitExtension { return new ApiImpl(this._model); } -} \ No newline at end of file +} diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index 12883fe46d4..2ed893ed766 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -8,15 +8,15 @@ import * as path from 'path'; import { Repository, GitResourceGroup } from './repository'; import { Model } from './model'; import { debounce } from './decorators'; -import { filterEvent, dispose, anyEvent, fireEvent } from './util'; +import { filterEvent, dispose, anyEvent, fireEvent, PromiseSource } from './util'; import { GitErrorCodes, Status } from './api/git'; -type Callback = { resolve: (status: boolean) => void, reject: (err: any) => void }; - class GitIgnoreDecorationProvider implements DecorationProvider { + private static Decoration: Decoration = { priority: 3, color: new ThemeColor('gitDecoration.ignoredResourceForeground') }; + readonly onDidChangeDecorations: Event; - private queue = new Map; }>(); + private queue = new Map>; }>(); private disposables: Disposable[] = []; constructor(private model: Model) { @@ -29,32 +29,29 @@ class GitIgnoreDecorationProvider implements DecorationProvider { this.disposables.push(window.registerDecorationProvider(this)); } - provideDecoration(uri: Uri): Promise { + async provideDecoration(uri: Uri): Promise { const repository = this.model.getRepository(uri); if (!repository) { - return Promise.resolve(undefined); + return; } let queueItem = this.queue.get(repository.root); if (!queueItem) { - queueItem = { repository, queue: new Map() }; + queueItem = { repository, queue: new Map>() }; this.queue.set(repository.root, queueItem); } - return new Promise((resolve, reject) => { - queueItem!.queue.set(uri.fsPath, { resolve, reject }); + let promiseSource = queueItem.queue.get(uri.fsPath); + + if (!promiseSource) { + promiseSource = new PromiseSource(); + queueItem!.queue.set(uri.fsPath, promiseSource); this.checkIgnoreSoon(); - }).then(ignored => { - if (ignored) { - return { - priority: 3, - color: new ThemeColor('gitDecoration.ignoredResourceForeground') - }; - } - return undefined; - }); + } + + return await promiseSource.promise; } @debounce(500) @@ -66,16 +63,16 @@ class GitIgnoreDecorationProvider implements DecorationProvider { const paths = [...item.queue.keys()]; item.repository.checkIgnore(paths).then(ignoreSet => { - for (const [key, value] of item.queue.entries()) { - value.resolve(ignoreSet.has(key)); + for (const [path, promiseSource] of item.queue.entries()) { + promiseSource.resolve(ignoreSet.has(path) ? GitIgnoreDecorationProvider.Decoration : undefined); } }, err => { if (err.gitErrorCode !== GitErrorCodes.IsInSubmodule) { console.error(err); } - for (const [, value] of item.queue.entries()) { - value.reject(err); + for (const [, promiseSource] of item.queue.entries()) { + promiseSource.reject(err); } }); } diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index d6c84596845..0ad6ae25db7 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -9,7 +9,7 @@ import * as os from 'os'; import * as cp from 'child_process'; import * as which from 'which'; import { EventEmitter } from 'events'; -import iconv = require('iconv-lite'); +import * as iconv from 'iconv-lite-umd'; import * as filetype from 'file-type'; import { assign, groupBy, IDisposable, toDisposable, dispose, mkdirp, readBytes, detectUnicodeEncoding, Encoding, onceEvent, splitInChunks, Limiter } from './util'; import { CancellationToken, Progress, Uri } from 'vscode'; @@ -1939,6 +1939,17 @@ export class Repository { return message.replace(/^\s*#.*$\n?/gm, '').trim(); } + async getSquashMessage(): Promise { + const squashMsgPath = path.join(this.repositoryRoot, '.git', 'SQUASH_MSG'); + + try { + const raw = await fs.readFile(squashMsgPath, 'utf8'); + return this.stripCommitMessageComments(raw); + } catch { + return undefined; + } + } + async getMergeMessage(): Promise { const mergeMsgPath = path.join(this.repositoryRoot, '.git', 'MERGE_MSG'); diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 5210aaa70f0..d541220ec30 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -175,7 +175,7 @@ export async function activate(context: ExtensionContext): Promise return result; } -async function checkGitVersion(info: IGit): Promise { +async function checkGitv1(info: IGit): Promise { const config = workspace.getConfiguration('git'); const shouldIgnore = config.get('ignoreLegacyWarning') === true; @@ -202,3 +202,27 @@ async function checkGitVersion(info: IGit): Promise { await config.update('ignoreLegacyWarning', true, true); } } + +async function checkGitWindows(info: IGit): Promise { + if (!/^2\.(25|26)\./.test(info.version)) { + return; + } + + const update = localize('updateGit', "Update Git"); + const choice = await window.showWarningMessage( + localize('git2526', "There are known issues with the installed Git {0}. Please update to Git >= 2.27 for the git features to work correctly.", info.version), + update + ); + + if (choice === update) { + commands.executeCommand('vscode.open', Uri.parse('https://git-scm.com/')); + } +} + +async function checkGitVersion(info: IGit): Promise { + await checkGitv1(info); + + if (process.platform === 'win32') { + await checkGitWindows(info); + } +} diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 44a8858c63d..99bbb9f995d 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -537,7 +537,7 @@ class DotGitWatcher implements IFileWatcher { upstreamWatcher.event(this.emitter.fire, this.emitter, this.transientDisposables); } catch (err) { if (Log.logLevel <= LogLevel.Error) { - this.outputChannel.appendLine(`Failed to watch ref '${upstreamPath}', is most likely packed.\n${err.stack || err}`); + this.outputChannel.appendLine(`Warning: Failed to watch ref '${upstreamPath}', is most likely packed.`); } } } @@ -729,10 +729,10 @@ export class Repository implements Disposable { this.updateInputBoxPlaceholder(); this.disposables.push(this.onDidRunGitStatus(() => this.updateInputBoxPlaceholder())); - this._mergeGroup = this._sourceControl.createResourceGroup('merge', localize('merge changes', "MERGE CHANGES")); - this._indexGroup = this._sourceControl.createResourceGroup('index', localize('staged changes', "STAGED CHANGES")); - this._workingTreeGroup = this._sourceControl.createResourceGroup('workingTree', localize('changes', "CHANGES")); - this._untrackedGroup = this._sourceControl.createResourceGroup('untracked', localize('untracked changes', "UNTRACKED CHANGES")); + this._mergeGroup = this._sourceControl.createResourceGroup('merge', localize('merge changes', "Merge Changes")); + this._indexGroup = this._sourceControl.createResourceGroup('index', localize('staged changes', "Staged Changes")); + this._workingTreeGroup = this._sourceControl.createResourceGroup('workingTree', localize('changes', "Changes")); + this._untrackedGroup = this._sourceControl.createResourceGroup('untracked', localize('untracked changes', "Untracked Changes")); const updateIndexGroupVisibility = () => { const config = workspace.getConfiguration('git', root); @@ -865,10 +865,10 @@ export class Repository implements Disposable { } async getInputTemplate(): Promise { - const mergeMessage = await this.repository.getMergeMessage(); + const commitMessage = (await Promise.all([this.repository.getMergeMessage(), this.repository.getSquashMessage()])).find(msg => !!msg); - if (mergeMessage) { - return mergeMessage; + if (commitMessage) { + return commitMessage; } return await this.repository.getCommitTemplate(); diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts index 74b353f518a..fb3519e2b5a 100644 --- a/extensions/git/src/util.ts +++ b/extensions/git/src/util.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, Disposable } from 'vscode'; +import { Event, Disposable, EventEmitter } from 'vscode'; import { dirname, sep } from 'path'; import { Readable } from 'stream'; import { promises as fs, createReadStream } from 'fs'; @@ -44,18 +44,6 @@ export function filterEvent(event: Event, filter: (e: T) => boolean): Even return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); } -export function latchEvent(event: Event): Event { - let firstCall = true; - let cache: T; - - return filterEvent(event, value => { - let shouldEmit = firstCall || value !== cache; - firstCall = false; - cache = value; - return shouldEmit; - }); -} - export function anyEvent(...events: Event[]): Event { return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => { const result = combinedDisposable(events.map(event => event(i => listener.call(thisArgs, i)))); @@ -400,3 +388,39 @@ export class Limiter { } } } + +type Completion = { success: true, value: T } | { success: false, err: any }; + +export class PromiseSource { + + private _onDidComplete = new EventEmitter>(); + + private _promise: Promise | undefined; + get promise(): Promise { + if (this._promise) { + return this._promise; + } + + return eventToPromise(this._onDidComplete.event).then(completion => { + if (completion.success) { + return completion.value; + } else { + throw completion.err; + } + }); + } + + resolve(value: T): void { + if (!this._promise) { + this._promise = Promise.resolve(value); + this._onDidComplete.fire({ success: true, value }); + } + } + + reject(err: any): void { + if (!this._promise) { + this._promise = Promise.reject(err); + this._onDidComplete.fire({ success: false, err }); + } + } +} diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index f72600de7bc..63cd0f53efd 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -425,12 +425,10 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" +iconv-lite-umd@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.5.tgz#6a1f621a3b4d125f72feff813a9839e1ebd6c722" + integrity sha512-WDegH4al+e3n3jTOStRvm+jzDA3JMUQGgzdAsMxAgcgB0Oi72HjfdsoX08ieKsy3rKexXVjWZr41aOIUaCZnMg== inflight@^1.0.4: version "1.0.6" @@ -470,10 +468,10 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jschardet@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.1.1.tgz#af6f8fd0b3b0f5d46a8fd9614a4fce490575c184" - integrity sha512-pA5qG9Zwm8CBpGlK/lo2GE9jPxwqRgMV7Lzc/1iaPccw6v4Rhj8Zg2BTyrdmHmxlJojnbLupLeRnaPLsq03x6Q== +jschardet@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.2.1.tgz#03b0264669a90c7a5c436a68c5a7d4e4cb0c9823" + integrity sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw== json-schema-traverse@^0.4.1: version "0.4.1" @@ -748,7 +746,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== diff --git a/extensions/github-authentication/extension-browser.webpack.config.js b/extensions/github-authentication/extension-browser.webpack.config.js index ad5020e26a3..0722e3e572c 100644 --- a/extensions/github-authentication/extension-browser.webpack.config.js +++ b/extensions/github-authentication/extension-browser.webpack.config.js @@ -8,11 +8,10 @@ 'use strict'; const path = require('path'); -const withDefaults = require('../shared.webpack.config'); +const withBrowserDefaults = require('../shared.webpack.config').browser; -module.exports = withDefaults({ +module.exports = withBrowserDefaults({ context: __dirname, - target: 'webworker', node: false, entry: { extension: './src/extension.ts', @@ -20,30 +19,10 @@ module.exports = withDefaults({ externals: { 'keytar': 'commonjs keytar', }, - // TODO@eamodio Deal with nls properly for the browser - // Specify module here, so we can stop the vscode-nls-dev loader from overwriting nls calls - module: { - rules: [{ - test: /\.ts$/, - exclude: /node_modules/, - use: [{ - // configure TypeScript loader: - // * enable sources maps for end-to-end source maps - loader: 'ts-loader', - options: { - compilerOptions: { - 'sourceMap': true, - } - } - }] - }] - }, resolve: { alias: { 'node-fetch': path.resolve(__dirname, 'node_modules/node-fetch/browser.js'), - 'vscode-extension-telemetry': path.resolve(__dirname, '../../build/polyfills/vscode-extension-telemetry.js'), - 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js'), 'uuid': path.resolve(__dirname, 'node_modules/uuid/dist/esm-browser/index.js') - }, + } } }); diff --git a/extensions/github-authentication/package.json b/extensions/github-authentication/package.json index b526e921465..0a4c850d7a3 100644 --- a/extensions/github-authentication/package.json +++ b/extensions/github-authentication/package.json @@ -32,7 +32,7 @@ }, "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "main": "./out/extension.js", - "browser": "./dist/extension.js", + "browser": "./dist/browser/extension.js", "scripts": { "compile": "gulp compile-extension:github-authentication", "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", diff --git a/extensions/github-authentication/src/github.ts b/extensions/github-authentication/src/github.ts index d087f78c71c..8aa1cb40480 100644 --- a/extensions/github-authentication/src/github.ts +++ b/extensions/github-authentication/src/github.ts @@ -22,7 +22,7 @@ interface SessionData { } export class GitHubAuthenticationProvider { - private _sessions: vscode.AuthenticationSession2[] = []; + private _sessions: vscode.AuthenticationSession[] = []; private _githubServer = new GitHubServer(); public async initialize(): Promise { @@ -37,7 +37,7 @@ export class GitHubAuthenticationProvider { private pollForChange() { setTimeout(async () => { - let storedSessions: vscode.AuthenticationSession2[]; + let storedSessions: vscode.AuthenticationSession[]; try { storedSessions = await this.readSessions(); } catch (e) { @@ -80,12 +80,12 @@ export class GitHubAuthenticationProvider { }, 1000 * 30); } - private async readSessions(): Promise { + private async readSessions(): Promise { const storedSessions = await keychain.getToken(); if (storedSessions) { try { const sessionData: SessionData[] = JSON.parse(storedSessions); - const sessionPromises = sessionData.map(async (session: SessionData): Promise => { + const sessionPromises = sessionData.map(async (session: SessionData): Promise => { const needsUserInfo = !session.account; let userInfo: { id: string, accountName: string }; if (needsUserInfo) { @@ -121,11 +121,11 @@ export class GitHubAuthenticationProvider { await keychain.setToken(JSON.stringify(this._sessions)); } - get sessions(): vscode.AuthenticationSession2[] { + get sessions(): vscode.AuthenticationSession[] { return this._sessions; } - public async login(scopes: string): Promise { + public async login(scopes: string): Promise { const token = await this._githubServer.login(scopes); const session = await this.tokenToSession(token, scopes.split(' ')); await this.setToken(session); @@ -136,12 +136,12 @@ export class GitHubAuthenticationProvider { this._githubServer.manuallyProvideToken(); } - private async tokenToSession(token: string, scopes: string[]): Promise { + private async tokenToSession(token: string, scopes: string[]): Promise { const userInfo = await this._githubServer.getUserInfo(token); - return new vscode.AuthenticationSession2(uuid(), token, { displayName: userInfo.accountName, id: userInfo.id }, scopes); + return new vscode.AuthenticationSession(uuid(), token, { displayName: userInfo.accountName, id: userInfo.id }, scopes); } - private async setToken(session: vscode.AuthenticationSession2): Promise { + private async setToken(session: vscode.AuthenticationSession): Promise { const sessionIndex = this._sessions.findIndex(s => s.id === session.id); if (sessionIndex > -1) { this._sessions.splice(sessionIndex, 1, session); diff --git a/extensions/github-browser/extension-browser.webpack.config.js b/extensions/github-browser/extension-browser.webpack.config.js index be2e874cc1f..55f3a268486 100644 --- a/extensions/github-browser/extension-browser.webpack.config.js +++ b/extensions/github-browser/extension-browser.webpack.config.js @@ -7,18 +7,19 @@ 'use strict'; const path = require('path'); -const withDefaults = require('../shared.webpack.config'); +const withBrowserDefaults = require('../shared.webpack.config').browser; -module.exports = withDefaults({ +const config = withBrowserDefaults({ context: __dirname, - target: 'webworker', node: false, entry: { - extension: './src/extension.ts', + extension: './src/extension.ts' }, resolve: { alias: { - 'node-fetch': path.resolve(__dirname, 'node_modules/node-fetch/browser.js'), - }, + 'node-fetch': path.resolve(__dirname, 'node_modules/node-fetch/browser.js') + } } }); + +module.exports = config; diff --git a/extensions/github-browser/package.json b/extensions/github-browser/package.json index c5228c0a17b..9938e25ed54 100644 --- a/extensions/github-browser/package.json +++ b/extensions/github-browser/package.json @@ -13,11 +13,102 @@ "Other" ], "activationEvents": [ - "onFileSystem:github" + "onFileSystem:codespace", + "onFileSystem:github", + "onCommand:githubBrowser.openRepository" ], - "browser": "./dist/extension.js", + "browser": "./dist/browser/extension.js", "main": "./out/extension.js", "contributes": { + "commands": [ + { + "command": "githubBrowser.openRepository", + "title": "Open GitHub Repository...", + "category": "GitHub Browser" + }, + { + "command": "githubBrowser.commit", + "title": "Commit", + "icon": "$(check)", + "category": "GitHub Browser" + }, + { + "command": "githubBrowser.discardChanges", + "title": "Discard Changes", + "icon": "$(discard)", + "category": "GitHub Browser" + }, + { + "command": "githubBrowser.openChanges", + "title": "Open Changes", + "icon": "$(git-compare)", + "category": "GitHub Browser" + }, + { + "command": "githubBrowser.openFile", + "title": "Open File", + "icon": "$(go-to-file)", + "category": "GitHub Browser" + } + ], + "menus": { + "commandPalette": [ + { + "command": "githubBrowser.openRepository", + "when": "config.githubBrowser.openRepository" + }, + { + "command": "githubBrowser.commit", + "when": "false" + }, + { + "command": "githubBrowser.discardChanges", + "when": "false" + }, + { + "command": "githubBrowser.openChanges", + "when": "false" + }, + { + "command": "githubBrowser.openFile", + "when": "false" + } + ], + "scm/title": [ + { + "command": "githubBrowser.commit", + "group": "navigation", + "when": "scmProvider == github" + } + ], + "scm/resourceState/context": [ + { + "command": "githubBrowser.openFile", + "when": "scmProvider == github && scmResourceGroup == github.changes", + "group": "inline@0" + }, + { + "command": "githubBrowser.discardChanges", + "when": "scmProvider == github && scmResourceGroup == github.changes", + "group": "inline@1" + }, + { + "command": "githubBrowser.openChanges", + "when": "scmProvider == github && scmResourceGroup == github.changes", + "group": "navigation@0" + }, + { + "command": "githubBrowser.openFile", + "when": "scmProvider == github && scmResourceGroup == github.changes", + "group": "navigation@1" + }, + { + "command": "githubBrowser.discardChanges", + "when": "scmProvider == github && scmResourceGroup == github.changes", + "group": "1_modification@0" + } + ] + }, "resourceLabelFormatters": [ { "scheme": "github", @@ -36,6 +127,24 @@ "separator": "/", "workspaceSuffix": "GitHub" } + }, + { + "scheme": "codespace", + "authority": "HEAD", + "formatting": { + "label": "github.com${path}", + "separator": "/", + "workspaceSuffix": "GitHub" + } + }, + { + "scheme": "codespace", + "authority": "*", + "formatting": { + "label": "github.com${path} (${authority})", + "separator": "/", + "workspaceSuffix": "GitHub" + } } ] }, @@ -47,14 +156,13 @@ "vscode:prepublish": "npm run compile" }, "dependencies": { - "@octokit/graphql": "4.5.0", - "@octokit/rest": "17.11.0", + "@octokit/graphql": "4.5.1", + "@octokit/rest": "18.0.0", "fuzzysort": "1.1.4", - "node-fetch": "2.6.0" + "node-fetch": "2.6.0", + "vscode-nls": "4.1.2" }, "devDependencies": { - "@types/node-fetch": "2.5.7", - "webpack": "4.43.0", - "webpack-cli": "3.3.11" + "@types/node-fetch": "2.5.7" } } diff --git a/extensions/github-browser/src/changeStore.ts b/extensions/github-browser/src/changeStore.ts new file mode 100644 index 00000000000..f4bd624b9e7 --- /dev/null +++ b/extensions/github-browser/src/changeStore.ts @@ -0,0 +1,380 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import { commands, Event, EventEmitter, FileStat, FileType, Memento, TextDocumentShowOptions, Uri, ViewColumn } from 'vscode'; +import { getRootUri, getRelativePath, isChild } from './extension'; +import { sha1 } from './sha1'; + +const textDecoder = new TextDecoder(); + +interface CreateOperation { + type: 'created'; + size: number; + timestamp: number; + uri: T; + hash: string; + originalHash: string; +} + +interface ChangeOperation { + type: 'changed'; + size: number; + timestamp: number; + uri: T; + hash: string; + originalHash: string; +} + +interface DeleteOperation { + type: 'deleted'; + size: undefined; + timestamp: number; + uri: T; + hash: undefined; + originalHash: undefined; +} + +export type Operation = CreateOperation | ChangeOperation | DeleteOperation; +type StoredOperation = CreateOperation | ChangeOperation | DeleteOperation; + +const workingOperationsKeyPrefix = 'github.working.changes|'; +const workingFileKeyPrefix = 'github.working|'; + +function fromSerialized(operations: StoredOperation): Operation { + return { ...operations, uri: Uri.parse(operations.uri) }; +} + +export interface ChangeStoreEvent { + type: 'created' | 'changed' | 'deleted'; + rootUri: Uri; + uri: Uri; +} + +function toChangeStoreEvent(operation: Operation | StoredOperation, rootUri: Uri, uri?: Uri): ChangeStoreEvent { + return { + type: operation.type, + rootUri: rootUri, + uri: uri ?? (typeof operation.uri === 'string' ? Uri.parse(operation.uri) : operation.uri), + }; +} + +export interface IChangeStore { + onDidChange: Event; + + acceptAll(rootUri: Uri): Promise; + discard(uri: Uri): Promise; + discardAll(rootUri: Uri): Promise; + + hasChanges(rootUri: Uri): boolean; + + getChanges(rootUri: Uri): Operation[]; + getContent(uri: Uri): string | undefined; + + openChanges(uri: Uri, original: Uri): void; + openFile(uri: Uri): void; +} + +export interface IWritableChangeStore { + onDidChange: Event; + + hasChanges(rootUri: Uri): boolean; + + getContent(uri: Uri): string | undefined; + getStat(uri: Uri): FileStat | undefined; + updateDirectoryEntries(uri: Uri, entries: [string, FileType][]): [string, FileType][]; + + onFileChanged(uri: Uri, content: Uint8Array, originalContent: () => Uint8Array | Thenable): Promise; + onFileCreated(uri: Uri, content: Uint8Array): Promise; + onFileDeleted(uri: Uri): Promise; +} + +export class ChangeStore implements IChangeStore, IWritableChangeStore { + private _onDidChange = new EventEmitter(); + get onDidChange(): Event { + return this._onDidChange.event; + } + + constructor(private readonly memento: Memento) { } + + async acceptAll(rootUri: Uri): Promise { + const operations = this.getChanges(rootUri); + + await this.saveWorkingOperations(rootUri, undefined); + + const events: ChangeStoreEvent[] = []; + + for (const operation of operations) { + await this.discardWorkingContent(operation.uri); + events.push(toChangeStoreEvent(operation, rootUri)); + } + + for (const e of events) { + this._onDidChange.fire(e); + } + } + + async discard(uri: Uri): Promise { + const rootUri = getRootUri(uri); + if (rootUri === undefined) { + return; + } + + const key = uri.toString(); + + const operations = this.getWorkingOperations(rootUri); + const index = operations.findIndex(c => c.uri === key); + if (index === -1) { + return; + } + + const [operation] = operations.splice(index, 1); + await this.saveWorkingOperations(rootUri, operations); + await this.discardWorkingContent(uri); + + this._onDidChange.fire({ + type: operation.type === 'created' ? 'deleted' : operation.type === 'deleted' ? 'created' : 'changed', + rootUri: rootUri, + uri: uri, + }); + } + + async discardAll(rootUri: Uri): Promise { + const operations = this.getChanges(rootUri); + + await this.saveWorkingOperations(rootUri, undefined); + + const events: ChangeStoreEvent[] = []; + + for (const operation of operations) { + await this.discardWorkingContent(operation.uri); + events.push(toChangeStoreEvent(operation, rootUri)); + } + + for (const e of events) { + this._onDidChange.fire(e); + } + } + + getChanges(rootUri: Uri) { + return this.getWorkingOperations(rootUri).map(c => fromSerialized(c)); + } + + getContent(uri: Uri): string | undefined { + return this.memento.get(`${workingFileKeyPrefix}${uri.toString()}`); + } + + getStat(uri: Uri): FileStat | undefined { + const key = uri.toString(); + const operation = this.getChanges(getRootUri(uri)!).find(c => c.uri.toString() === key); + if (operation === undefined) { + return undefined; + } + + return { + type: FileType.File, + size: operation.size ?? 0, + ctime: 0, + mtime: operation.timestamp + }; + } + + hasChanges(rootUri: Uri): boolean { + return this.getWorkingOperations(rootUri).length !== 0; + } + + updateDirectoryEntries(uri: Uri, entries: [string, FileType][]): [string, FileType][] { + const rootUri = getRootUri(uri); + if (rootUri === undefined) { + return entries; + } + + const folderPath = getRelativePath(rootUri, uri); + + const operations = this.getChanges(rootUri); + for (const operation of operations) { + switch (operation.type) { + case 'changed': + continue; + + case 'created': { + const filePath = getRelativePath(rootUri, operation.uri); + if (isChild(folderPath, filePath)) { + entries.push([filePath, FileType.File]); + } + break; + } + + case 'deleted': { + const filePath = getRelativePath(rootUri, operation.uri); + if (isChild(folderPath, filePath)) { + const index = entries.findIndex(([path]) => path === filePath); + if (index !== -1) { + entries.splice(index, 1); + } + } + break; + } + } + } + + return entries; + } + + async onFileChanged(uri: Uri, content: Uint8Array, originalContent: () => Uint8Array | Thenable): Promise { + const rootUri = getRootUri(uri); + if (rootUri === undefined) { + return; + } + + const key = uri.toString(); + + const operations = this.getWorkingOperations(rootUri); + + const hash = await sha1(content); + + let operation = operations.find(c => c.uri === key); + if (operation === undefined) { + const originalHash = await sha1(await originalContent!()); + if (hash === originalHash) { + return; + } + + operation = { + type: 'changed', + size: content.byteLength, + timestamp: Date.now(), + uri: key, + hash: hash!, + originalHash: originalHash + } as ChangeOperation; + operations.push(operation); + + await this.saveWorkingOperations(rootUri, operations); + await this.saveWorkingContent(uri, textDecoder.decode(content)); + } else if (hash! === operation.originalHash) { + operations.splice(operations.indexOf(operation), 1); + + await this.saveWorkingOperations(rootUri, operations); + await this.discardWorkingContent(uri); + } else if (operation.hash !== hash) { + operation.hash = hash!; + operation.timestamp = Date.now(); + + await this.saveWorkingOperations(rootUri, operations); + await this.saveWorkingContent(uri, textDecoder.decode(content)); + } + + this._onDidChange.fire(toChangeStoreEvent(operation, rootUri, uri)); + } + + async onFileCreated(uri: Uri, content: Uint8Array): Promise { + const rootUri = getRootUri(uri); + if (rootUri === undefined) { + return; + } + + const key = uri.toString(); + + const operations = this.getWorkingOperations(rootUri); + + const hash = await sha1(content); + + let operation = operations.find(c => c.uri === key); + if (operation === undefined) { + operation = { + type: 'created', + size: content.byteLength, + timestamp: Date.now(), + uri: key, + hash: hash!, + originalHash: hash! + } as CreateOperation; + operations.push(operation); + + await this.saveWorkingOperations(rootUri, operations); + await this.saveWorkingContent(uri, textDecoder.decode(content)); + } else { + // Shouldn't happen, but if it does just update the contents + operation.hash = hash!; + operation.timestamp = Date.now(); + + await this.saveWorkingOperations(rootUri, operations); + await this.saveWorkingContent(uri, textDecoder.decode(content)); + } + + this._onDidChange.fire(toChangeStoreEvent(operation, rootUri, uri)); + } + + async onFileDeleted(uri: Uri): Promise { + const rootUri = getRootUri(uri); + if (rootUri === undefined) { + return; + } + + const key = uri.toString(); + + const operations = this.getWorkingOperations(rootUri); + + let operation = operations.find(c => c.uri === key); + if (operation !== undefined) { + operations.splice(operations.indexOf(operation), 1); + } + + const wasCreated = operation?.type === 'created'; + + operation = { + type: 'deleted', + timestamp: Date.now(), + uri: key, + } as DeleteOperation; + + // Only track the delete, if we weren't tracking the create + if (!wasCreated) { + operations.push(operation); + } + + await this.saveWorkingOperations(rootUri, operations); + await this.discardWorkingContent(uri); + + this._onDidChange.fire(toChangeStoreEvent(operation, rootUri, uri)); + } + + async openChanges(uri: Uri, original: Uri) { + const opts: TextDocumentShowOptions = { + preserveFocus: false, + preview: true, + viewColumn: ViewColumn.Active + }; + + await commands.executeCommand('vscode.diff', original, uri, `${uri.fsPath} (Working Tree)`, opts); + } + + async openFile(uri: Uri) { + const opts: TextDocumentShowOptions = { + preserveFocus: false, + preview: false, + viewColumn: ViewColumn.Active + }; + + await commands.executeCommand('vscode.open', uri, opts); + } + + private getWorkingOperations(rootUri: Uri): StoredOperation[] { + return this.memento.get(`${workingOperationsKeyPrefix}${rootUri.toString()}`, []); + } + + private async saveWorkingOperations(rootUri: Uri, operations: StoredOperation[] | undefined): Promise { + await this.memento.update(`${workingOperationsKeyPrefix}${rootUri.toString()}`, operations); + } + + private async saveWorkingContent(uri: Uri, content: string): Promise { + await this.memento.update(`${workingFileKeyPrefix}${uri.toString()}`, content); + } + + private async discardWorkingContent(uri: Uri): Promise { + await this.memento.update(`${workingFileKeyPrefix}${uri.toString()}`, undefined); + } +} diff --git a/extensions/github-browser/src/contextStore.ts b/extensions/github-browser/src/contextStore.ts new file mode 100644 index 00000000000..80286445dfe --- /dev/null +++ b/extensions/github-browser/src/contextStore.ts @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import { Event, EventEmitter, Memento, Uri, workspace } from 'vscode'; + +export interface WorkspaceFolderContext { + context: T; + name: string; + folderUri: Uri; +} + +export class ContextStore { + private _onDidChange = new EventEmitter(); + get onDidChange(): Event { + return this._onDidChange.event; + } + + constructor( + private readonly scheme: string, + private readonly originalScheme: string, + private readonly memento: Memento, + ) { } + + delete(uri: Uri) { + return this.set(uri, undefined); + } + + get(uri: Uri): T | undefined { + return this.memento.get(`${this.originalScheme}.context|${this.getOriginalResource(uri).toString()}`); + } + + getForWorkspace(): WorkspaceFolderContext[] { + const folders = workspace.workspaceFolders?.filter(f => f.uri.scheme === this.scheme || f.uri.scheme === this.originalScheme) ?? []; + return folders.map(f => ({ context: this.get(f.uri)!, name: f.name, folderUri: f.uri })).filter(c => c.context !== undefined); + } + + async set(uri: Uri, context: T | undefined) { + uri = this.getOriginalResource(uri); + await this.memento.update(`${this.originalScheme}.context|${uri.toString()}`, context); + this._onDidChange.fire(uri); + } + + getOriginalResource(uri: Uri): Uri { + return uri.with({ scheme: this.originalScheme }); + } + + getWorkspaceResource(uri: Uri): Uri { + return uri.with({ scheme: this.scheme }); + } +} diff --git a/extensions/github-browser/src/extension.ts b/extensions/github-browser/src/extension.ts index 7828fc61e0f..893daf93c58 100644 --- a/extensions/github-browser/src/extension.ts +++ b/extensions/github-browser/src/extension.ts @@ -3,9 +3,78 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as vscode from 'vscode'; -import { GitHubFS } from './githubfs'; +import { commands, ExtensionContext, Uri, window, workspace } from 'vscode'; +import { ChangeStore } from './changeStore'; +import { ContextStore } from './contextStore'; +import { VirtualFS } from './fs'; +import { GitHubApiContext, GitHubApi } from './github/api'; +import { GitHubFS } from './github/fs'; +import { VirtualSCM } from './scm'; +import { StatusBar } from './statusbar'; -export function activate(context: vscode.ExtensionContext) { - context.subscriptions.push(new GitHubFS()); +const repositoryRegex = /^(?:(?:https:\/\/)?github.com\/)?([^\/]+)\/([^\/]+?)(?:\/|.git|$)/i; + +export async function activate(context: ExtensionContext) { + const contextStore = new ContextStore('codespace', GitHubFS.scheme, context.workspaceState); + const changeStore = new ChangeStore(context.workspaceState); + + const githubApi = new GitHubApi(contextStore); + const gitHubFS = new GitHubFS(githubApi); + const virtualFS = new VirtualFS('codespace', contextStore, changeStore, gitHubFS); + + context.subscriptions.push( + githubApi, + gitHubFS, + virtualFS, + new VirtualSCM(GitHubFS.scheme, githubApi, changeStore), + new StatusBar(contextStore, changeStore), + ); + + commands.registerCommand('githubBrowser.openRepository', async () => { + const value = await window.showInputBox({ + placeHolder: 'e.g. https://github.com/microsoft/vscode', + prompt: 'Enter a GitHub repository url', + validateInput: value => repositoryRegex.test(value) ? undefined : 'Invalid repository url' + }); + + if (value) { + const match = repositoryRegex.exec(value); + if (match) { + const [, owner, repo] = match; + + const uri = Uri.parse(`codespace://HEAD/${owner}/${repo}`); + openWorkspace(uri, repo, 'currentWindow'); + } + } + }); +} + +export function getRelativePath(rootUri: Uri, uri: Uri) { + return uri.path.substr(rootUri.path.length + 1); +} + +export function getRootUri(uri: Uri) { + return workspace.getWorkspaceFolder(uri)?.uri; +} + +export function isChild(folderPath: string, filePath: string) { + return isDescendent(folderPath, filePath) && filePath.substr(folderPath.length + (folderPath.endsWith('/') ? 0 : 1)).split('/').length === 1; +} + +export function isDescendent(folderPath: string, filePath: string) { + return folderPath.length === 0 || filePath.startsWith(folderPath.endsWith('/') ? folderPath : `${folderPath}/`); +} + +const shaRegex = /^[0-9a-f]{40}$/; +export function isSha(ref: string) { + return shaRegex.test(ref); +} + +function openWorkspace(uri: Uri, name: string, location: 'currentWindow' | 'newWindow' | 'addToCurrentWorkspace') { + if (location === 'addToCurrentWorkspace') { + const count = (workspace.workspaceFolders && workspace.workspaceFolders.length) || 0; + return workspace.updateWorkspaceFolders(count, 0, { uri: uri, name: name }); + } + + return commands.executeCommand('vscode.openFolder', uri, location === 'newWindow'); } diff --git a/extensions/github-browser/src/fs.ts b/extensions/github-browser/src/fs.ts new file mode 100644 index 00000000000..56af40f21ba --- /dev/null +++ b/extensions/github-browser/src/fs.ts @@ -0,0 +1,216 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import { + CancellationToken, + Disposable, + Event, + EventEmitter, + FileChangeEvent, + FileChangeType, + FileSearchOptions, + FileSearchProvider, + FileSearchQuery, + FileStat, + FileSystemError, + FileSystemProvider, + FileType, + Progress, + TextSearchOptions, + TextSearchProvider, + TextSearchQuery, + TextSearchResult, + Uri, + workspace, +} from 'vscode'; +import { IWritableChangeStore } from './changeStore'; +import { ContextStore } from './contextStore'; +import { GitHubApiContext } from './github/api'; + +const emptyDisposable = { dispose: () => { /* noop */ } }; +const textEncoder = new TextEncoder(); + +export class VirtualFS implements FileSystemProvider, FileSearchProvider, TextSearchProvider, Disposable { + private _onDidChangeFile = new EventEmitter(); + get onDidChangeFile(): Event { + return this._onDidChangeFile.event; + } + + private readonly disposable: Disposable; + + constructor( + readonly scheme: string, + private readonly contextStore: ContextStore, + private readonly changeStore: IWritableChangeStore, + private readonly fs: FileSystemProvider & FileSearchProvider & TextSearchProvider + ) { + // TODO@eamodio listen for workspace folder changes + for (const context of contextStore.getForWorkspace()) { + // If we have a saved context, but no longer have any changes, reset the context + // We only do this on startup/reload to keep things consistent + if (!changeStore.hasChanges(context.folderUri)) { + console.log('Clear context', context.folderUri.toString()); + contextStore.delete(context.folderUri); + } + } + + this.disposable = Disposable.from( + workspace.registerFileSystemProvider(scheme, this, { isCaseSensitive: true }), + workspace.registerFileSearchProvider(scheme, this), + workspace.registerTextSearchProvider(scheme, this), + changeStore.onDidChange(e => { + switch (e.type) { + case 'created': + this._onDidChangeFile.fire([{ type: FileChangeType.Created, uri: e.uri }]); + break; + case 'changed': + this._onDidChangeFile.fire([{ type: FileChangeType.Changed, uri: e.uri }]); + break; + case 'deleted': + this._onDidChangeFile.fire([{ type: FileChangeType.Deleted, uri: e.uri }]); + break; + } + }), + ); + } + + dispose() { + this.disposable?.dispose(); + } + + private getOriginalResource(uri: Uri): Uri { + return this.contextStore.getOriginalResource(uri); + } + + private getWorkspaceResource(uri: Uri): Uri { + return this.contextStore.getWorkspaceResource(uri); + } + + //#region FileSystemProvider + + watch(): Disposable { + return emptyDisposable; + } + + async stat(uri: Uri): Promise { + let stat = this.changeStore.getStat(uri); + if (stat !== undefined) { + return stat; + } + + stat = await this.fs.stat(this.getOriginalResource(uri)); + return stat; + } + + async readDirectory(uri: Uri): Promise<[string, FileType][]> { + let entries = await this.fs.readDirectory(this.getOriginalResource(uri)); + entries = this.changeStore.updateDirectoryEntries(uri, entries); + return entries; + } + + createDirectory(_uri: Uri): void | Thenable { + // TODO@eamodio only support files for now + throw FileSystemError.NoPermissions(); + } + + async readFile(uri: Uri): Promise { + const content = this.changeStore.getContent(uri); + if (content !== undefined) { + return textEncoder.encode(content); + } + + const data = await this.fs.readFile(this.getOriginalResource(uri)); + return data; + } + + async writeFile(uri: Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): Promise { + let stat; + try { + stat = await this.stat(uri); + if (!options.overwrite) { + throw FileSystemError.FileExists(); + } + } catch (ex) { + if (ex instanceof FileSystemError && ex.code === 'FileNotFound') { + if (!options.create) { + throw FileSystemError.FileNotFound(); + } + } else { + throw ex; + } + } + + if (stat === undefined) { + await this.changeStore.onFileCreated(uri, content); + } else { + await this.changeStore.onFileChanged(uri, content, () => this.fs.readFile(this.getOriginalResource(uri))); + } + } + + async delete(uri: Uri, _options: { recursive: boolean }): Promise { + const stat = await this.stat(uri); + if (stat.type !== FileType.File) { + throw FileSystemError.NoPermissions(); + } + + await this.changeStore.onFileDeleted(uri); + } + + async rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): Promise { + const stat = await this.stat(oldUri); + // TODO@eamodio only support files for now + if (stat.type !== FileType.File) { + throw FileSystemError.NoPermissions(); + } + + const content = await this.readFile(oldUri); + await this.writeFile(newUri, content, { create: true, overwrite: options.overwrite }); + await this.delete(oldUri, { recursive: false }); + } + + async copy(source: Uri, destination: Uri, options: { overwrite: boolean }): Promise { + const stat = await this.stat(source); + // TODO@eamodio only support files for now + if (stat.type !== FileType.File) { + throw FileSystemError.NoPermissions(); + } + + const content = await this.readFile(source); + await this.writeFile(destination, content, { create: true, overwrite: options.overwrite }); + } + + //#endregion + + //#region FileSearchProvider + + provideFileSearchResults( + query: FileSearchQuery, + options: FileSearchOptions, + token: CancellationToken, + ) { + return this.fs.provideFileSearchResults(query, { ...options, folder: this.getOriginalResource(options.folder) }, token); + } + + //#endregion + + //#region TextSearchProvider + + provideTextSearchResults( + query: TextSearchQuery, + options: TextSearchOptions, + progress: Progress, + token: CancellationToken, + ) { + return this.fs.provideTextSearchResults( + query, + { ...options, folder: this.getOriginalResource(options.folder) }, + { report: (result: TextSearchResult) => progress.report({ ...result, uri: this.getWorkspaceResource(result.uri) }) }, + token + ); + } + + //#endregion +} diff --git a/extensions/github-browser/src/gate.ts b/extensions/github-browser/src/gate.ts new file mode 100644 index 00000000000..d49762dc748 --- /dev/null +++ b/extensions/github-browser/src/gate.ts @@ -0,0 +1,87 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +const emptyStr = ''; + +function defaultResolver(...args: any[]): string { + if (args.length === 1) { + const arg0 = args[0]; + if (arg0 === undefined || arg0 === null) { + return emptyStr; + } + if (typeof arg0 === 'string') { + return arg0; + } + if (typeof arg0 === 'number' || typeof arg0 === 'boolean') { + return String(arg0); + } + + return JSON.stringify(arg0); + } + + return JSON.stringify(args); +} + +function iPromise(obj: T | Promise): obj is Promise { + return typeof (obj as Promise)?.then === 'function'; +} + +export function gate any>(resolver?: (...args: Parameters) => string) { + return (_target: any, key: string, descriptor: PropertyDescriptor) => { + let fn: Function | undefined; + if (typeof descriptor.value === 'function') { + fn = descriptor.value; + } else if (typeof descriptor.get === 'function') { + fn = descriptor.get; + } + if (fn === undefined || fn === null) { + throw new Error('Not supported'); + } + + const gateKey = `$gate$${key}`; + + descriptor.value = function (this: any, ...args: any[]) { + const prop = + args.length === 0 ? gateKey : `${gateKey}$${(resolver ?? defaultResolver)(...(args as Parameters))}`; + + if (!Object.prototype.hasOwnProperty.call(this, prop)) { + Object.defineProperty(this, prop, { + configurable: false, + enumerable: false, + writable: true, + value: undefined, + }); + } + + let promise = this[prop]; + if (promise === undefined) { + let result; + try { + result = fn!.apply(this, args); + if (result === undefined || fn === null || !iPromise(result)) { + return result; + } + + this[prop] = promise = result + .then((r: any) => { + this[prop] = undefined; + return r; + }) + .catch(ex => { + this[prop] = undefined; + throw ex; + }); + } catch (ex) { + this[prop] = undefined; + throw ex; + } + } + + return promise; + }; + }; +} diff --git a/extensions/github-browser/src/github/api.ts b/extensions/github-browser/src/github/api.ts new file mode 100644 index 00000000000..41eedc8fe39 --- /dev/null +++ b/extensions/github-browser/src/github/api.ts @@ -0,0 +1,504 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { authentication, AuthenticationSession, Disposable, Event, EventEmitter, Range, Uri } from 'vscode'; +import { graphql } from '@octokit/graphql'; +import { Octokit } from '@octokit/rest'; +import { ContextStore } from '../contextStore'; +import { fromGitHubUri } from './fs'; +import { isSha } from '../extension'; +import { Iterables } from '../iterables'; + +export interface GitHubApiContext { + requestRef: string; + + branch: string; + sha: string | undefined; + timestamp: number; +} + +interface CreateCommitOperation { + type: 'created'; + path: string; + content: string +} + +interface ChangeCommitOperation { + type: 'changed'; + path: string; + content: string +} + +interface DeleteCommitOperation { + type: 'deleted'; + path: string; + content: undefined +} + +export type CommitOperation = CreateCommitOperation | ChangeCommitOperation | DeleteCommitOperation; + +type ArrayElement> = T extends (infer U)[] ? U : never; +type GitCreateTreeParamsTree = ArrayElement[0]>['tree']>; + +function getGitHubRootUri(uri: Uri) { + const rootIndex = uri.path.indexOf('/', uri.path.indexOf('/', 1) + 1); + return uri.with({ + path: uri.path.substring(0, rootIndex === -1 ? undefined : rootIndex), + query: '' + }); +} + +export class GitHubApi implements Disposable { + private _onDidChangeContext = new EventEmitter(); + get onDidChangeContext(): Event { + return this._onDidChangeContext.event; + } + + private readonly disposable: Disposable; + + constructor(private readonly context: ContextStore) { + this.disposable = Disposable.from( + context.onDidChange(e => this._onDidChangeContext.fire(e)) + ); + } + + dispose() { + this.disposable.dispose(); + } + + private _session: AuthenticationSession | undefined; + async ensureAuthenticated() { + if (this._session === undefined) { + const providers = await authentication.getProviderIds(); + if (!providers.includes('github')) { + await new Promise(resolve => { + authentication.onDidChangeAuthenticationProviders(e => { + if (e.added.includes('github')) { + resolve(); + } + }); + }); + } + + this._session = await authentication.getSession('github', ['repo'], { createIfNone: true }); + } + + return this._session; + } + + private _graphql: typeof graphql | undefined; + private async graphql() { + if (this._graphql === undefined) { + const session = await this.ensureAuthenticated(); + this._graphql = graphql.defaults({ + headers: { + Authorization: `Bearer ${session.accessToken}`, + } + }); + } + + return this._graphql; + } + + private _octokit: typeof Octokit | undefined; + private async octokit(options?: ConstructorParameters[0]) { + if (this._octokit === undefined) { + const session = await this.ensureAuthenticated(); + this._octokit = Octokit.defaults({ auth: `token ${session.accessToken}` }); + } + return new this._octokit(options); + } + + async commit(rootUri: Uri, message: string, operations: CommitOperation[]): Promise { + const { owner, repo } = fromGitHubUri(rootUri); + + try { + const context = await this.getContext(rootUri); + if (context.sha === undefined) { + throw new Error(`Cannot commit to Uri(${rootUri.toString(true)}); Invalid context sha`); + } + + const hasDeletes = operations.some(op => op.type === 'deleted'); + + const github = await this.octokit(); + const treeResp = await github.git.getTree({ + owner: owner, + repo: repo, + tree_sha: context.sha, + recursive: hasDeletes ? 'true' : undefined, + }); + + // 0100000000000000 (040000): Directory + // 1000000110100100 (100644): Regular non-executable file + // 1000000110110100 (100664): Regular non-executable group-writeable file + // 1000000111101101 (100755): Regular executable file + // 1010000000000000 (120000): Symbolic link + // 1110000000000000 (160000): Gitlink + let updatedTree: GitCreateTreeParamsTree[]; + + if (hasDeletes) { + updatedTree = treeResp.data.tree as GitCreateTreeParamsTree[]; + + for (const operation of operations) { + switch (operation.type) { + case 'created': + updatedTree.push({ path: operation.path, mode: '100644', type: 'blob', content: operation.content }); + break; + + case 'changed': { + const index = updatedTree.findIndex(item => item.path === operation.path); + if (index !== -1) { + const { path, mode, type } = updatedTree[index]; + updatedTree.splice(index, 1, { path: path, mode: mode, type: type, content: operation.content }); + } + break; + } + case 'deleted': { + const index = updatedTree.findIndex(item => item.path === operation.path); + if (index !== -1) { + updatedTree.splice(index, 1); + } + break; + } + } + } + } else { + updatedTree = []; + + for (const operation of operations) { + switch (operation.type) { + case 'created': + updatedTree.push({ path: operation.path, mode: '100644', type: 'blob', content: operation.content }); + break; + + case 'changed': + const item = treeResp.data.tree.find(item => item.path === operation.path) as GitCreateTreeParamsTree; + if (item !== undefined) { + const { path, mode, type } = item; + updatedTree.push({ path: path, mode: mode, type: type, content: operation.content }); + } + break; + } + } + } + + const updatedTreeResp = await github.git.createTree({ + owner: owner, + repo: repo, + base_tree: hasDeletes ? undefined : treeResp.data.sha, + tree: updatedTree + }); + + const resp = await github.git.createCommit({ + owner: owner, + repo: repo, + message: message, + tree: updatedTreeResp.data.sha, + parents: [context.sha] + }); + + this.updateContext(rootUri, { ...context, sha: resp.data.sha, timestamp: Date.now() }); + + // TODO@eamodio need to send a file change for any open files + + await github.git.updateRef({ + owner: owner, + repo: repo, + ref: `heads/${context.branch}`, + sha: resp.data.sha + }); + + return resp.data.sha; + } catch (ex) { + console.log(ex); + throw ex; + } + } + + async defaultBranchQuery(uri: Uri) { + const { owner, repo } = fromGitHubUri(uri); + + try { + const query = `query defaultBranch($owner: String!, $repo: String!) { + repository(owner: $owner, name: $repo) { + defaultBranchRef { + name + } + } +}`; + + const rsp = await this.gqlQuery<{ + repository: { defaultBranchRef: { name: string; target: { oid: string } } | null | undefined }; + }>(query, { + owner: owner, + repo: repo, + }); + return rsp?.repository?.defaultBranchRef?.name ?? undefined; + } catch (ex) { + return undefined; + } + } + + async filesQuery(uri: Uri) { + const { owner, repo, ref } = fromGitHubUri(uri); + + try { + const context = await this.getContext(uri); + + const resp = await (await this.octokit()).git.getTree({ + owner: owner, + repo: repo, + recursive: '1', + tree_sha: context?.sha ?? ref, + }); + return Iterables.filterMap(resp.data.tree, p => p.type === 'blob' ? p.path : undefined); + } catch (ex) { + return []; + } + } + + async fsQuery(uri: Uri, innerQuery: string): Promise { + const { owner, repo, path, ref } = fromGitHubUri(uri); + + try { + const context = await this.getContext(uri); + + const query = `query fs($owner: String!, $repo: String!, $path: String) { + repository(owner: $owner, name: $repo) { + object(expression: $path) { + ${innerQuery} + } + } +}`; + + const rsp = await this.gqlQuery<{ + repository: { object: T | null | undefined }; + }>(query, { + owner: owner, + repo: repo, + path: `${context.sha ?? ref}:${path}`, + }); + return rsp?.repository?.object ?? undefined; + } catch (ex) { + return undefined; + } + } + + async latestCommitQuery(uri: Uri) { + const { owner, repo, ref } = fromGitHubUri(uri); + + try { + if (ref === 'HEAD') { + const query = `query latest($owner: String!, $repo: String!) { + repository(owner: $owner, name: $repo) { + defaultBranchRef { + target { + oid + } + } + } +}`; + + const rsp = await this.gqlQuery<{ + repository: { defaultBranchRef: { name: string; target: { oid: string } } | null | undefined }; + }>(query, { + owner: owner, + repo: repo, + }); + return rsp?.repository?.defaultBranchRef?.target.oid ?? undefined; + } + + const query = `query latest($owner: String!, $repo: String!, $ref: String!) { + repository(owner: $owner, name: $repo) { + ref(qualifiedName: $ref) { + target { + oid + } + } + } +}`; + + const rsp = await this.gqlQuery<{ + repository: { ref: { target: { oid: string } } | null | undefined }; + }>(query, { + owner: owner, + repo: repo, + ref: ref ?? 'HEAD', + }); + return rsp?.repository?.ref?.target.oid ?? undefined; + } catch (ex) { + return undefined; + } + } + + async searchQuery( + query: string, + uri: Uri, + options: { maxResults?: number; context?: { before?: number; after?: number } }, + ): Promise { + const { owner, repo, ref } = fromGitHubUri(uri); + + // If we have a specific ref, don't try to search, because GitHub search only works against the default branch + if (ref !== 'HEAD') { + return { matches: [], limitHit: true }; + } + + try { + const resp = await (await this.octokit({ + request: { + headers: { + accept: 'application/vnd.github.v3.text-match+json', + }, + } + })).search.code({ + q: `${query} repo:${owner}/${repo}`, + }); + + // Since GitHub doesn't return ANY line numbers just fake it at the top of the file 😢 + const range = new Range(0, 0, 0, 0); + + const matches: SearchQueryMatch[] = []; + + let counter = 0; + let match: SearchQueryMatch; + for (const item of resp.data.items) { + for (const m of (item as typeof item & { text_matches: GitHubSearchTextMatch[] }).text_matches) { + counter++; + if (options.maxResults !== undefined && counter > options.maxResults) { + return { matches: matches, limitHit: true }; + } + + match = { + path: item.path, + ranges: [], + preview: m.fragment, + matches: [], + }; + + for (const lm of m.matches) { + let line = 0; + let shartChar = 0; + let endChar = 0; + for (let i = 0; i < lm.indices[1]; i++) { + if (i === lm.indices[0]) { + shartChar = endChar; + } + + if (m.fragment[i] === '\n') { + line++; + endChar = 0; + } else { + endChar++; + } + } + + match.ranges.push(range); + match.matches.push(new Range(line, shartChar, line, endChar)); + } + + matches.push(match); + } + } + + return { matches: matches, limitHit: false }; + } catch (ex) { + return { matches: [], limitHit: true }; + } + } + + private async gqlQuery(query: string, variables: { [key: string]: string | number }): Promise { + return (await this.graphql())(query, variables); + } + + private readonly pendingContextRequests = new Map>(); + async getContext(uri: Uri): Promise { + const rootUri = getGitHubRootUri(uri); + + let pending = this.pendingContextRequests.get(rootUri.toString()); + if (pending === undefined) { + pending = this.getContextCore(rootUri); + this.pendingContextRequests.set(rootUri.toString(), pending); + } + + try { + return await pending; + } finally { + this.pendingContextRequests.delete(rootUri.toString()); + } + } + + private readonly rootUriToContextMap = new Map(); + + private async getContextCore(rootUri: Uri): Promise { + const key = rootUri.toString(); + let context = this.rootUriToContextMap.get(key); + + // Check if we have a cached a context + if (context?.sha !== undefined) { + return context; + } + + // Check if we have a saved context + context = this.context.get(rootUri); + if (context?.sha !== undefined) { + this.rootUriToContextMap.set(key, context); + + return context; + } + + const { ref } = fromGitHubUri(rootUri); + + // If the requested ref looks like a sha, then use it + if (isSha(ref)) { + context = { requestRef: ref, branch: ref, sha: ref, timestamp: Date.now() }; + } else { + let branch; + if (ref === 'HEAD') { + branch = await this.defaultBranchQuery(rootUri); + if (branch === undefined) { + throw new Error(`Cannot get context for Uri(${rootUri.toString(true)}); unable to get default branch`); + } + } else { + branch = ref; + } + + // Query for the latest sha for the give ref + const sha = await this.latestCommitQuery(rootUri); + context = { requestRef: ref, branch: branch, sha: sha, timestamp: Date.now() }; + } + + this.updateContext(rootUri, context); + + return context; + } + + private updateContext(rootUri: Uri, context: GitHubApiContext) { + this.rootUriToContextMap.set(rootUri.toString(), context); + this.context.set(rootUri, context); + } +} + +interface GitHubSearchTextMatch { + object_url: string; + object_type: string; + property: string; + fragment: string; + matches: { + text: string; + indices: number[]; + }[]; +} + +interface SearchQueryMatch { + path: string; + ranges: Range[]; + preview: string; + matches: Range[]; +} + +interface SearchQueryResults { + matches: SearchQueryMatch[]; + limitHit: boolean; +} diff --git a/extensions/github-browser/src/githubfs.ts b/extensions/github-browser/src/github/fs.ts similarity index 53% rename from extensions/github-browser/src/githubfs.ts rename to extensions/github-browser/src/github/fs.ts index 688c3757552..d0af10751c0 100644 --- a/extensions/github-browser/src/githubfs.ts +++ b/extensions/github-browser/src/github/fs.ts @@ -5,8 +5,6 @@ 'use strict'; import { - authentication, - AuthenticationSession2, CancellationToken, Disposable, Event, @@ -20,7 +18,6 @@ import { FileSystemProvider, FileType, Progress, - Range, TextSearchComplete, TextSearchOptions, TextSearchProvider, @@ -29,11 +26,11 @@ import { Uri, workspace, } from 'vscode'; -import { Octokit } from '@octokit/rest'; -import { graphql } from '@octokit/graphql/'; import * as fuzzySort from 'fuzzysort'; import fetch from 'node-fetch'; -import { Iterables } from './iterables'; +import { GitHubApi } from './api'; +import { Iterables } from '../iterables'; +import { getRootUri } from '../extension'; const emptyDisposable = { dispose: () => { /* noop */ } }; const replaceBackslashRegex = /(\/|\\)/g; @@ -53,16 +50,17 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea } private readonly disposable: Disposable; - private fsCache = new Map(); + private fsCache = new Map>(); - constructor() { + constructor(private readonly github: GitHubApi) { this.disposable = Disposable.from( workspace.registerFileSystemProvider(GitHubFS.scheme, this, { isCaseSensitive: true, - isReadonly: true, + isReadonly: true }), workspace.registerFileSearchProvider(GitHubFS.scheme, this), workspace.registerTextSearchProvider(GitHubFS.scheme, this), + github.onDidChangeContext(e => this.fsCache.delete(e.toString())) ); } @@ -70,22 +68,18 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea this.disposable?.dispose(); } - private _github: Promise | undefined; - get github(): Promise { - if (this._github === undefined) { - this._github = this.getGitHubApi(); + private getCache(uri: Uri) { + const rootUri = getRootUri(uri); + if (rootUri === undefined) { + return undefined; } - return this._github; - } - private async getGitHubApi(): Promise { - try { - const session = await authentication.getSession('github', ['repo'], { createIfNone: true }); - return new GitHubApi(session); - } catch (ex) { - this._github = undefined; - throw ex; + let cache = this.fsCache.get(rootUri.toString()); + if (cache === undefined) { + cache = new Map(); + this.fsCache.set(rootUri.toString(), cache); } + return cache; } //#region FileSystemProvider @@ -96,7 +90,8 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea async stat(uri: Uri): Promise { if (uri.path === '' || uri.path.lastIndexOf('/') === 0) { - return { type: FileType.Directory, size: 0, ctime: 0, mtime: 0 }; + const context = await this.github.getContext(uri); + return { type: FileType.Directory, size: 0, ctime: 0, mtime: context?.timestamp }; } const data = await this.fsQuery<{ @@ -108,14 +103,20 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea ...on Blob { byteSize }`, - this.fsCache, + this.getCache(uri), ); + if (data === undefined) { + throw FileSystemError.FileNotFound(); + } + + const context = await this.github.getContext(uri); + return { - type: typenameToFileType(data?.__typename), - size: data?.byteSize ?? 0, + type: typenameToFileType(data.__typename), + size: data.byteSize ?? 0, ctime: 0, - mtime: 0, + mtime: context?.timestamp, }; } @@ -130,7 +131,7 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea type } }`, - this.fsCache, + this.getCache(uri), ); return (data?.entries ?? []).map<[string, FileType]>(e => [ @@ -139,8 +140,8 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea ]); } - createDirectory(): void | Thenable { - throw FileSystemError.NoPermissions; + createDirectory(_uri: Uri): void | Thenable { + throw FileSystemError.NoPermissions(); } async readFile(uri: Uri): Promise { @@ -172,20 +173,20 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea return textEncoder.encode(data?.text ?? ''); } - writeFile(): void | Thenable { - throw FileSystemError.NoPermissions; + async writeFile(_uri: Uri, _content: Uint8Array, _options: { create: boolean, overwrite: boolean }): Promise { + throw FileSystemError.NoPermissions(); } - delete(): void | Thenable { - throw FileSystemError.NoPermissions; + delete(_uri: Uri, _options: { recursive: boolean }): void | Thenable { + throw FileSystemError.NoPermissions(); } - rename(): void | Thenable { - throw FileSystemError.NoPermissions; + rename(_oldUri: Uri, _newUri: Uri, _options: { overwrite: boolean }): void | Thenable { + throw FileSystemError.NoPermissions(); } - copy?(): void | Thenable { - throw FileSystemError.NoPermissions; + copy(_source: Uri, _destination: Uri, _options: { overwrite: boolean }): void | Thenable { + throw FileSystemError.NoPermissions(); } //#endregion @@ -201,8 +202,10 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea ): Promise { let searchable = this.fileSearchCache.get(options.folder.toString(true)); if (searchable === undefined) { - const matches = await (await this.github)?.filesQuery(options.folder); - if (matches === undefined || token.isCancellationRequested) { return []; } + const matches = await this.github.filesQuery(options.folder); + if (matches === undefined || token.isCancellationRequested) { + return []; + } searchable = [...Iterables.map(matches, m => (fuzzySort as Fuzzysort).prepareSlow(m))]; this.fileSearchCache.set(options.folder.toString(true), searchable); @@ -233,13 +236,12 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea query: TextSearchQuery, options: TextSearchOptions, progress: Progress, - token: CancellationToken, + _token: CancellationToken, ): Promise { - const results = await (await this.github)?.searchQuery( + const results = await this.github.searchQuery( query.pattern, options.folder, { maxResults: options.maxResults, context: { before: options.beforeContext, after: options.afterContext } }, - token, ); if (results === undefined) { return { limitHit: true }; } @@ -266,9 +268,11 @@ export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSea const key = `${uri.toString()}:${getHashCode(query)}`; let data = cache?.get(key); - if (data !== undefined) { return data as T; } + if (data !== undefined) { + return data as T; + } - data = await (await this.github)?.fsQuery(uri, query); + data = await this.github.fsQuery(uri, query); cache?.set(key, data); return data; } @@ -295,15 +299,19 @@ function typenameToFileType(typename: string | undefined | null) { } } -type RepoInfo = { owner: string; repo: string; path: string | undefined; ref?: string }; -function fromGitHubUri(uri: Uri): RepoInfo { +type RepoInfo = { owner: string; repo: string; path: string | undefined; ref: string }; +export function fromGitHubUri(uri: Uri): RepoInfo { const [, owner, repo, ...rest] = uri.path.split('/'); let ref; if (uri.authority) { ref = uri.authority; + // The casing of HEAD is important for the GitHub api to work + if (/HEAD/i.test(ref)) { + ref = 'HEAD'; + } } - return { owner: owner, repo: repo, path: rest.join('/'), ref: ref }; + return { owner: owner, repo: repo, path: rest.join('/'), ref: ref ?? 'HEAD' }; } function getHashCode(s: string): number { @@ -322,175 +330,3 @@ function getHashCode(s: string): number { } return hash; } - -interface SearchQueryMatch { - path: string; - ranges: Range[]; - preview: string; - matches: Range[]; -} - -interface SearchQueryResults { - matches: SearchQueryMatch[]; - limitHit: boolean; -} - -class GitHubApi { - constructor(private readonly session: AuthenticationSession2) { } - - private _graphql: typeof graphql | undefined; - private get graphql() { - if (this._graphql === undefined) { - this._graphql = graphql.defaults({ - headers: { - Authorization: `Bearer ${this.token}`, - } - }); - } - - return this._graphql; - } - - get token() { - return this.session.accessToken; - } - - async filesQuery(uri: Uri) { - const { owner, repo, ref } = fromGitHubUri(uri); - try { - const resp = await new Octokit({ - auth: `token ${this.token}`, - }).git.getTree({ - owner: owner, - repo: repo, - recursive: '1', - tree_sha: ref ?? 'HEAD', - }); - return Iterables.filterMap(resp.data.tree, p => p.type === 'blob' ? p.path : undefined); - } catch (ex) { - return []; - } - } - - async searchQuery( - query: string, - uri: Uri, - options: { maxResults?: number; context?: { before?: number; after?: number } }, - _token: CancellationToken, - ): Promise { - const { owner, repo, ref } = fromGitHubUri(uri); - - // If we have a specific ref, don't try to search, because GitHub search only works against the default branch - if (ref === undefined) { - return { matches: [], limitHit: true }; - } - - try { - const resp = await new Octokit({ - auth: `token ${this.token}`, - request: { - headers: { - accept: 'application/vnd.github.v3.text-match+json', - }, - } - }).search.code({ - q: `${query} repo:${owner}/${repo}`, - }); - - // Since GitHub doesn't return ANY line numbers just fake it at the top of the file 😢 - const range = new Range(0, 0, 0, 0); - - const matches: SearchQueryMatch[] = []; - - console.log(resp.data.items.length, resp.data.items); - - let counter = 0; - let match: SearchQueryMatch; - for (const item of resp.data.items) { - for (const m of (item as typeof item & { text_matches: GitHubSearchTextMatch[] }).text_matches) { - counter++; - if (options.maxResults !== undefined && counter > options.maxResults) { - return { matches: matches, limitHit: true }; - } - - match = { - path: item.path, - ranges: [], - preview: m.fragment, - matches: [], - }; - - for (const lm of m.matches) { - let line = 0; - let shartChar = 0; - let endChar = 0; - for (let i = 0; i < lm.indices[1]; i++) { - if (i === lm.indices[0]) { - shartChar = endChar; - } - - if (m.fragment[i] === '\n') { - line++; - endChar = 0; - } else { - endChar++; - } - } - - match.ranges.push(range); - match.matches.push(new Range(line, shartChar, line, endChar)); - } - - matches.push(match); - } - } - - return { matches: matches, limitHit: false }; - } catch (ex) { - return { matches: [], limitHit: true }; - } - } - - async fsQuery(uri: Uri, innerQuery: string): Promise { - try { - const query = `query fs($owner: String!, $repo: String!, $path: String) { - repository(owner: $owner, name: $repo) { - object(expression: $path) { - ${innerQuery} - } - } -}`; - - const { owner, repo, path, ref } = fromGitHubUri(uri); - const variables = { - owner: owner, - repo: repo, - path: `${ref ?? 'HEAD'}:${path}`, - }; - - const rsp = await this.query<{ - repository: { object: T | null | undefined }; - }>(query, variables); - return rsp?.repository?.object ?? undefined; - } catch (ex) { - return undefined; - } - } - - query(query: string, variables: { [key: string]: string | number }): Promise { - return this.graphql(query, variables) as Promise; - } -} - -interface GitHubSearchTextMatch { - object_url: string; - object_type: string; - property: string; - fragment: string; - matches: GitHubSearchMatch[]; -} - -interface GitHubSearchMatch { - text: string; - indices: number[]; -} diff --git a/extensions/github-browser/src/scm.ts b/extensions/github-browser/src/scm.ts new file mode 100644 index 00000000000..7a8e4292f22 --- /dev/null +++ b/extensions/github-browser/src/scm.ts @@ -0,0 +1,177 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import { CancellationToken, commands, Disposable, scm, SourceControl, SourceControlResourceGroup, SourceControlResourceState, Uri, window, workspace } from 'vscode'; +import * as nls from 'vscode-nls'; +import { IChangeStore } from './changeStore'; +import { GitHubApi, CommitOperation } from './github/api'; +import { getRelativePath } from './extension'; + +const localize = nls.loadMessageBundle(); + +interface ScmProvider { + sourceControl: SourceControl, + groups: SourceControlResourceGroup[] +} + +export class VirtualSCM implements Disposable { + private readonly providers: ScmProvider[] = []; + + private disposable: Disposable; + + constructor( + private readonly originalScheme: string, + private readonly github: GitHubApi, + private readonly changeStore: IChangeStore, + ) { + this.registerCommands(); + + // TODO@eamodio listen for workspace folder changes + for (const folder of workspace.workspaceFolders ?? []) { + this.createScmProvider(folder.uri, folder.name); + + for (const operation of changeStore.getChanges(folder.uri)) { + this.update(folder.uri, operation.uri); + } + } + + this.disposable = Disposable.from( + changeStore.onDidChange(e => this.update(e.rootUri, e.uri)), + ); + } + + dispose() { + this.disposable.dispose(); + } + + private registerCommands() { + commands.registerCommand('githubBrowser.commit', (sourceControl: SourceControl | undefined) => { + // TODO@eamodio remove this hack once I figure out why the args are missing + if (sourceControl === undefined && this.providers.length === 1) { + sourceControl = this.providers[0].sourceControl; + } + + if (sourceControl === undefined) { + return; + } + + this.commitChanges(sourceControl); + }); + + commands.registerCommand('githubBrowser.discardChanges', (resourceState: SourceControlResourceState) => + this.discardChanges(resourceState.resourceUri) + ); + + commands.registerCommand('githubBrowser.openChanges', (resourceState: SourceControlResourceState) => + this.openChanges(resourceState.resourceUri) + ); + + commands.registerCommand('githubBrowser.openFile', (resourceState: SourceControlResourceState) => + this.openFile(resourceState.resourceUri) + ); + } + + async commitChanges(sourceControl: SourceControl): Promise { + const operations = this.changeStore + .getChanges(sourceControl.rootUri!) + .map(operation => { + const path = getRelativePath(sourceControl.rootUri!, operation.uri); + switch (operation.type) { + case 'created': + return { type: operation.type, path: path, content: this.changeStore.getContent(operation.uri)! }; + case 'changed': + return { type: operation.type, path: path, content: this.changeStore.getContent(operation.uri)! }; + case 'deleted': + return { type: operation.type, path: path }; + } + }); + if (!operations.length) { + window.showInformationMessage(localize('no changes', "There are no changes to commit.")); + + return; + } + + const message = sourceControl.inputBox.value; + if (message) { + const sha = await this.github.commit(this.getOriginalResource(sourceControl.rootUri!), message, operations); + if (sha !== undefined) { + this.changeStore.acceptAll(sourceControl.rootUri!); + sourceControl.inputBox.value = ''; + } + } + } + + discardChanges(uri: Uri): Promise { + return this.changeStore.discard(uri); + } + + openChanges(uri: Uri) { + return this.changeStore.openChanges(uri, this.getOriginalResource(uri)); + } + + openFile(uri: Uri) { + return this.changeStore.openFile(uri); + } + + private update(rootUri: Uri, uri: Uri) { + const folder = workspace.getWorkspaceFolder(uri); + if (folder === undefined) { + return; + } + + const provider = this.createScmProvider(rootUri, folder.name); + const group = this.createChangesGroup(provider); + group.resourceStates = this.changeStore.getChanges(rootUri).map(op => { + const rs: SourceControlResourceState = { + decorations: { + strikeThrough: op.type === 'deleted' + }, + resourceUri: op.uri, + command: { + command: 'githubBrowser.openChanges', + title: 'Open Changes', + } + }; + rs.command!.arguments = [rs]; + return rs; + }); + } + + private createScmProvider(rootUri: Uri, name: string) { + let provider = this.providers.find(sc => sc.sourceControl.rootUri?.toString() === rootUri.toString()); + if (provider === undefined) { + const sourceControl = scm.createSourceControl('github', name, rootUri); + sourceControl.quickDiffProvider = { provideOriginalResource: uri => this.getOriginalResource(uri) }; + sourceControl.acceptInputCommand = { + command: 'githubBrowser.commit', + title: 'Commit', + arguments: [sourceControl] + }; + sourceControl.inputBox.placeholder = `Message (Ctrl+Enter to commit '${name}')`; + // sourceControl.inputBox.validateInput = value => value ? undefined : 'Invalid commit message'; + + provider = { sourceControl: sourceControl, groups: [] }; + this.createChangesGroup(provider); + this.providers.push(provider); + } + + return provider; + } + + private createChangesGroup(provider: ScmProvider) { + let group = provider.groups.find(g => g.id === 'github.changes'); + if (group === undefined) { + group = provider.sourceControl.createResourceGroup('github.changes', 'Changes'); + provider.groups.push(group); + } + + return group; + } + + private getOriginalResource(uri: Uri, _token?: CancellationToken): Uri { + return uri.with({ scheme: this.originalScheme }); + } +} diff --git a/extensions/github-browser/src/sha1.ts b/extensions/github-browser/src/sha1.ts new file mode 100644 index 00000000000..0469b3c98a1 --- /dev/null +++ b/extensions/github-browser/src/sha1.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +const textDecoder = new TextDecoder(); +const textEncoder = new TextEncoder(); + +declare let WEBWORKER: boolean; + +export async function sha1(s: string | Uint8Array): Promise { + while (true) { + try { + if (WEBWORKER) { + const hash = await globalThis.crypto.subtle.digest({ name: 'sha-1' }, typeof s === 'string' ? textEncoder.encode(s) : s); + // Use encodeURIComponent to avoid issues with btoa and Latin-1 characters + return globalThis.btoa(encodeURIComponent(textDecoder.decode(hash))); + } else { + return (await import('crypto')).createHash('sha1').update(s).digest('base64'); + } + } catch (ex) { + if (ex instanceof ReferenceError) { + (global as any).WEBWORKER = false; + } + } + } +} diff --git a/extensions/github-browser/src/statusbar.ts b/extensions/github-browser/src/statusbar.ts new file mode 100644 index 00000000000..e5a049a8631 --- /dev/null +++ b/extensions/github-browser/src/statusbar.ts @@ -0,0 +1,99 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import { Disposable, StatusBarAlignment, StatusBarItem, Uri, window, workspace } from 'vscode'; +import { ChangeStoreEvent, IChangeStore } from './changeStore'; +import { GitHubApiContext } from './github/api'; +import { isSha } from './extension'; +import { ContextStore, WorkspaceFolderContext } from './contextStore'; + +export class StatusBar implements Disposable { + private readonly disposable: Disposable; + + private readonly items = new Map(); + + constructor( + private readonly contextStore: ContextStore, + private readonly changeStore: IChangeStore + ) { + this.disposable = Disposable.from( + contextStore.onDidChange(this.onContextsChanged, this), + changeStore.onDidChange(this.onChanged, this) + ); + + for (const context of this.contextStore.getForWorkspace()) { + this.createOrUpdateStatusBarItem(context); + } + } + + dispose() { + this.disposable?.dispose(); + this.items.forEach(i => i.dispose()); + } + + private createOrUpdateStatusBarItem(wc: WorkspaceFolderContext) { + let item = this.items.get(wc.folderUri.toString()); + if (item === undefined) { + item = window.createStatusBarItem({ + id: `githubBrowser.branch:${wc.folderUri.toString()}`, + name: `GitHub Browser: ${wc.name}`, + alignment: StatusBarAlignment.Left, + priority: 1000 + }); + } + + if (isSha(wc.context.branch)) { + item.text = `$(git-commit) ${wc.context.branch.substr(0, 8)}`; + item.tooltip = `${wc.name} \u2022 ${wc.context.branch.substr(0, 8)}`; + } else { + item.text = `$(git-branch) ${wc.context.branch}`; + item.tooltip = `${wc.name} \u2022 ${wc.context.branch}${wc.context.sha ? ` @ ${wc.context.sha?.substr(0, 8)}` : ''}`; + } + + const hasChanges = this.changeStore.hasChanges(wc.folderUri); + if (hasChanges) { + item.text += '*'; + } + + item.show(); + + this.items.set(wc.folderUri.toString(), item); + } + + private onContextsChanged(uri: Uri) { + const folder = workspace.getWorkspaceFolder(this.contextStore.getWorkspaceResource(uri)); + if (folder === undefined) { + return; + } + + const context = this.contextStore.get(uri); + if (context === undefined) { + return; + } + + this.createOrUpdateStatusBarItem({ + context: context, + name: folder.name, + folderUri: folder.uri, + }); + } + + private onChanged(e: ChangeStoreEvent) { + const item = this.items.get(e.rootUri.toString()); + if (item !== undefined) { + const hasChanges = this.changeStore.hasChanges(e.rootUri); + if (hasChanges) { + if (!item.text.endsWith('*')) { + item.text += '*'; + } + } else { + if (item.text.endsWith('*')) { + item.text = item.text.substr(0, item.text.length - 1); + } + } + } + } +} diff --git a/extensions/github-browser/tsconfig.json b/extensions/github-browser/tsconfig.json index c88427aef86..eb413a12602 100644 --- a/extensions/github-browser/tsconfig.json +++ b/extensions/github-browser/tsconfig.json @@ -1,11 +1,12 @@ { "extends": "../shared.tsconfig.json", "compilerOptions": { - "outDir": "./out", - // "experimentalDecorators": true, - // "typeRoots": [ - // "./node_modules/@types" - // ] + "experimentalDecorators": true, + "lib": [ + "es2018", + "dom" + ], + "outDir": "./out" }, "include": [ "src/**/*" diff --git a/extensions/github-browser/yarn.lock b/extensions/github-browser/yarn.lock index bda914f9b11..2c8f1ad9658 100644 --- a/extensions/github-browser/yarn.lock +++ b/extensions/github-browser/yarn.lock @@ -3,99 +3,99 @@ "@octokit/auth-token@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.1.tgz#375d79eebd03750e6a9b0299e80b8167c7c85655" - integrity sha512-NB81O5h39KfHYGtgfWr2booRxp2bWOJoqbWwbyUg2hw6h35ArWYlAST5B3XwAkbdcx13yt84hFXyFP5X0QToWA== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.2.tgz#10d0ae979b100fa6b72fa0e8e63e27e6d0dbff8a" + integrity sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ== dependencies: - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.0" -"@octokit/core@^2.4.3": - version "2.5.3" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-2.5.3.tgz#dd754e6f5ad9b15631e9b276ae4f00ac2ea2cf9b" - integrity sha512-23AHK9xBW0v79Ck8h5U+5iA4MW7aosqv+Yr6uZXolVGNzzHwryNH5wM386/6+etiKUTwLFZTqyMU9oQpIBZcFA== +"@octokit/core@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.1.0.tgz#9c3c9b23f7504668cfa057f143ccbf0c645a0ac9" + integrity sha512-yPyQSmxIXLieEIRikk2w8AEtWkFdfG/LXcw1KvEtK3iP0ENZLW/WYQmdzOKqfSaLhooz4CJ9D+WY79C8ZliACw== dependencies: "@octokit/auth-token" "^2.4.0" "@octokit/graphql" "^4.3.1" "@octokit/request" "^5.4.0" - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.0" before-after-hook "^2.1.0" universal-user-agent "^5.0.0" "@octokit/endpoint@^6.0.1": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.2.tgz#e876aafe68d7f9b6c6d80bf29458403f9afe7b2b" - integrity sha512-xs1mmCEZ2y4shXCpFjNq3UbmNR+bLzxtZim2L0zfEtj9R6O6kc4qLDvYw66hvO6lUsYzPTM5hMkltbuNAbRAcQ== + version "6.0.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.3.tgz#dd09b599662d7e1b66374a177ab620d8cdf73487" + integrity sha512-Y900+r0gIz+cWp6ytnkibbD95ucEzDSKzlEnaWS52hbCDNcCJYO5mRmWW7HRAnDc7am+N/5Lnd8MppSaTYx1Yg== dependencies: - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.0" is-plain-object "^3.0.0" universal-user-agent "^5.0.0" -"@octokit/graphql@4.5.0", "@octokit/graphql@^4.3.1": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.0.tgz#e111f841bc15722b1e9887f447fccab700cacdad" - integrity sha512-StJWfn0M1QfhL3NKBz31e1TdDNZrHLLS57J2hin92SIfzlOVBuUaRkp31AGkGOAFOAVtyEX6ZiZcsjcJDjeb5g== +"@octokit/graphql@4.5.1", "@octokit/graphql@^4.3.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.1.tgz#162aed1490320b88ce34775b3f6b8de945529fa9" + integrity sha512-qgMsROG9K2KxDs12CO3bySJaYoUu2aic90qpFrv7A8sEBzZ7UFGvdgPKiLw5gOPYEYbS0Xf8Tvf84tJutHPulQ== dependencies: "@octokit/request" "^5.3.0" - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.0" universal-user-agent "^5.0.0" "@octokit/plugin-paginate-rest@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.2.1.tgz#b95ec46c841d51e5e625f383c579d132ab216d05" - integrity sha512-/tHpIF2XpN40AyhIq295YRjb4g7Q5eKob0qM3thYJ0Z+CgmNsWKM/fWse/SUR8+LdprP1O4ZzSKQE+71TCwK+w== + version "2.2.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.2.3.tgz#a6ad4377e7e7832fb4bdd9d421e600cb7640ac27" + integrity sha512-eKTs91wXnJH8Yicwa30jz6DF50kAh7vkcqCQ9D7/tvBAP5KKkg6I2nNof8Mp/65G0Arjsb4QcOJcIEQY+rK1Rg== dependencies: - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.0" "@octokit/plugin-request-log@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== -"@octokit/plugin-rest-endpoint-methods@3.17.0": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz#d8ba04eb883849dd98666c55bf49d8c9fe7be055" - integrity sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg== +"@octokit/plugin-rest-endpoint-methods@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.0.0.tgz#b02a2006dda8e908c3f8ab381dd5475ef5a810a8" + integrity sha512-emS6gysz4E9BNi9IrCl7Pm4kR+Az3MmVB0/DoDCmF4U48NbYG3weKyDlgkrz6Jbl4Mu4nDx8YWZwC4HjoTdcCA== dependencies: - "@octokit/types" "^4.1.6" + "@octokit/types" "^5.0.0" deprecation "^2.3.1" "@octokit/request-error@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.1.tgz#49bd71e811daffd5bdd06ef514ca47b5039682d1" - integrity sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.2.tgz#0e76b83f5d8fdda1db99027ea5f617c2e6ba9ed0" + integrity sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw== dependencies: - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.1" deprecation "^2.0.0" once "^1.4.0" "@octokit/request@^5.3.0", "@octokit/request@^5.4.0": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.4.tgz#dc57e85e86284fa016d0c1a2701a70a10cec4ff2" - integrity sha512-vqv1lz41c6VTxUvF9nM+a6U+vvP3vGk7drDpr0DVQg4zyqlOiKVrY17DLD6de5okj+YLHKcoqaUZTBtlNZ1BtQ== + version "5.4.5" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.5.tgz#8df65bd812047521f7e9db6ff118c06ba84ac10b" + integrity sha512-atAs5GAGbZedvJXXdjtKljin+e2SltEs48B3naJjqWupYl2IUBbB/CJisyjbNHcKpHzb3E+OYEZ46G8eakXgQg== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.0" deprecation "^2.0.0" is-plain-object "^3.0.0" node-fetch "^2.3.0" once "^1.4.0" universal-user-agent "^5.0.0" -"@octokit/rest@17.11.0": - version "17.11.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-17.11.0.tgz#80db76d7d3442c998de5483575975f5591da84b8" - integrity sha512-WqXmm37uCGP1NxYxSc27hd5pYNLdksuUsjR8vaNS8fCy6kyxZFy+Dbh/AzqKGj2mOdbnt7dILoGHfzsA4IIm4A== +"@octokit/rest@18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.0.0.tgz#7f401d9ce13530ad743dfd519ae62ce49bcc0358" + integrity sha512-4G/a42lry9NFGuuECnua1R1eoKkdBYJap97jYbWDNYBOUboWcM75GJ1VIcfvwDV/pW0lMPs7CEmhHoVrSV5shg== dependencies: - "@octokit/core" "^2.4.3" + "@octokit/core" "^3.0.0" "@octokit/plugin-paginate-rest" "^2.2.0" "@octokit/plugin-request-log" "^1.0.0" - "@octokit/plugin-rest-endpoint-methods" "3.17.0" + "@octokit/plugin-rest-endpoint-methods" "4.0.0" -"@octokit/types@^4.0.1", "@octokit/types@^4.1.6": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.1.9.tgz#a3e1ff1a15637ab830fbab0268c2d7ca824bc969" - integrity sha512-hinM/BA2c1vebN2HSR3JtVdYtrSbmvn/doUBZXXuQuh/9o60hYwitQQAGTpJu+k6pjtjURskDHQxUFvqLvYCeA== +"@octokit/types@^5.0.0", "@octokit/types@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.0.1.tgz#5459e9a5e9df8565dcc62c17a34491904d71971e" + integrity sha512-GorvORVwp244fGKEt3cgt/P+M0MGy4xEDbckw+K5ojEezxyMDgCaYPKVct+/eWQfZXOT7uq0xRpmrl/+hliabA== dependencies: "@types/node" ">= 8" @@ -108,609 +108,20 @@ form-data "^3.0.0" "@types/node@*", "@types/node@>= 8": - version "14.0.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.12.tgz#9c1d8ffb8084e8936603a6122a7649e40e68e04b" - integrity sha512-/sjzehvjkkpvLpYtN6/2dv5kg41otMGuHQUt9T2aiAuIfleCQRQHXXzF1eAw/qkZTj5Kcf4JSTf7EIizHocy6Q== - -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -acorn@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== - -ajv@^6.1.0, ajv@^6.10.2: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" - integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + version "14.0.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce" + integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - before-after-hook@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== - -bn.js@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" - integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" - integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.2" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" - integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.4.0" - optionalDependencies: - fsevents "~2.1.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -718,100 +129,7 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@6.0.5, cross-spawn@^6.0.0: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -822,67 +140,6 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -893,141 +150,13 @@ deprecation@^2.0.0, deprecation@^2.3.1: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -elliptic@^6.0.0, elliptic@^6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -events@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -1041,131 +170,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -findup-sync@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - form-data@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" @@ -1175,59 +179,11 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - fuzzysort@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/fuzzysort/-/fuzzysort-1.1.4.tgz#a0510206ed44532cbb52cf797bf5a3cb12acd4ba" integrity sha512-JzK/lHjVZ6joAg3OnCjylwYXYVjRiwTY6Yb25LvfpJHK8bjisfnZJ5bY8aVWwTwCXgxPNgLAtmHL+Hs5q1ddLQ== -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -1235,567 +191,26 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -import-local@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -infer-owner@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.4, ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -interpret@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-plain-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" + integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -loader-utils@^1.2.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memory-fs@^0.4.0, memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" @@ -1808,108 +223,6 @@ mime-types@^2.1.12: dependencies: mime-db "1.44.0" -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1, mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -nan@^2.12.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -1920,47 +233,6 @@ node-fetch@2.6.0, node-fetch@^2.3.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -1968,55 +240,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-name@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" @@ -2025,174 +255,16 @@ os-name@^3.1.0: macos-release "^2.2.0" windows-release "^3.1.0" -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -2201,244 +273,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== - dependencies: - picomatch "^2.2.1" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -semver@^5.5.0, semver@^5.6.0: +semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -serialize-javascript@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" - integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -2456,298 +295,11 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -supports-color@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -terser-webpack-plugin@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" - integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^3.1.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2: - version "4.7.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006" - integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== - dependencies: - setimmediate "^1.0.4" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - universal-user-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" @@ -2755,151 +307,12 @@ universal-user-agent@^5.0.0: dependencies: os-name "^3.1.0" -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" +vscode-nls@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" + integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -v8-compile-cache@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" - integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" - integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.0" - watchpack-chokidar2 "^2.0.0" - -webpack-cli@3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" - integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== - dependencies: - chalk "2.4.2" - cross-spawn "6.0.5" - enhanced-resolve "4.1.0" - findup-sync "3.0.0" - global-modules "2.0.0" - import-local "2.0.0" - interpret "1.2.0" - loader-utils "1.2.3" - supports-color "6.1.0" - v8-compile-cache "2.0.3" - yargs "13.2.4" - -webpack-sources@^1.4.0, webpack-sources@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@4.43.0: - version "4.43.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" - integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.6.1" - webpack-sources "^1.4.1" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -2913,63 +326,7 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^13.1.0: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.0" diff --git a/extensions/github/src/auth.ts b/extensions/github/src/auth.ts index 4c7dd468ba3..b4afce01c96 100644 --- a/extensions/github/src/auth.ts +++ b/extensions/github/src/auth.ts @@ -27,21 +27,15 @@ function getAgent(url: string | undefined = process.env.HTTPS_PROXY): Agent { const scopes = ['repo', 'workflow']; export async function getSession(): Promise { - const authenticationSessions = await authentication.getSessions('github', scopes); - - if (authenticationSessions.length) { - return await authenticationSessions[0]; - } else { - return await authentication.login('github', scopes); - } + return await authentication.getSession('github', scopes, { createIfNone: true }); } let _octokit: Promise | undefined; export function getOctokit(): Promise { if (!_octokit) { - _octokit = getSession().then(async session => { - const token = await session.getAccessToken(); + _octokit = getSession().then(session => { + const token = session.accessToken; const agent = getAgent(); return new Octokit({ diff --git a/extensions/github/src/commands.ts b/extensions/github/src/commands.ts index a3f0903615f..dad2982533c 100644 --- a/extensions/github/src/commands.ts +++ b/extensions/github/src/commands.ts @@ -6,9 +6,10 @@ import * as vscode from 'vscode'; import { API as GitAPI } from './typings/git'; import { publishRepository } from './publish'; +import { combinedDisposable } from './util'; -export function registerCommands(gitAPI: GitAPI): vscode.Disposable[] { - const disposables = []; +export function registerCommands(gitAPI: GitAPI): vscode.Disposable { + const disposables: vscode.Disposable[] = []; disposables.push(vscode.commands.registerCommand('github.publish', async () => { try { @@ -18,5 +19,5 @@ export function registerCommands(gitAPI: GitAPI): vscode.Disposable[] { } })); - return disposables; + return combinedDisposable(disposables); } diff --git a/extensions/github/src/credentialProvider.ts b/extensions/github/src/credentialProvider.ts index 7105311966c..14c7e6a2c73 100644 --- a/extensions/github/src/credentialProvider.ts +++ b/extensions/github/src/credentialProvider.ts @@ -17,7 +17,7 @@ class GitHubCredentialProvider implements CredentialsProvider { } const session = await getSession(); - return { username: session.account.id, password: await session.getAccessToken() }; + return { username: session.account.id, password: session.accessToken }; } } diff --git a/extensions/github/src/extension.ts b/extensions/github/src/extension.ts index 15cf2544f1e..1d562a98c1f 100644 --- a/extensions/github/src/extension.ts +++ b/extensions/github/src/extension.ts @@ -3,17 +3,41 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as vscode from 'vscode'; +import { Disposable, ExtensionContext, extensions } from 'vscode'; import { GithubRemoteSourceProvider } from './remoteSourceProvider'; import { GitExtension } from './typings/git'; import { registerCommands } from './commands'; import { GithubCredentialProviderManager } from './credentialProvider'; +import { dispose, combinedDisposable } from './util'; -export async function activate(context: vscode.ExtensionContext) { - const gitExtension = vscode.extensions.getExtension('vscode.git')!.exports; - const gitAPI = gitExtension.getAPI(1); +export function activate(context: ExtensionContext): void { + const disposables = new Set(); + context.subscriptions.push(combinedDisposable(disposables)); - context.subscriptions.push(...registerCommands(gitAPI)); - context.subscriptions.push(gitAPI.registerRemoteSourceProvider(new GithubRemoteSourceProvider(gitAPI))); - context.subscriptions.push(new GithubCredentialProviderManager(gitAPI)); + const init = () => { + try { + const gitAPI = gitExtension.getAPI(1); + + disposables.add(registerCommands(gitAPI)); + disposables.add(gitAPI.registerRemoteSourceProvider(new GithubRemoteSourceProvider(gitAPI))); + disposables.add(new GithubCredentialProviderManager(gitAPI)); + } catch (err) { + console.error('Could not initialize GitHub extension'); + console.warn(err); + } + }; + + const onDidChangeGitExtensionEnablement = (enabled: boolean) => { + if (!enabled) { + dispose(disposables); + disposables.clear(); + } else { + init(); + } + }; + + + const gitExtension = extensions.getExtension('vscode.git')!.exports; + context.subscriptions.push(gitExtension.onDidChangeEnablement(onDidChangeGitExtensionEnablement)); + onDidChangeGitExtensionEnablement(gitExtension.enabled); } diff --git a/extensions/github/src/publish.ts b/extensions/github/src/publish.ts index 6926c421f9a..589bd0d3d3c 100644 --- a/extensions/github/src/publish.ts +++ b/extensions/github/src/publish.ts @@ -5,10 +5,10 @@ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; -import * as path from 'path'; -import { promises as fs } from 'fs'; import { API as GitAPI, Repository } from './typings/git'; import { getOctokit } from './auth'; +import { TextEncoder } from 'util'; +import { basename } from 'path'; const localize = nls.loadMessageBundle(); @@ -28,10 +28,12 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository) return; } - let folder: vscode.WorkspaceFolder; + let folder: vscode.Uri; - if (vscode.workspace.workspaceFolders.length === 1) { - folder = vscode.workspace.workspaceFolders[0]; + if (repository) { + folder = repository.rootUri; + } else if (vscode.workspace.workspaceFolders.length === 1) { + folder = vscode.workspace.workspaceFolders[0].uri; } else { const picks = vscode.workspace.workspaceFolders.map(folder => ({ label: folder.name, folder })); const placeHolder = localize('pick folder', "Pick a folder to publish to GitHub"); @@ -41,14 +43,14 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository) return; } - folder = pick.folder; + folder = pick.folder.uri; } let quickpick = vscode.window.createQuickPick(); quickpick.ignoreFocusOut = true; quickpick.placeholder = 'Repository Name'; - quickpick.value = folder.name; + quickpick.value = basename(folder.fsPath); quickpick.show(); quickpick.busy = true; @@ -97,37 +99,49 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository) return; } - quickpick = vscode.window.createQuickPick(); - quickpick.placeholder = localize('ignore', "Select which files should be included in the repository."); - quickpick.canSelectMany = true; - quickpick.show(); + if (!repository) { + const gitignore = vscode.Uri.joinPath(folder, '.gitignore'); + let shouldGenerateGitignore = false; - try { - quickpick.busy = true; - - const repositoryPath = folder.uri.fsPath; - const currentPath = path.join(repositoryPath); - const children = await fs.readdir(currentPath); - quickpick.items = children.map(name => ({ label: name })); - quickpick.selectedItems = quickpick.items; - quickpick.busy = false; - - const result = await Promise.race([ - new Promise(c => quickpick.onDidAccept(() => c(quickpick.selectedItems))), - new Promise(c => quickpick.onDidHide(() => c(undefined))) - ]); - - if (!result) { - return; + try { + await vscode.workspace.fs.stat(gitignore); + } catch (err) { + shouldGenerateGitignore = true; } - const ignored = new Set(children); - result.forEach(c => ignored.delete(c.label)); + if (shouldGenerateGitignore) { + quickpick = vscode.window.createQuickPick(); + quickpick.placeholder = localize('ignore', "Select which files should be included in the repository."); + quickpick.canSelectMany = true; + quickpick.show(); - const raw = [...ignored].map(i => `/${i}`).join('\n'); - await fs.writeFile(path.join(repositoryPath, '.gitignore'), raw, 'utf8'); - } finally { - quickpick.dispose(); + try { + quickpick.busy = true; + + const children = (await vscode.workspace.fs.readDirectory(folder)).map(([name]) => name); + quickpick.items = children.map(name => ({ label: name })); + quickpick.selectedItems = quickpick.items; + quickpick.busy = false; + + const result = await Promise.race([ + new Promise(c => quickpick.onDidAccept(() => c(quickpick.selectedItems))), + new Promise(c => quickpick.onDidHide(() => c(undefined))) + ]); + + if (!result) { + return; + } + + const ignored = new Set(children); + result.forEach(c => ignored.delete(c.label)); + + const raw = [...ignored].map(i => `/${i}`).join('\n'); + const encoder = new TextEncoder(); + await vscode.workspace.fs.writeFile(gitignore, encoder.encode(raw)); + } finally { + quickpick.dispose(); + } + } } const githubRepository = await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, cancellable: false, title: 'Publish to GitHub' }, async progress => { @@ -143,7 +157,7 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository) progress.report({ message: 'Creating first commit', increment: 25 }); if (!repository) { - repository = await gitAPI.init(folder.uri) || undefined; + repository = await gitAPI.init(folder) || undefined; if (!repository) { return; diff --git a/extensions/github/src/util.ts b/extensions/github/src/util.ts new file mode 100644 index 00000000000..60badd28c84 --- /dev/null +++ b/extensions/github/src/util.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; + +export function dispose(arg: vscode.Disposable | Iterable): void { + if (arg instanceof vscode.Disposable) { + arg.dispose(); + } else { + for (const disposable of arg) { + disposable.dispose(); + } + } +} + +export function combinedDisposable(disposables: Iterable): vscode.Disposable { + return { + dispose() { + dispose(disposables); + } + }; +} diff --git a/extensions/html-language-features/build/bundleTypeScriptLibraries.js b/extensions/html-language-features/build/bundleTypeScriptLibraries.js new file mode 100644 index 00000000000..9f06d25592f --- /dev/null +++ b/extensions/html-language-features/build/bundleTypeScriptLibraries.js @@ -0,0 +1,183 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const path = require('path'); +const fs = require('fs'); +const child_process = require('child_process'); + +const generatedNote = `// +// **NOTE**: Do not edit directly! This file is generated using \`npm run import-typescript\` +// +`; + +const TYPESCRIPT_LIB_SOURCE = path.join(__dirname, '../../node_modules/typescript/lib'); +const TYPESCRIPT_LIB_DESTINATION = path.join(__dirname, '../server/build'); + +(function () { + try { + fs.statSync(TYPESCRIPT_LIB_DESTINATION); + } catch (err) { + fs.mkdirSync(TYPESCRIPT_LIB_DESTINATION); + } + importLibs('es6'); +})(); + + +function importLibs(startLib) { + function getFileName(name) { + return (name === '' ? 'lib.d.ts' : `lib.${name}.d.ts`); + } + function getVariableName(name) { + return (name === '' ? 'lib_dts' : `lib_${name.replace(/\./g, '_')}_dts`); + } + function readLibFile(name) { + var srcPath = path.join(TYPESCRIPT_LIB_SOURCE, getFileName(name)); + return fs.readFileSync(srcPath).toString(); + } + + var queue = []; + var in_queue = {}; + + var enqueue = function (name) { + if (in_queue[name]) { + return; + } + in_queue[name] = true; + queue.push(name); + }; + + enqueue(startLib); + + var result = []; + while (queue.length > 0) { + var name = queue.shift(); + var contents = readLibFile(name); + var lines = contents.split(/\r\n|\r|\n/); + + var output = ''; + var writeOutput = function (text) { + if (output.length === 0) { + output = text; + } else { + output += ` + ${text}`; + } + }; + var outputLines = []; + var flushOutputLines = function () { + writeOutput(`"${escapeText(outputLines.join('\n'))}"`); + outputLines = []; + }; + var deps = []; + for (let i = 0; i < lines.length; i++) { + let m = lines[i].match(/\/\/\/\s* 0) { + for (let i = result.length - 1; i >= 0; i--) { + if (result[i].deps.length === 0) { + // emit this node + strResult += `\nexport const ${result[i].name}: string = ${result[i].output};\n`; + + // mark dep as resolved + for (let j = 0; j < result.length; j++) { + for (let k = 0; k < result[j].deps.length; k++) { + if (result[j].deps[k] === result[i].name) { + result[j].deps.splice(k, 1); + break; + } + } + } + + // remove from result + result.splice(i, 1); + break; + } + } + } + + var dstPath = path.join(TYPESCRIPT_LIB_DESTINATION, 'lib.ts'); + fs.writeFileSync(dstPath, strResult); +} + +/** + * Escape text such that it can be used in a javascript string enclosed by double quotes (") + */ +function escapeText(text) { + // See http://www.javascriptkit.com/jsref/escapesequence.shtml + var _backspace = '\b'.charCodeAt(0); + var _formFeed = '\f'.charCodeAt(0); + var _newLine = '\n'.charCodeAt(0); + var _nullChar = 0; + var _carriageReturn = '\r'.charCodeAt(0); + var _tab = '\t'.charCodeAt(0); + var _verticalTab = '\v'.charCodeAt(0); + var _backslash = '\\'.charCodeAt(0); + var _doubleQuote = '"'.charCodeAt(0); + + var startPos = 0, chrCode, replaceWith = null, resultPieces = []; + + for (var i = 0, len = text.length; i < len; i++) { + chrCode = text.charCodeAt(i); + switch (chrCode) { + case _backspace: + replaceWith = '\\b'; + break; + case _formFeed: + replaceWith = '\\f'; + break; + case _newLine: + replaceWith = '\\n'; + break; + case _nullChar: + replaceWith = '\\0'; + break; + case _carriageReturn: + replaceWith = '\\r'; + break; + case _tab: + replaceWith = '\\t'; + break; + case _verticalTab: + replaceWith = '\\v'; + break; + case _backslash: + replaceWith = '\\\\'; + break; + case _doubleQuote: + replaceWith = '\\"'; + break; + } + if (replaceWith !== null) { + resultPieces.push(text.substring(startPos, i)); + resultPieces.push(replaceWith); + startPos = i + 1; + replaceWith = null; + } + } + resultPieces.push(text.substring(startPos, len)); + return resultPieces.join(''); +} diff --git a/extensions/html-language-features/client/src/browser/htmlClientMain.ts b/extensions/html-language-features/client/src/browser/htmlClientMain.ts new file mode 100644 index 00000000000..1623bea9e20 --- /dev/null +++ b/extensions/html-language-features/client/src/browser/htmlClientMain.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ExtensionContext } from 'vscode'; +import { LanguageClientOptions } from 'vscode-languageclient'; +import { startClient, LanguageClientConstructor } from '../htmlClient'; +import { LanguageClient } from 'vscode-languageclient/browser'; + +declare const Worker: { + new(stringUrl: string): any; +}; +declare const TextDecoder: { + new(encoding?: string): { decode(buffer: ArrayBuffer): string; }; +}; + +// this method is called when vs code is activated +export function activate(context: ExtensionContext) { + const serverMain = context.asAbsolutePath('server/dist/browser/htmlServerMain.js'); + try { + const worker = new Worker(serverMain); + const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { + return new LanguageClient(id, name, clientOptions, worker); + }; + + startClient(context, newLanguageClient, { TextDecoder }); + + } catch (e) { + console.log(e); + } +} diff --git a/extensions/html-language-features/client/src/customData.ts b/extensions/html-language-features/client/src/customData.ts index 38b51d37596..ecf964056e5 100644 --- a/extensions/html-language-features/client/src/customData.ts +++ b/extensions/html-language-features/client/src/customData.ts @@ -3,55 +3,86 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as path from 'path'; -import { workspace, WorkspaceFolder, extensions } from 'vscode'; +import { workspace, extensions, Uri, EventEmitter, Disposable } from 'vscode'; +import { resolvePath, joinPath } from './requests'; -interface ExperimentalConfig { - customData?: string[]; - experimental?: { - customData?: string[]; +export function getCustomDataSource(toDispose: Disposable[]) { + let pathsInWorkspace = getCustomDataPathsInAllWorkspaces(); + let pathsInExtensions = getCustomDataPathsFromAllExtensions(); + + const onChange = new EventEmitter(); + + toDispose.push(extensions.onDidChange(_ => { + const newPathsInExtensions = getCustomDataPathsFromAllExtensions(); + if (newPathsInExtensions.length !== pathsInExtensions.length || !newPathsInExtensions.every((val, idx) => val === pathsInExtensions[idx])) { + pathsInExtensions = newPathsInExtensions; + onChange.fire(); + } + })); + toDispose.push(workspace.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('html.customData')) { + pathsInWorkspace = getCustomDataPathsInAllWorkspaces(); + onChange.fire(); + } + })); + + return { + get uris() { + return pathsInWorkspace.concat(pathsInExtensions); + }, + get onDidChange() { + return onChange.event; + } }; } -export function getCustomDataPathsInAllWorkspaces(workspaceFolders: readonly WorkspaceFolder[] | undefined): string[] { + +function getCustomDataPathsInAllWorkspaces(): string[] { + const workspaceFolders = workspace.workspaceFolders; + const dataPaths: string[] = []; if (!workspaceFolders) { return dataPaths; } - workspaceFolders.forEach(wf => { - const allHtmlConfig = workspace.getConfiguration(undefined, wf.uri); - const wfHtmlConfig = allHtmlConfig.inspect('html'); - - if (wfHtmlConfig && wfHtmlConfig.workspaceFolderValue && wfHtmlConfig.workspaceFolderValue.customData) { - const customData = wfHtmlConfig.workspaceFolderValue.customData; - if (Array.isArray(customData)) { - customData.forEach(t => { - if (typeof t === 'string') { - dataPaths.push(path.resolve(wf.uri.fsPath, t)); - } - }); + const collect = (paths: string[] | undefined, rootFolder: Uri) => { + if (Array.isArray(paths)) { + for (const path of paths) { + if (typeof path === 'string') { + dataPaths.push(resolvePath(rootFolder, path).toString()); + } } } - }); + }; + for (let i = 0; i < workspaceFolders.length; i++) { + const folderUri = workspaceFolders[i].uri; + const allHtmlConfig = workspace.getConfiguration('html', folderUri); + const customDataInspect = allHtmlConfig.inspect('customData'); + if (customDataInspect) { + collect(customDataInspect.workspaceFolderValue, folderUri); + if (i === 0) { + if (workspace.workspaceFile) { + collect(customDataInspect.workspaceValue, workspace.workspaceFile); + } + collect(customDataInspect.globalValue, folderUri); + } + } + + } return dataPaths; } -export function getCustomDataPathsFromAllExtensions(): string[] { +function getCustomDataPathsFromAllExtensions(): string[] { const dataPaths: string[] = []; - for (const extension of extensions.all) { - const contributes = extension.packageJSON && extension.packageJSON.contributes; - - if (contributes && contributes.html && contributes.html.customData && Array.isArray(contributes.html.customData)) { - const relativePaths: string[] = contributes.html.customData; - relativePaths.forEach(rp => { - dataPaths.push(path.resolve(extension.extensionPath, rp)); - }); + const customData = extension.packageJSON?.contributes?.html?.customData; + if (Array.isArray(customData)) { + for (const rp of customData) { + dataPaths.push(joinPath(extension.extensionUri, rp).toString()); + } } } - return dataPaths; } diff --git a/extensions/html-language-features/client/src/htmlMain.ts b/extensions/html-language-features/client/src/htmlClient.ts similarity index 84% rename from extensions/html-language-features/client/src/htmlMain.ts rename to extensions/html-language-features/client/src/htmlClient.ts index 913b43378b0..e818d1a2d02 100644 --- a/extensions/html-language-features/client/src/htmlMain.ts +++ b/extensions/html-language-features/client/src/htmlClient.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as fs from 'fs'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); @@ -13,13 +12,17 @@ import { DocumentSemanticTokensProvider, DocumentRangeSemanticTokensProvider, SemanticTokens, window, commands } from 'vscode'; import { - LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, RequestType, TextDocumentPositionParams, DocumentRangeFormattingParams, - DocumentRangeFormattingRequest, ProvideCompletionItemsSignature, TextDocumentIdentifier, RequestType0, Range as LspRange + LanguageClientOptions, RequestType, TextDocumentPositionParams, DocumentRangeFormattingParams, + DocumentRangeFormattingRequest, ProvideCompletionItemsSignature, TextDocumentIdentifier, RequestType0, Range as LspRange, NotificationType, CommonLanguageClient } from 'vscode-languageclient'; import { EMPTY_ELEMENTS } from './htmlEmptyTagsShared'; import { activateTagClosing } from './tagClosing'; -import TelemetryReporter from 'vscode-extension-telemetry'; -import { getCustomDataPathsInAllWorkspaces, getCustomDataPathsFromAllExtensions } from './customData'; +import { RequestService } from './requests'; +import { getCustomDataSource } from './customData'; + +namespace CustomDataChangedNotification { + export const type: NotificationType = new NotificationType('html/customDataChanged'); +} namespace TagCloseRequest { export const type: RequestType = new RequestType('html/tag'); @@ -46,44 +49,33 @@ namespace SettingIds { } -interface IPackageInfo { - name: string; - version: string; - aiKey: string; - main: string; +export interface TelemetryReporter { + sendTelemetryEvent(eventName: string, properties?: { + [key: string]: string; + }, measurements?: { + [key: string]: number; + }): void; } -let telemetryReporter: TelemetryReporter | null; +export type LanguageClientConstructor = (name: string, description: string, clientOptions: LanguageClientOptions) => CommonLanguageClient; +export interface Runtime { + TextDecoder: { new(encoding?: string): { decode(buffer: ArrayBuffer): string; } }; + fs?: RequestService; + telemetry?: TelemetryReporter; +} + +export function startClient(context: ExtensionContext, newLanguageClient: LanguageClientConstructor, runtime: Runtime) { -export function activate(context: ExtensionContext) { let toDispose = context.subscriptions; - let clientPackageJSON = getPackageInfo(context); - telemetryReporter = new TelemetryReporter(clientPackageJSON.name, clientPackageJSON.version, clientPackageJSON.aiKey); - - const serverMain = `./server/${clientPackageJSON.main.indexOf('/dist/') !== -1 ? 'dist' : 'out'}/htmlServerMain`; - const serverModule = context.asAbsolutePath(serverMain); - - // The debug options for the server - let debugOptions = { execArgv: ['--nolazy', '--inspect=6045'] }; - - // If the extension is launch in debug mode the debug server options are use - // Otherwise the run options are used - let serverOptions: ServerOptions = { - run: { module: serverModule, transport: TransportKind.ipc }, - debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } - }; let documentSelector = ['html', 'handlebars']; let embeddedLanguages = { css: true, javascript: true }; let rangeFormatting: Disposable | undefined = undefined; - let dataPaths = [ - ...getCustomDataPathsInAllWorkspaces(workspace.workspaceFolders), - ...getCustomDataPathsFromAllExtensions() - ]; + const customDataSource = getCustomDataSource(context.subscriptions); // Options to control the language client let clientOptions: LanguageClientOptions = { @@ -93,7 +85,7 @@ export function activate(context: ExtensionContext) { }, initializationOptions: { embeddedLanguages, - dataPaths, + handledSchemas: ['file'], provideFormatter: false, // tell the server to not provide formatting capability and ignore the `html.format.enable` setting. }, middleware: { @@ -123,12 +115,18 @@ export function activate(context: ExtensionContext) { }; // Create the language client and start the client. - let client = new LanguageClient('html', localize('htmlserver.name', 'HTML Language Server'), serverOptions, clientOptions); + let client = newLanguageClient('html', localize('htmlserver.name', 'HTML Language Server'), clientOptions); client.registerProposedFeatures(); let disposable = client.start(); toDispose.push(disposable); client.onReady().then(() => { + + client.sendNotification(CustomDataChangedNotification.type, customDataSource.uris); + customDataSource.onDidChange(() => { + client.sendNotification(CustomDataChangedNotification.type, customDataSource.uris); + }); + let tagRequestor = (document: TextDocument, position: Position) => { let param = client.code2ProtocolConverter.asTextDocumentPositionParams(document, position); return client.sendRequest(TagCloseRequest.type, param); @@ -137,9 +135,7 @@ export function activate(context: ExtensionContext) { toDispose.push(disposable); disposable = client.onTelemetry(e => { - if (telemetryReporter) { - telemetryReporter.sendTelemetryEvent(e.key, e.data); - } + runtime.telemetry?.sendTelemetryEvent(e.key, e.data); }); toDispose.push(disposable); @@ -201,7 +197,7 @@ export function activate(context: ExtensionContext) { return client.sendRequest(DocumentRangeFormattingRequest.type, params, token).then( client.protocol2CodeConverter.asTextEdits, (error) => { - client.logFailedRequest(DocumentRangeFormattingRequest.type, error); + client.handleFailedRequest(DocumentRangeFormattingRequest.type, error, []); return Promise.resolve([]); } ); @@ -319,17 +315,3 @@ export function activate(context: ExtensionContext) { toDispose.push(); } - -function getPackageInfo(context: ExtensionContext): IPackageInfo { - const location = context.asAbsolutePath('./package.json'); - try { - return JSON.parse(fs.readFileSync(location).toString()); - } catch (e) { - console.log(`Problems reading ${location}: ${e}`); - return { name: '', version: '', aiKey: '', main: '' }; - } -} - -export function deactivate(): Promise { - return telemetryReporter ? telemetryReporter.dispose() : Promise.resolve(null); -} diff --git a/extensions/html-language-features/client/src/node/htmlClientMain.ts b/extensions/html-language-features/client/src/node/htmlClientMain.ts new file mode 100644 index 00000000000..c58515b3712 --- /dev/null +++ b/extensions/html-language-features/client/src/node/htmlClientMain.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { getNodeFSRequestService } from './nodeFs'; +import { ExtensionContext } from 'vscode'; +import { startClient, LanguageClientConstructor } from '../htmlClient'; +import { ServerOptions, TransportKind, LanguageClientOptions, LanguageClient } from 'vscode-languageclient/node'; +import { TextDecoder } from 'util'; +import * as fs from 'fs'; +import TelemetryReporter from 'vscode-extension-telemetry'; + + +let telemetry: TelemetryReporter | undefined; + +// this method is called when vs code is activated +export function activate(context: ExtensionContext) { + + let clientPackageJSON = getPackageInfo(context); + telemetry = new TelemetryReporter(clientPackageJSON.name, clientPackageJSON.version, clientPackageJSON.aiKey); + + const serverMain = `./server/${clientPackageJSON.main.indexOf('/dist/') !== -1 ? 'dist' : 'out'}/node/htmlServerMain`; + const serverModule = context.asAbsolutePath(serverMain); + + // The debug options for the server + const debugOptions = { execArgv: ['--nolazy', '--inspect=6044'] }; + + // If the extension is launch in debug mode the debug server options are use + // Otherwise the run options are used + const serverOptions: ServerOptions = { + run: { module: serverModule, transport: TransportKind.ipc }, + debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } + }; + + const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { + return new LanguageClient(id, name, serverOptions, clientOptions); + }; + + startClient(context, newLanguageClient, { fs: getNodeFSRequestService(), TextDecoder, telemetry }); +} + +interface IPackageInfo { + name: string; + version: string; + aiKey: string; + main: string; +} + +function getPackageInfo(context: ExtensionContext): IPackageInfo { + const location = context.asAbsolutePath('./package.json'); + try { + return JSON.parse(fs.readFileSync(location).toString()); + } catch (e) { + console.log(`Problems reading ${location}: ${e}`); + return { name: '', version: '', aiKey: '', main: '' }; + } +} diff --git a/extensions/html-language-features/client/src/node/nodeFs.ts b/extensions/html-language-features/client/src/node/nodeFs.ts new file mode 100644 index 00000000000..c13ef2e1c08 --- /dev/null +++ b/extensions/html-language-features/client/src/node/nodeFs.ts @@ -0,0 +1,85 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as fs from 'fs'; +import { Uri } from 'vscode'; +import { getScheme, RequestService, FileType } from '../requests'; + +export function getNodeFSRequestService(): RequestService { + function ensureFileUri(location: string) { + if (getScheme(location) !== 'file') { + throw new Error('fileRequestService can only handle file URLs'); + } + } + return { + getContent(location: string, encoding?: string) { + ensureFileUri(location); + return new Promise((c, e) => { + const uri = Uri.parse(location); + fs.readFile(uri.fsPath, encoding, (err, buf) => { + if (err) { + return e(err); + } + c(buf.toString()); + + }); + }); + }, + stat(location: string) { + ensureFileUri(location); + return new Promise((c, e) => { + const uri = Uri.parse(location); + fs.stat(uri.fsPath, (err, stats) => { + if (err) { + if (err.code === 'ENOENT') { + return c({ type: FileType.Unknown, ctime: -1, mtime: -1, size: -1 }); + } else { + return e(err); + } + } + + let type = FileType.Unknown; + if (stats.isFile()) { + type = FileType.File; + } else if (stats.isDirectory()) { + type = FileType.Directory; + } else if (stats.isSymbolicLink()) { + type = FileType.SymbolicLink; + } + + c({ + type, + ctime: stats.ctime.getTime(), + mtime: stats.mtime.getTime(), + size: stats.size + }); + }); + }); + }, + readDirectory(location: string) { + ensureFileUri(location); + return new Promise((c, e) => { + const path = Uri.parse(location).fsPath; + + fs.readdir(path, { withFileTypes: true }, (err, children) => { + if (err) { + return e(err); + } + c(children.map(stat => { + if (stat.isSymbolicLink()) { + return [stat.name, FileType.SymbolicLink]; + } else if (stat.isDirectory()) { + return [stat.name, FileType.Directory]; + } else if (stat.isFile()) { + return [stat.name, FileType.File]; + } else { + return [stat.name, FileType.Unknown]; + } + })); + }); + }); + } + }; +} diff --git a/extensions/html-language-features/client/src/requests.ts b/extensions/html-language-features/client/src/requests.ts new file mode 100644 index 00000000000..ac966636314 --- /dev/null +++ b/extensions/html-language-features/client/src/requests.ts @@ -0,0 +1,148 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Uri, workspace } from 'vscode'; +import { RequestType, CommonLanguageClient } from 'vscode-languageclient'; +import { Runtime } from './htmlClient'; + +export namespace FsContentRequest { + export const type: RequestType<{ uri: string; encoding?: string; }, string, any, any> = new RequestType('fs/content'); +} +export namespace FsStatRequest { + export const type: RequestType = new RequestType('fs/stat'); +} + +export namespace FsReadDirRequest { + export const type: RequestType = new RequestType('fs/readDir'); +} + +export function serveFileSystemRequests(client: CommonLanguageClient, runtime: Runtime) { + client.onRequest(FsContentRequest.type, (param: { uri: string; encoding?: string; }) => { + const uri = Uri.parse(param.uri); + if (uri.scheme === 'file' && runtime.fs) { + return runtime.fs.getContent(param.uri); + } + return workspace.fs.readFile(uri).then(buffer => { + return new runtime.TextDecoder(param.encoding).decode(buffer); + }); + }); + client.onRequest(FsReadDirRequest.type, (uriString: string) => { + const uri = Uri.parse(uriString); + if (uri.scheme === 'file' && runtime.fs) { + return runtime.fs.readDirectory(uriString); + } + return workspace.fs.readDirectory(uri); + }); + client.onRequest(FsStatRequest.type, (uriString: string) => { + const uri = Uri.parse(uriString); + if (uri.scheme === 'file' && runtime.fs) { + return runtime.fs.stat(uriString); + } + return workspace.fs.stat(uri); + }); +} + +export enum FileType { + /** + * The file type is unknown. + */ + Unknown = 0, + /** + * A regular file. + */ + File = 1, + /** + * A directory. + */ + Directory = 2, + /** + * A symbolic link to a file. + */ + SymbolicLink = 64 +} +export interface FileStat { + /** + * The type of the file, e.g. is a regular file, a directory, or symbolic link + * to a file. + */ + type: FileType; + /** + * The creation timestamp in milliseconds elapsed since January 1, 1970 00:00:00 UTC. + */ + ctime: number; + /** + * The modification timestamp in milliseconds elapsed since January 1, 1970 00:00:00 UTC. + */ + mtime: number; + /** + * The size in bytes. + */ + size: number; +} + +export interface RequestService { + getContent(uri: string, encoding?: string): Promise; + + stat(uri: string): Promise; + readDirectory(uri: string): Promise<[string, FileType][]>; +} + +export function getScheme(uri: string) { + return uri.substr(0, uri.indexOf(':')); +} + +export function dirname(uri: string) { + const lastIndexOfSlash = uri.lastIndexOf('/'); + return lastIndexOfSlash !== -1 ? uri.substr(0, lastIndexOfSlash) : ''; +} + +export function basename(uri: string) { + const lastIndexOfSlash = uri.lastIndexOf('/'); + return uri.substr(lastIndexOfSlash + 1); +} + +const Slash = '/'.charCodeAt(0); +const Dot = '.'.charCodeAt(0); + +export function isAbsolutePath(path: string) { + return path.charCodeAt(0) === Slash; +} + +export function resolvePath(uri: Uri, path: string): Uri { + if (isAbsolutePath(path)) { + return uri.with({ path: normalizePath(path.split('/')) }); + } + return joinPath(uri, path); +} + +export function normalizePath(parts: string[]): string { + const newParts: string[] = []; + for (const part of parts) { + if (part.length === 0 || part.length === 1 && part.charCodeAt(0) === Dot) { + // ignore + } else if (part.length === 2 && part.charCodeAt(0) === Dot && part.charCodeAt(1) === Dot) { + newParts.pop(); + } else { + newParts.push(part); + } + } + if (parts.length > 1 && parts[parts.length - 1].length === 0) { + newParts.push(''); + } + let res = newParts.join('/'); + if (parts[0].length === 0) { + res = '/' + res; + } + return res; +} + + +export function joinPath(uri: Uri, ...paths: string[]): Uri { + const parts = uri.path.split('/'); + for (let path of paths) { + parts.push(...path.split('/')); + } + return uri.with({ path: normalizePath(parts) }); +} diff --git a/extensions/html-language-features/extension-browser.webpack.config.js b/extensions/html-language-features/extension-browser.webpack.config.js new file mode 100644 index 00000000000..9988ab826aa --- /dev/null +++ b/extensions/html-language-features/extension-browser.webpack.config.js @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withBrowserDefaults = require('../shared.webpack.config').browser; +const path = require('path'); + +module.exports = withBrowserDefaults({ + context: path.join(__dirname, 'client'), + entry: { + extension: './src/browser/htmlClientMain.ts' + }, + output: { + filename: 'htmlClientMain.js', + path: path.join(__dirname, 'client', 'dist', 'browser') + } +}); diff --git a/extensions/html-language-features/extension.webpack.config.js b/extensions/html-language-features/extension.webpack.config.js index 9624295ff5b..6af444db930 100644 --- a/extensions/html-language-features/extension.webpack.config.js +++ b/extensions/html-language-features/extension.webpack.config.js @@ -13,10 +13,10 @@ const path = require('path'); module.exports = withDefaults({ context: path.join(__dirname, 'client'), entry: { - extension: './src/htmlMain.ts', + extension: './src/node/htmlClientMain.ts', }, output: { - filename: 'htmlMain.js', - path: path.join(__dirname, 'client', 'dist') + filename: 'htmlClientMain.js', + path: path.join(__dirname, 'client', 'dist', 'node') } }); diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index c86a74e2cc0..e3cf08de8ca 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -15,7 +15,8 @@ "onLanguage:html", "onLanguage:handlebars" ], - "main": "./client/out/htmlMain", + "main": "./client/out/node/htmlClientMain", + "browser": "./client/dist/browser/htmlClientMain", "scripts": { "compile": "npx gulp compile-extension:html-language-features-client compile-extension:html-language-features-server", "watch": "npx gulp watch-extension:html-language-features-client watch-extension:html-language-features-server", @@ -202,7 +203,7 @@ }, "dependencies": { "vscode-extension-telemetry": "0.1.1", - "vscode-languageclient": "^6.1.3", + "vscode-languageclient": "7.0.0-next.5.1", "vscode-nls": "^4.1.2" }, "devDependencies": { diff --git a/extensions/html-language-features/server/build/javaScriptLibraryLoader.js b/extensions/html-language-features/server/build/javaScriptLibraryLoader.js new file mode 100644 index 00000000000..85792138ba4 --- /dev/null +++ b/extensions/html-language-features/server/build/javaScriptLibraryLoader.js @@ -0,0 +1,132 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// a webpack loader that bundles all library definitions (d.ts) for the embedded JavaScript engine. + +const path = require('path'); +const fs = require('fs'); + +const TYPESCRIPT_LIB_SOURCE = path.join(__dirname, '../../../node_modules/typescript/lib'); +const JQUERY_DTS = path.join(__dirname, '../lib/jquery.d.ts'); + +module.exports = function () { + function getFileName(name) { + return (name === '' ? 'lib.d.ts' : `lib.${name}.d.ts`); + } + function readLibFile(name) { + var srcPath = path.join(TYPESCRIPT_LIB_SOURCE, getFileName(name)); + return fs.readFileSync(srcPath).toString(); + } + + var queue = []; + var in_queue = {}; + + var enqueue = function (name) { + if (in_queue[name]) { + return; + } + in_queue[name] = true; + queue.push(name); + }; + + enqueue('es6'); + + var result = []; + while (queue.length > 0) { + var name = queue.shift(); + var contents = readLibFile(name); + var lines = contents.split(/\r\n|\r|\n/); + + var outputLines = []; + for (let i = 0; i < lines.length; i++) { + let m = lines[i].match(/\/\/\/\s*= 0; i--) { + strResult += `"${result[i].name}": ${result[i].output},\n`; + } + strResult += `\n};` + + strResult += `export function loadLibrary(name: string) : string {\n return libs[name] || ''; \n}`; + + return strResult; +} + +/** + * Escape text such that it can be used in a javascript string enclosed by double quotes (") + */ +function escapeText(text) { + // See http://www.javascriptkit.com/jsref/escapesequence.shtml + var _backspace = '\b'.charCodeAt(0); + var _formFeed = '\f'.charCodeAt(0); + var _newLine = '\n'.charCodeAt(0); + var _nullChar = 0; + var _carriageReturn = '\r'.charCodeAt(0); + var _tab = '\t'.charCodeAt(0); + var _verticalTab = '\v'.charCodeAt(0); + var _backslash = '\\'.charCodeAt(0); + var _doubleQuote = '"'.charCodeAt(0); + + var startPos = 0, chrCode, replaceWith = null, resultPieces = []; + + for (var i = 0, len = text.length; i < len; i++) { + chrCode = text.charCodeAt(i); + switch (chrCode) { + case _backspace: + replaceWith = '\\b'; + break; + case _formFeed: + replaceWith = '\\f'; + break; + case _newLine: + replaceWith = '\\n'; + break; + case _nullChar: + replaceWith = '\\0'; + break; + case _carriageReturn: + replaceWith = '\\r'; + break; + case _tab: + replaceWith = '\\t'; + break; + case _verticalTab: + replaceWith = '\\v'; + break; + case _backslash: + replaceWith = '\\\\'; + break; + case _doubleQuote: + replaceWith = '\\"'; + break; + } + if (replaceWith !== null) { + resultPieces.push(text.substring(startPos, i)); + resultPieces.push(replaceWith); + startPos = i + 1; + replaceWith = null; + } + } + resultPieces.push(text.substring(startPos, len)); + return resultPieces.join(''); +} diff --git a/extensions/html-language-features/server/extension-browser.webpack.config.js b/extensions/html-language-features/server/extension-browser.webpack.config.js new file mode 100644 index 00000000000..ae024e8d7dd --- /dev/null +++ b/extensions/html-language-features/server/extension-browser.webpack.config.js @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withBrowserDefaults = require('../../shared.webpack.config').browser; +const path = require('path'); + +const serverConfig = withBrowserDefaults({ + context: __dirname, + entry: { + extension: './src/browser/htmlServerMain.ts', + }, + output: { + filename: 'htmlServerMain.js', + path: path.join(__dirname, 'dist', 'browser'), + libraryTarget: 'var' + }, + optimization: { + splitChunks: { + chunks: 'async' + } + } +}); +serverConfig.module.noParse = /typescript[\/\\]lib[\/\\]typescript\.js/; +serverConfig.module.rules.push({ + test: /javascriptLibs.ts$/, + use: [ + { + loader: path.resolve(__dirname, 'build', 'javaScriptLibraryLoader.js') + } + ] +}); + +module.exports = serverConfig; diff --git a/extensions/html-language-features/server/extension.webpack.config.js b/extensions/html-language-features/server/extension.webpack.config.js index 77b86e718b1..33cb0b4f0a1 100644 --- a/extensions/html-language-features/server/extension.webpack.config.js +++ b/extensions/html-language-features/server/extension.webpack.config.js @@ -13,11 +13,11 @@ const path = require('path'); module.exports = withDefaults({ context: path.join(__dirname), entry: { - extension: './src/htmlServerMain.ts', + extension: './src/node/htmlServerMain.ts', }, output: { filename: 'htmlServerMain.js', - path: path.join(__dirname, 'dist'), + path: path.join(__dirname, 'dist', 'node'), }, externals: { 'typescript': 'commonjs typescript' diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index 70665bf8497..d7e2a8b28fb 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -7,11 +7,11 @@ "engines": { "node": "*" }, - "main": "./out/htmlServerMain", + "main": "./out/node/htmlServerMain", "dependencies": { - "vscode-css-languageservice": "^4.1.2", - "vscode-html-languageservice": "^3.1.0-next.2", - "vscode-languageserver": "^6.1.1", + "vscode-css-languageservice": "^4.3.0", + "vscode-html-languageservice": "^3.1.0", + "vscode-languageserver": "7.0.0-next.3", "vscode-nls": "^4.1.2", "vscode-uri": "^2.1.2" }, diff --git a/extensions/html-language-features/server/src/browser/htmlServerMain.ts b/extensions/html-language-features/server/src/browser/htmlServerMain.ts new file mode 100644 index 00000000000..1d38d33db37 --- /dev/null +++ b/extensions/html-language-features/server/src/browser/htmlServerMain.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createConnection, BrowserMessageReader, BrowserMessageWriter } from 'vscode-languageserver/browser'; +import { startServer } from '../htmlServer'; + +declare let self: any; + +const messageReader = new BrowserMessageReader(self); +const messageWriter = new BrowserMessageWriter(self); + +const connection = createConnection(messageReader, messageWriter); + +startServer(connection, {}); diff --git a/extensions/html-language-features/server/src/customData.ts b/extensions/html-language-features/server/src/customData.ts index 1d550eddf9f..3ef347a23d2 100644 --- a/extensions/html-language-features/server/src/customData.ts +++ b/extensions/html-language-features/server/src/customData.ts @@ -4,26 +4,35 @@ *--------------------------------------------------------------------------------------------*/ import { IHTMLDataProvider, newHTMLDataProvider } from 'vscode-html-languageservice'; -import * as fs from 'fs'; +import { RequestService } from './requests'; -export function getDataProviders(dataPaths?: string[]): IHTMLDataProvider[] { - if (!dataPaths) { - return []; - } - - const providers: IHTMLDataProvider[] = []; - - dataPaths.forEach((path, i) => { +export function fetchHTMLDataProviders(dataPaths: string[], requestService: RequestService): Promise { + const providers = dataPaths.map(async p => { try { - if (fs.existsSync(path)) { - const htmlData = JSON.parse(fs.readFileSync(path, 'utf-8')); - - providers.push(newHTMLDataProvider(`customProvider${i}`, htmlData)); - } - } catch (err) { - console.log(`Failed to load tag from ${path}`); + const content = await requestService.getContent(p); + return parseHTMLData(p, content); + } catch (e) { + return newHTMLDataProvider(p, { version: 1 }); } }); - return providers; -} \ No newline at end of file + return Promise.all(providers); +} + +function parseHTMLData(id: string, source: string): IHTMLDataProvider { + let rawData: any; + + try { + rawData = JSON.parse(source); + } catch (err) { + return newHTMLDataProvider(id, { version: 1 }); + } + + return newHTMLDataProvider(id, { + version: rawData.version || 1, + tags: rawData.tags || [], + globalAttributes: rawData.globalAttributes || [], + valueSets: rawData.valueSets || [] + }); +} + diff --git a/extensions/html-language-features/server/src/htmlServer.ts b/extensions/html-language-features/server/src/htmlServer.ts new file mode 100644 index 00000000000..ade37f22533 --- /dev/null +++ b/extensions/html-language-features/server/src/htmlServer.ts @@ -0,0 +1,559 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { + Connection, TextDocuments, InitializeParams, InitializeResult, RequestType, + DocumentRangeFormattingRequest, Disposable, DocumentSelector, TextDocumentPositionParams, ServerCapabilities, + ConfigurationRequest, ConfigurationParams, DidChangeWorkspaceFoldersNotification, + DocumentColorRequest, ColorPresentationRequest, TextDocumentSyncKind, NotificationType +} from 'vscode-languageserver'; +import { + getLanguageModes, LanguageModes, Settings, TextDocument, Position, Diagnostic, WorkspaceFolder, ColorInformation, + Range, DocumentLink, SymbolInformation, TextDocumentIdentifier +} from './modes/languageModes'; + +import { format } from './modes/formatting'; +import { pushAll } from './utils/arrays'; +import { getDocumentContext } from './utils/documentContext'; +import { URI } from 'vscode-uri'; +import { formatError, runSafe } from './utils/runner'; + +import { getFoldingRanges } from './modes/htmlFolding'; +import { fetchHTMLDataProviders } from './customData'; +import { getSelectionRanges } from './modes/selectionRanges'; +import { SemanticTokenProvider, newSemanticTokenProvider } from './modes/semanticTokens'; +import { RequestService, getRequestService } from './requests'; + +namespace CustomDataChangedNotification { + export const type: NotificationType = new NotificationType('html/customDataChanged'); +} + +namespace TagCloseRequest { + export const type: RequestType = new RequestType('html/tag'); +} +namespace OnTypeRenameRequest { + export const type: RequestType = new RequestType('html/onTypeRename'); +} + +// experimental: semantic tokens +interface SemanticTokenParams { + textDocument: TextDocumentIdentifier; + ranges?: Range[]; +} +namespace SemanticTokenRequest { + export const type: RequestType = new RequestType('html/semanticTokens'); +} +namespace SemanticTokenLegendRequest { + export const type: RequestType = new RequestType('html/semanticTokenLegend'); +} + +export interface RuntimeEnvironment { + file?: RequestService; + http?: RequestService + configureHttpRequests?(proxy: string, strictSSL: boolean): void; +} + +export function startServer(connection: Connection, runtime: RuntimeEnvironment) { + + // Create a text document manager. + const documents = new TextDocuments(TextDocument); + // Make the text document manager listen on the connection + // for open, change and close text document events + documents.listen(connection); + + let workspaceFolders: WorkspaceFolder[] = []; + + let languageModes: LanguageModes; + + let clientSnippetSupport = false; + let dynamicFormatterRegistration = false; + let scopedSettingsSupport = false; + let workspaceFoldersSupport = false; + let foldingRangeLimit = Number.MAX_VALUE; + + const notReady = () => Promise.reject('Not Ready'); + let requestService: RequestService = { getContent: notReady, stat: notReady, readDirectory: notReady }; + + + + let globalSettings: Settings = {}; + let documentSettings: { [key: string]: Thenable } = {}; + // remove document settings on close + documents.onDidClose(e => { + delete documentSettings[e.document.uri]; + }); + + function getDocumentSettings(textDocument: TextDocument, needsDocumentSettings: () => boolean): Thenable { + if (scopedSettingsSupport && needsDocumentSettings()) { + let promise = documentSettings[textDocument.uri]; + if (!promise) { + const scopeUri = textDocument.uri; + const configRequestParam: ConfigurationParams = { items: [{ scopeUri, section: 'css' }, { scopeUri, section: 'html' }, { scopeUri, section: 'javascript' }] }; + promise = connection.sendRequest(ConfigurationRequest.type, configRequestParam).then(s => ({ css: s[0], html: s[1], javascript: s[2] })); + documentSettings[textDocument.uri] = promise; + } + return promise; + } + return Promise.resolve(undefined); + } + + // After the server has started the client sends an initialize request. The server receives + // in the passed params the rootPath of the workspace plus the client capabilities + connection.onInitialize((params: InitializeParams): InitializeResult => { + const initializationOptions = params.initializationOptions; + + workspaceFolders = (params).workspaceFolders; + if (!Array.isArray(workspaceFolders)) { + workspaceFolders = []; + if (params.rootPath) { + workspaceFolders.push({ name: '', uri: URI.file(params.rootPath).toString() }); + } + } + + requestService = getRequestService(params.initializationOptions.handledSchemas || ['file'], connection, runtime); + + const workspace = { + get settings() { return globalSettings; }, + get folders() { return workspaceFolders; } + }; + + languageModes = getLanguageModes(initializationOptions ? initializationOptions.embeddedLanguages : { css: true, javascript: true }, workspace, params.capabilities, requestService); + + const dataPaths: string[] = params.initializationOptions.dataPaths || []; + fetchHTMLDataProviders(dataPaths, requestService).then(dataProviders => { + languageModes.updateDataProviders(dataProviders); + }); + + documents.onDidClose(e => { + languageModes.onDocumentRemoved(e.document); + }); + connection.onShutdown(() => { + languageModes.dispose(); + }); + + function getClientCapability(name: string, def: T) { + const keys = name.split('.'); + let c: any = params.capabilities; + for (let i = 0; c && i < keys.length; i++) { + if (!c.hasOwnProperty(keys[i])) { + return def; + } + c = c[keys[i]]; + } + return c; + } + + clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false); + dynamicFormatterRegistration = getClientCapability('textDocument.rangeFormatting.dynamicRegistration', false) && (typeof params.initializationOptions.provideFormatter !== 'boolean'); + scopedSettingsSupport = getClientCapability('workspace.configuration', false); + workspaceFoldersSupport = getClientCapability('workspace.workspaceFolders', false); + foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); + const capabilities: ServerCapabilities = { + textDocumentSync: TextDocumentSyncKind.Incremental, + completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['.', ':', '<', '"', '=', '/'] } : undefined, + hoverProvider: true, + documentHighlightProvider: true, + documentRangeFormattingProvider: params.initializationOptions.provideFormatter === true, + documentLinkProvider: { resolveProvider: false }, + documentSymbolProvider: true, + definitionProvider: true, + signatureHelpProvider: { triggerCharacters: ['('] }, + referencesProvider: true, + colorProvider: {}, + foldingRangeProvider: true, + selectionRangeProvider: true, + renameProvider: true + }; + return { capabilities }; + }); + + connection.onInitialized(() => { + if (workspaceFoldersSupport) { + connection.client.register(DidChangeWorkspaceFoldersNotification.type); + + connection.onNotification(DidChangeWorkspaceFoldersNotification.type, e => { + const toAdd = e.event.added; + const toRemove = e.event.removed; + const updatedFolders = []; + if (workspaceFolders) { + for (const folder of workspaceFolders) { + if (!toRemove.some(r => r.uri === folder.uri) && !toAdd.some(r => r.uri === folder.uri)) { + updatedFolders.push(folder); + } + } + } + workspaceFolders = updatedFolders.concat(toAdd); + documents.all().forEach(triggerValidation); + }); + } + }); + + let formatterRegistration: Thenable | null = null; + + // The settings have changed. Is send on server activation as well. + connection.onDidChangeConfiguration((change) => { + globalSettings = change.settings; + documentSettings = {}; // reset all document settings + documents.all().forEach(triggerValidation); + + // dynamically enable & disable the formatter + if (dynamicFormatterRegistration) { + const enableFormatter = globalSettings && globalSettings.html && globalSettings.html.format && globalSettings.html.format.enable; + if (enableFormatter) { + if (!formatterRegistration) { + const documentSelector: DocumentSelector = [{ language: 'html' }, { language: 'handlebars' }]; + formatterRegistration = connection.client.register(DocumentRangeFormattingRequest.type, { documentSelector }); + } + } else if (formatterRegistration) { + formatterRegistration.then(r => r.dispose()); + formatterRegistration = null; + } + } + }); + + const pendingValidationRequests: { [uri: string]: NodeJS.Timer } = {}; + const validationDelayMs = 500; + + // The content of a text document has changed. This event is emitted + // when the text document first opened or when its content has changed. + documents.onDidChangeContent(change => { + triggerValidation(change.document); + }); + + // a document has closed: clear all diagnostics + documents.onDidClose(event => { + cleanPendingValidation(event.document); + connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] }); + }); + + function cleanPendingValidation(textDocument: TextDocument): void { + const request = pendingValidationRequests[textDocument.uri]; + if (request) { + clearTimeout(request); + delete pendingValidationRequests[textDocument.uri]; + } + } + + function triggerValidation(textDocument: TextDocument): void { + cleanPendingValidation(textDocument); + pendingValidationRequests[textDocument.uri] = setTimeout(() => { + delete pendingValidationRequests[textDocument.uri]; + validateTextDocument(textDocument); + }, validationDelayMs); + } + + function isValidationEnabled(languageId: string, settings: Settings = globalSettings) { + const validationSettings = settings && settings.html && settings.html.validate; + if (validationSettings) { + return languageId === 'css' && validationSettings.styles !== false || languageId === 'javascript' && validationSettings.scripts !== false; + } + return true; + } + + async function validateTextDocument(textDocument: TextDocument) { + try { + const version = textDocument.version; + const diagnostics: Diagnostic[] = []; + if (textDocument.languageId === 'html') { + const modes = languageModes.getAllModesInDocument(textDocument); + const settings = await getDocumentSettings(textDocument, () => modes.some(m => !!m.doValidation)); + const latestTextDocument = documents.get(textDocument.uri); + if (latestTextDocument && latestTextDocument.version === version) { // check no new version has come in after in after the async op + for (const mode of modes) { + if (mode.doValidation && isValidationEnabled(mode.getId(), settings)) { + pushAll(diagnostics, await mode.doValidation(latestTextDocument, settings)); + } + } + connection.sendDiagnostics({ uri: latestTextDocument.uri, diagnostics }); + } + } + } catch (e) { + connection.console.error(formatError(`Error while validating ${textDocument.uri}`, e)); + } + } + + connection.onCompletion(async (textDocumentPosition, token) => { + return runSafe(async () => { + const document = documents.get(textDocumentPosition.textDocument.uri); + if (!document) { + return null; + } + const mode = languageModes.getModeAtPosition(document, textDocumentPosition.position); + if (!mode || !mode.doComplete) { + return { isIncomplete: true, items: [] }; + } + const doComplete = mode.doComplete!; + + if (mode.getId() !== 'html') { + /* __GDPR__ + "html.embbedded.complete" : { + "languageId" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + connection.telemetry.logEvent({ key: 'html.embbedded.complete', value: { languageId: mode.getId() } }); + } + + const settings = await getDocumentSettings(document, () => doComplete.length > 2); + const documentContext = getDocumentContext(document.uri, workspaceFolders); + return doComplete(document, textDocumentPosition.position, documentContext, settings); + + }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token); + }); + + connection.onCompletionResolve((item, token) => { + return runSafe(async () => { + const data = item.data; + if (data && data.languageId && data.uri) { + const mode = languageModes.getMode(data.languageId); + const document = documents.get(data.uri); + if (mode && mode.doResolve && document) { + return mode.doResolve(document, item); + } + } + return item; + }, item, `Error while resolving completion proposal`, token); + }); + + connection.onHover((textDocumentPosition, token) => { + return runSafe(async () => { + const document = documents.get(textDocumentPosition.textDocument.uri); + if (document) { + const mode = languageModes.getModeAtPosition(document, textDocumentPosition.position); + if (mode && mode.doHover) { + return mode.doHover(document, textDocumentPosition.position); + } + } + return null; + }, null, `Error while computing hover for ${textDocumentPosition.textDocument.uri}`, token); + }); + + connection.onDocumentHighlight((documentHighlightParams, token) => { + return runSafe(async () => { + const document = documents.get(documentHighlightParams.textDocument.uri); + if (document) { + const mode = languageModes.getModeAtPosition(document, documentHighlightParams.position); + if (mode && mode.findDocumentHighlight) { + return mode.findDocumentHighlight(document, documentHighlightParams.position); + } + } + return []; + }, [], `Error while computing document highlights for ${documentHighlightParams.textDocument.uri}`, token); + }); + + connection.onDefinition((definitionParams, token) => { + return runSafe(async () => { + const document = documents.get(definitionParams.textDocument.uri); + if (document) { + const mode = languageModes.getModeAtPosition(document, definitionParams.position); + if (mode && mode.findDefinition) { + return mode.findDefinition(document, definitionParams.position); + } + } + return []; + }, null, `Error while computing definitions for ${definitionParams.textDocument.uri}`, token); + }); + + connection.onReferences((referenceParams, token) => { + return runSafe(async () => { + const document = documents.get(referenceParams.textDocument.uri); + if (document) { + const mode = languageModes.getModeAtPosition(document, referenceParams.position); + if (mode && mode.findReferences) { + return mode.findReferences(document, referenceParams.position); + } + } + return []; + }, [], `Error while computing references for ${referenceParams.textDocument.uri}`, token); + }); + + connection.onSignatureHelp((signatureHelpParms, token) => { + return runSafe(async () => { + const document = documents.get(signatureHelpParms.textDocument.uri); + if (document) { + const mode = languageModes.getModeAtPosition(document, signatureHelpParms.position); + if (mode && mode.doSignatureHelp) { + return mode.doSignatureHelp(document, signatureHelpParms.position); + } + } + return null; + }, null, `Error while computing signature help for ${signatureHelpParms.textDocument.uri}`, token); + }); + + connection.onDocumentRangeFormatting(async (formatParams, token) => { + return runSafe(async () => { + const document = documents.get(formatParams.textDocument.uri); + if (document) { + let settings = await getDocumentSettings(document, () => true); + if (!settings) { + settings = globalSettings; + } + const unformattedTags: string = settings && settings.html && settings.html.format && settings.html.format.unformatted || ''; + const enabledModes = { css: !unformattedTags.match(/\bstyle\b/), javascript: !unformattedTags.match(/\bscript\b/) }; + + return format(languageModes, document, formatParams.range, formatParams.options, settings, enabledModes); + } + return []; + }, [], `Error while formatting range for ${formatParams.textDocument.uri}`, token); + }); + + connection.onDocumentLinks((documentLinkParam, token) => { + return runSafe(async () => { + const document = documents.get(documentLinkParam.textDocument.uri); + const links: DocumentLink[] = []; + if (document) { + const documentContext = getDocumentContext(document.uri, workspaceFolders); + for (const m of languageModes.getAllModesInDocument(document)) { + if (m.findDocumentLinks) { + pushAll(links, await m.findDocumentLinks(document, documentContext)); + } + } + } + return links; + }, [], `Error while document links for ${documentLinkParam.textDocument.uri}`, token); + }); + + connection.onDocumentSymbol((documentSymbolParms, token) => { + return runSafe(async () => { + const document = documents.get(documentSymbolParms.textDocument.uri); + const symbols: SymbolInformation[] = []; + if (document) { + for (const m of languageModes.getAllModesInDocument(document)) { + if (m.findDocumentSymbols) { + pushAll(symbols, await m.findDocumentSymbols(document)); + } + } + } + return symbols; + }, [], `Error while computing document symbols for ${documentSymbolParms.textDocument.uri}`, token); + }); + + connection.onRequest(DocumentColorRequest.type, (params, token) => { + return runSafe(async () => { + const infos: ColorInformation[] = []; + const document = documents.get(params.textDocument.uri); + if (document) { + for (const m of languageModes.getAllModesInDocument(document)) { + if (m.findDocumentColors) { + pushAll(infos, await m.findDocumentColors(document)); + } + } + } + return infos; + }, [], `Error while computing document colors for ${params.textDocument.uri}`, token); + }); + + connection.onRequest(ColorPresentationRequest.type, (params, token) => { + return runSafe(async () => { + const document = documents.get(params.textDocument.uri); + if (document) { + const mode = languageModes.getModeAtPosition(document, params.range.start); + if (mode && mode.getColorPresentations) { + return mode.getColorPresentations(document, params.color, params.range); + } + } + return []; + }, [], `Error while computing color presentations for ${params.textDocument.uri}`, token); + }); + + connection.onRequest(TagCloseRequest.type, (params, token) => { + return runSafe(async () => { + const document = documents.get(params.textDocument.uri); + if (document) { + const pos = params.position; + if (pos.character > 0) { + const mode = languageModes.getModeAtPosition(document, Position.create(pos.line, pos.character - 1)); + if (mode && mode.doAutoClose) { + return mode.doAutoClose(document, pos); + } + } + } + return null; + }, null, `Error while computing tag close actions for ${params.textDocument.uri}`, token); + }); + + connection.onFoldingRanges((params, token) => { + return runSafe(async () => { + const document = documents.get(params.textDocument.uri); + if (document) { + return getFoldingRanges(languageModes, document, foldingRangeLimit, token); + } + return null; + }, null, `Error while computing folding regions for ${params.textDocument.uri}`, token); + }); + + connection.onSelectionRanges((params, token) => { + return runSafe(async () => { + const document = documents.get(params.textDocument.uri); + if (document) { + return getSelectionRanges(languageModes, document, params.positions); + } + return []; + }, [], `Error while computing selection ranges for ${params.textDocument.uri}`, token); + }); + + connection.onRenameRequest((params, token) => { + return runSafe(async () => { + const document = documents.get(params.textDocument.uri); + const position: Position = params.position; + + if (document) { + const htmlMode = languageModes.getMode('html'); + if (htmlMode && htmlMode.doRename) { + return htmlMode.doRename(document, position, params.newName); + } + } + return null; + }, null, `Error while computing rename for ${params.textDocument.uri}`, token); + }); + + connection.onRequest(OnTypeRenameRequest.type, (params, token) => { + return runSafe(async () => { + const document = documents.get(params.textDocument.uri); + if (document) { + const pos = params.position; + if (pos.character > 0) { + const mode = languageModes.getModeAtPosition(document, Position.create(pos.line, pos.character - 1)); + if (mode && mode.doOnTypeRename) { + return mode.doOnTypeRename(document, pos); + } + } + } + return null; + }, null, `Error while computing synced regions for ${params.textDocument.uri}`, token); + }); + + let semanticTokensProvider: SemanticTokenProvider | undefined; + function getSemanticTokenProvider() { + if (!semanticTokensProvider) { + semanticTokensProvider = newSemanticTokenProvider(languageModes); + } + return semanticTokensProvider; + } + + connection.onRequest(SemanticTokenRequest.type, (params, token) => { + return runSafe(async () => { + const document = documents.get(params.textDocument.uri); + if (document) { + return getSemanticTokenProvider().getSemanticTokens(document, params.ranges); + } + return null; + }, null, `Error while computing semantic tokens for ${params.textDocument.uri}`, token); + }); + + connection.onRequest(SemanticTokenLegendRequest.type, (_params, token) => { + return runSafe(async () => { + return getSemanticTokenProvider().legend; + }, null, `Error while computing semantic tokens legend`, token); + }); + + connection.onNotification(CustomDataChangedNotification.type, dataPaths => { + fetchHTMLDataProviders(dataPaths, requestService).then(dataProviders => { + languageModes.updateDataProviders(dataProviders); + }); + }); + + // Listen on the connection + connection.listen(); +} diff --git a/extensions/html-language-features/server/src/htmlServerMain.ts b/extensions/html-language-features/server/src/htmlServerMain.ts deleted file mode 100644 index 78385d54719..00000000000 --- a/extensions/html-language-features/server/src/htmlServerMain.ts +++ /dev/null @@ -1,544 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { - createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, RequestType, - DocumentRangeFormattingRequest, Disposable, DocumentSelector, TextDocumentPositionParams, ServerCapabilities, - ConfigurationRequest, ConfigurationParams, DidChangeWorkspaceFoldersNotification, - DocumentColorRequest, ColorPresentationRequest, TextDocumentSyncKind -} from 'vscode-languageserver'; -import { - getLanguageModes, LanguageModes, Settings, TextDocument, Position, Diagnostic, WorkspaceFolder, ColorInformation, - Range, DocumentLink, SymbolInformation, TextDocumentIdentifier -} from './modes/languageModes'; - -import { format } from './modes/formatting'; -import { pushAll } from './utils/arrays'; -import { getDocumentContext } from './utils/documentContext'; -import { URI } from 'vscode-uri'; -import { formatError, runSafe, runSafeAsync } from './utils/runner'; - -import { getFoldingRanges } from './modes/htmlFolding'; -import { getDataProviders } from './customData'; -import { getSelectionRanges } from './modes/selectionRanges'; -import { SemanticTokenProvider, newSemanticTokenProvider } from './modes/semanticTokens'; - -namespace TagCloseRequest { - export const type: RequestType = new RequestType('html/tag'); -} -namespace OnTypeRenameRequest { - export const type: RequestType = new RequestType('html/onTypeRename'); -} - -// experimental: semantic tokens -interface SemanticTokenParams { - textDocument: TextDocumentIdentifier; - ranges?: Range[]; -} -namespace SemanticTokenRequest { - export const type: RequestType = new RequestType('html/semanticTokens'); -} -namespace SemanticTokenLegendRequest { - export const type: RequestType = new RequestType('html/semanticTokenLegend'); -} - -// Create a connection for the server -const connection: IConnection = createConnection(); - -console.log = connection.console.log.bind(connection.console); -console.error = connection.console.error.bind(connection.console); - -process.on('unhandledRejection', (e: any) => { - console.error(formatError(`Unhandled exception`, e)); -}); -process.on('uncaughtException', (e: any) => { - console.error(formatError(`Unhandled exception`, e)); -}); - -// Create a text document manager. -const documents = new TextDocuments(TextDocument); -// Make the text document manager listen on the connection -// for open, change and close text document events -documents.listen(connection); - -let workspaceFolders: WorkspaceFolder[] = []; - -let languageModes: LanguageModes; - -let clientSnippetSupport = false; -let dynamicFormatterRegistration = false; -let scopedSettingsSupport = false; -let workspaceFoldersSupport = false; -let foldingRangeLimit = Number.MAX_VALUE; - -let globalSettings: Settings = {}; -let documentSettings: { [key: string]: Thenable } = {}; -// remove document settings on close -documents.onDidClose(e => { - delete documentSettings[e.document.uri]; -}); - -function getDocumentSettings(textDocument: TextDocument, needsDocumentSettings: () => boolean): Thenable { - if (scopedSettingsSupport && needsDocumentSettings()) { - let promise = documentSettings[textDocument.uri]; - if (!promise) { - const scopeUri = textDocument.uri; - const configRequestParam: ConfigurationParams = { items: [{ scopeUri, section: 'css' }, { scopeUri, section: 'html' }, { scopeUri, section: 'javascript' }] }; - promise = connection.sendRequest(ConfigurationRequest.type, configRequestParam).then(s => ({ css: s[0], html: s[1], javascript: s[2] })); - documentSettings[textDocument.uri] = promise; - } - return promise; - } - return Promise.resolve(undefined); -} - -// After the server has started the client sends an initialize request. The server receives -// in the passed params the rootPath of the workspace plus the client capabilities -connection.onInitialize((params: InitializeParams): InitializeResult => { - const initializationOptions = params.initializationOptions; - - workspaceFolders = (params).workspaceFolders; - if (!Array.isArray(workspaceFolders)) { - workspaceFolders = []; - if (params.rootPath) { - workspaceFolders.push({ name: '', uri: URI.file(params.rootPath).toString() }); - } - } - - const dataPaths: string[] = params.initializationOptions.dataPaths; - const providers = getDataProviders(dataPaths); - - const workspace = { - get settings() { return globalSettings; }, - get folders() { return workspaceFolders; } - }; - - languageModes = getLanguageModes(initializationOptions ? initializationOptions.embeddedLanguages : { css: true, javascript: true }, workspace, params.capabilities, providers); - - documents.onDidClose(e => { - languageModes.onDocumentRemoved(e.document); - }); - connection.onShutdown(() => { - languageModes.dispose(); - }); - - function getClientCapability(name: string, def: T) { - const keys = name.split('.'); - let c: any = params.capabilities; - for (let i = 0; c && i < keys.length; i++) { - if (!c.hasOwnProperty(keys[i])) { - return def; - } - c = c[keys[i]]; - } - return c; - } - - clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false); - dynamicFormatterRegistration = getClientCapability('textDocument.rangeFormatting.dynamicRegistration', false) && (typeof params.initializationOptions.provideFormatter !== 'boolean'); - scopedSettingsSupport = getClientCapability('workspace.configuration', false); - workspaceFoldersSupport = getClientCapability('workspace.workspaceFolders', false); - foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); - const capabilities: ServerCapabilities = { - textDocumentSync: TextDocumentSyncKind.Incremental, - completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['.', ':', '<', '"', '=', '/'] } : undefined, - hoverProvider: true, - documentHighlightProvider: true, - documentRangeFormattingProvider: params.initializationOptions.provideFormatter === true, - documentLinkProvider: { resolveProvider: false }, - documentSymbolProvider: true, - definitionProvider: true, - signatureHelpProvider: { triggerCharacters: ['('] }, - referencesProvider: true, - colorProvider: {}, - foldingRangeProvider: true, - selectionRangeProvider: true, - renameProvider: true - }; - return { capabilities }; -}); - -connection.onInitialized(() => { - if (workspaceFoldersSupport) { - connection.client.register(DidChangeWorkspaceFoldersNotification.type); - - connection.onNotification(DidChangeWorkspaceFoldersNotification.type, e => { - const toAdd = e.event.added; - const toRemove = e.event.removed; - const updatedFolders = []; - if (workspaceFolders) { - for (const folder of workspaceFolders) { - if (!toRemove.some(r => r.uri === folder.uri) && !toAdd.some(r => r.uri === folder.uri)) { - updatedFolders.push(folder); - } - } - } - workspaceFolders = updatedFolders.concat(toAdd); - documents.all().forEach(triggerValidation); - }); - } -}); - -let formatterRegistration: Thenable | null = null; - -// The settings have changed. Is send on server activation as well. -connection.onDidChangeConfiguration((change) => { - globalSettings = change.settings; - documentSettings = {}; // reset all document settings - documents.all().forEach(triggerValidation); - - // dynamically enable & disable the formatter - if (dynamicFormatterRegistration) { - const enableFormatter = globalSettings && globalSettings.html && globalSettings.html.format && globalSettings.html.format.enable; - if (enableFormatter) { - if (!formatterRegistration) { - const documentSelector: DocumentSelector = [{ language: 'html' }, { language: 'handlebars' }]; - formatterRegistration = connection.client.register(DocumentRangeFormattingRequest.type, { documentSelector }); - } - } else if (formatterRegistration) { - formatterRegistration.then(r => r.dispose()); - formatterRegistration = null; - } - } -}); - -const pendingValidationRequests: { [uri: string]: NodeJS.Timer } = {}; -const validationDelayMs = 500; - -// The content of a text document has changed. This event is emitted -// when the text document first opened or when its content has changed. -documents.onDidChangeContent(change => { - triggerValidation(change.document); -}); - -// a document has closed: clear all diagnostics -documents.onDidClose(event => { - cleanPendingValidation(event.document); - connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] }); -}); - -function cleanPendingValidation(textDocument: TextDocument): void { - const request = pendingValidationRequests[textDocument.uri]; - if (request) { - clearTimeout(request); - delete pendingValidationRequests[textDocument.uri]; - } -} - -function triggerValidation(textDocument: TextDocument): void { - cleanPendingValidation(textDocument); - pendingValidationRequests[textDocument.uri] = setTimeout(() => { - delete pendingValidationRequests[textDocument.uri]; - validateTextDocument(textDocument); - }, validationDelayMs); -} - -function isValidationEnabled(languageId: string, settings: Settings = globalSettings) { - const validationSettings = settings && settings.html && settings.html.validate; - if (validationSettings) { - return languageId === 'css' && validationSettings.styles !== false || languageId === 'javascript' && validationSettings.scripts !== false; - } - return true; -} - -async function validateTextDocument(textDocument: TextDocument) { - try { - const version = textDocument.version; - const diagnostics: Diagnostic[] = []; - if (textDocument.languageId === 'html') { - const modes = languageModes.getAllModesInDocument(textDocument); - const settings = await getDocumentSettings(textDocument, () => modes.some(m => !!m.doValidation)); - const latestTextDocument = documents.get(textDocument.uri); - if (latestTextDocument && latestTextDocument.version === version) { // check no new version has come in after in after the async op - modes.forEach(mode => { - if (mode.doValidation && isValidationEnabled(mode.getId(), settings)) { - pushAll(diagnostics, mode.doValidation(latestTextDocument, settings)); - } - }); - connection.sendDiagnostics({ uri: latestTextDocument.uri, diagnostics }); - } - } - } catch (e) { - connection.console.error(formatError(`Error while validating ${textDocument.uri}`, e)); - } -} - -connection.onCompletion(async (textDocumentPosition, token) => { - return runSafeAsync(async () => { - const document = documents.get(textDocumentPosition.textDocument.uri); - if (!document) { - return null; - } - const mode = languageModes.getModeAtPosition(document, textDocumentPosition.position); - if (!mode || !mode.doComplete) { - return { isIncomplete: true, items: [] }; - } - const doComplete = mode.doComplete!; - - if (mode.getId() !== 'html') { - /* __GDPR__ - "html.embbedded.complete" : { - "languageId" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - connection.telemetry.logEvent({ key: 'html.embbedded.complete', value: { languageId: mode.getId() } }); - } - - const settings = await getDocumentSettings(document, () => doComplete.length > 2); - const result = doComplete(document, textDocumentPosition.position, settings); - return result; - - }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token); -}); - -connection.onCompletionResolve((item, token) => { - return runSafe(() => { - const data = item.data; - if (data && data.languageId && data.uri) { - const mode = languageModes.getMode(data.languageId); - const document = documents.get(data.uri); - if (mode && mode.doResolve && document) { - return mode.doResolve(document, item); - } - } - return item; - }, item, `Error while resolving completion proposal`, token); -}); - -connection.onHover((textDocumentPosition, token) => { - return runSafe(() => { - const document = documents.get(textDocumentPosition.textDocument.uri); - if (document) { - const mode = languageModes.getModeAtPosition(document, textDocumentPosition.position); - if (mode && mode.doHover) { - return mode.doHover(document, textDocumentPosition.position); - } - } - return null; - }, null, `Error while computing hover for ${textDocumentPosition.textDocument.uri}`, token); -}); - -connection.onDocumentHighlight((documentHighlightParams, token) => { - return runSafe(() => { - const document = documents.get(documentHighlightParams.textDocument.uri); - if (document) { - const mode = languageModes.getModeAtPosition(document, documentHighlightParams.position); - if (mode && mode.findDocumentHighlight) { - return mode.findDocumentHighlight(document, documentHighlightParams.position); - } - } - return []; - }, [], `Error while computing document highlights for ${documentHighlightParams.textDocument.uri}`, token); -}); - -connection.onDefinition((definitionParams, token) => { - return runSafe(() => { - const document = documents.get(definitionParams.textDocument.uri); - if (document) { - const mode = languageModes.getModeAtPosition(document, definitionParams.position); - if (mode && mode.findDefinition) { - return mode.findDefinition(document, definitionParams.position); - } - } - return []; - }, null, `Error while computing definitions for ${definitionParams.textDocument.uri}`, token); -}); - -connection.onReferences((referenceParams, token) => { - return runSafe(() => { - const document = documents.get(referenceParams.textDocument.uri); - if (document) { - const mode = languageModes.getModeAtPosition(document, referenceParams.position); - if (mode && mode.findReferences) { - return mode.findReferences(document, referenceParams.position); - } - } - return []; - }, [], `Error while computing references for ${referenceParams.textDocument.uri}`, token); -}); - -connection.onSignatureHelp((signatureHelpParms, token) => { - return runSafe(() => { - const document = documents.get(signatureHelpParms.textDocument.uri); - if (document) { - const mode = languageModes.getModeAtPosition(document, signatureHelpParms.position); - if (mode && mode.doSignatureHelp) { - return mode.doSignatureHelp(document, signatureHelpParms.position); - } - } - return null; - }, null, `Error while computing signature help for ${signatureHelpParms.textDocument.uri}`, token); -}); - -connection.onDocumentRangeFormatting(async (formatParams, token) => { - return runSafeAsync(async () => { - const document = documents.get(formatParams.textDocument.uri); - if (document) { - let settings = await getDocumentSettings(document, () => true); - if (!settings) { - settings = globalSettings; - } - const unformattedTags: string = settings && settings.html && settings.html.format && settings.html.format.unformatted || ''; - const enabledModes = { css: !unformattedTags.match(/\bstyle\b/), javascript: !unformattedTags.match(/\bscript\b/) }; - - return format(languageModes, document, formatParams.range, formatParams.options, settings, enabledModes); - } - return []; - }, [], `Error while formatting range for ${formatParams.textDocument.uri}`, token); -}); - -connection.onDocumentLinks((documentLinkParam, token) => { - return runSafe(() => { - const document = documents.get(documentLinkParam.textDocument.uri); - const links: DocumentLink[] = []; - if (document) { - const documentContext = getDocumentContext(document.uri, workspaceFolders); - languageModes.getAllModesInDocument(document).forEach(m => { - if (m.findDocumentLinks) { - pushAll(links, m.findDocumentLinks(document, documentContext)); - } - }); - } - return links; - }, [], `Error while document links for ${documentLinkParam.textDocument.uri}`, token); -}); - -connection.onDocumentSymbol((documentSymbolParms, token) => { - return runSafe(() => { - const document = documents.get(documentSymbolParms.textDocument.uri); - const symbols: SymbolInformation[] = []; - if (document) { - languageModes.getAllModesInDocument(document).forEach(m => { - if (m.findDocumentSymbols) { - pushAll(symbols, m.findDocumentSymbols(document)); - } - }); - } - return symbols; - }, [], `Error while computing document symbols for ${documentSymbolParms.textDocument.uri}`, token); -}); - -connection.onRequest(DocumentColorRequest.type, (params, token) => { - return runSafe(() => { - const infos: ColorInformation[] = []; - const document = documents.get(params.textDocument.uri); - if (document) { - languageModes.getAllModesInDocument(document).forEach(m => { - if (m.findDocumentColors) { - pushAll(infos, m.findDocumentColors(document)); - } - }); - } - return infos; - }, [], `Error while computing document colors for ${params.textDocument.uri}`, token); -}); - -connection.onRequest(ColorPresentationRequest.type, (params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - const mode = languageModes.getModeAtPosition(document, params.range.start); - if (mode && mode.getColorPresentations) { - return mode.getColorPresentations(document, params.color, params.range); - } - } - return []; - }, [], `Error while computing color presentations for ${params.textDocument.uri}`, token); -}); - -connection.onRequest(TagCloseRequest.type, (params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - const pos = params.position; - if (pos.character > 0) { - const mode = languageModes.getModeAtPosition(document, Position.create(pos.line, pos.character - 1)); - if (mode && mode.doAutoClose) { - return mode.doAutoClose(document, pos); - } - } - } - return null; - }, null, `Error while computing tag close actions for ${params.textDocument.uri}`, token); -}); - -connection.onFoldingRanges((params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - return getFoldingRanges(languageModes, document, foldingRangeLimit, token); - } - return null; - }, null, `Error while computing folding regions for ${params.textDocument.uri}`, token); -}); - -connection.onSelectionRanges((params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - return getSelectionRanges(languageModes, document, params.positions); - } - return []; - }, [], `Error while computing selection ranges for ${params.textDocument.uri}`, token); -}); - -connection.onRenameRequest((params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - const position: Position = params.position; - - if (document) { - const htmlMode = languageModes.getMode('html'); - if (htmlMode && htmlMode.doRename) { - return htmlMode.doRename(document, position, params.newName); - } - } - return null; - }, null, `Error while computing rename for ${params.textDocument.uri}`, token); -}); - -connection.onRequest(OnTypeRenameRequest.type, (params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - const pos = params.position; - if (pos.character > 0) { - const mode = languageModes.getModeAtPosition(document, Position.create(pos.line, pos.character - 1)); - if (mode && mode.doOnTypeRename) { - return mode.doOnTypeRename(document, pos); - } - } - } - return null; - }, null, `Error while computing synced regions for ${params.textDocument.uri}`, token); -}); - -let semanticTokensProvider: SemanticTokenProvider | undefined; -function getSemanticTokenProvider() { - if (!semanticTokensProvider) { - semanticTokensProvider = newSemanticTokenProvider(languageModes); - } - return semanticTokensProvider; -} - -connection.onRequest(SemanticTokenRequest.type, (params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - return getSemanticTokenProvider().getSemanticTokens(document, params.ranges); - } - return null; - }, null, `Error while computing semantic tokens for ${params.textDocument.uri}`, token); -}); - -connection.onRequest(SemanticTokenLegendRequest.type, (_params, token) => { - return runSafe(() => { - return getSemanticTokenProvider().legend; - }, null, `Error while computing semantic tokens legend`, token); -}); - - -// Listen on the connection -connection.listen(); diff --git a/extensions/html-language-features/server/src/modes/cssMode.ts b/extensions/html-language-features/server/src/modes/cssMode.ts index e705f44bbab..9b3ddd9b764 100644 --- a/extensions/html-language-features/server/src/modes/cssMode.ts +++ b/extensions/html-language-features/server/src/modes/cssMode.ts @@ -5,7 +5,7 @@ import { LanguageModelCache, getLanguageModelCache } from '../languageModelCache'; import { Stylesheet, LanguageService as CSSLanguageService } from 'vscode-css-languageservice'; -import { FoldingRange, LanguageMode, Workspace, Color, TextDocument, Position, Range, CompletionList } from './languageModes'; +import { LanguageMode, Workspace, Color, TextDocument, Position, Range, CompletionList, DocumentContext } from './languageModes'; import { HTMLDocumentRegions, CSS_STYLE_RULE } from './embeddedSupport'; export function getCSSMode(cssLanguageService: CSSLanguageService, documentRegions: LanguageModelCache, workspace: Workspace): LanguageMode { @@ -16,48 +16,48 @@ export function getCSSMode(cssLanguageService: CSSLanguageService, documentRegio getId() { return 'css'; }, - doValidation(document: TextDocument, settings = workspace.settings) { + async doValidation(document: TextDocument, settings = workspace.settings) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.doValidation(embedded, cssStylesheets.get(embedded), settings && settings.css); }, - doComplete(document: TextDocument, position: Position, _settings = workspace.settings) { + async doComplete(document: TextDocument, position: Position, documentContext: DocumentContext, _settings = workspace.settings) { let embedded = embeddedCSSDocuments.get(document); const stylesheet = cssStylesheets.get(embedded); - return cssLanguageService.doComplete(embedded, position, stylesheet) || CompletionList.create(); + return cssLanguageService.doComplete2(embedded, position, stylesheet, documentContext) || CompletionList.create(); }, - doHover(document: TextDocument, position: Position) { + async doHover(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.doHover(embedded, position, cssStylesheets.get(embedded)); }, - findDocumentHighlight(document: TextDocument, position: Position) { + async findDocumentHighlight(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findDocumentHighlights(embedded, position, cssStylesheets.get(embedded)); }, - findDocumentSymbols(document: TextDocument) { + async findDocumentSymbols(document: TextDocument) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findDocumentSymbols(embedded, cssStylesheets.get(embedded)).filter(s => s.name !== CSS_STYLE_RULE); }, - findDefinition(document: TextDocument, position: Position) { + async findDefinition(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findDefinition(embedded, position, cssStylesheets.get(embedded)); }, - findReferences(document: TextDocument, position: Position) { + async findReferences(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findReferences(embedded, position, cssStylesheets.get(embedded)); }, - findDocumentColors(document: TextDocument) { + async findDocumentColors(document: TextDocument) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findDocumentColors(embedded, cssStylesheets.get(embedded)); }, - getColorPresentations(document: TextDocument, color: Color, range: Range) { + async getColorPresentations(document: TextDocument, color: Color, range: Range) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.getColorPresentations(embedded, cssStylesheets.get(embedded), color, range); }, - getFoldingRanges(document: TextDocument): FoldingRange[] { + async getFoldingRanges(document: TextDocument) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.getFoldingRanges(embedded, {}); }, - getSelectionRange(document: TextDocument, position: Position) { + async getSelectionRange(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.getSelectionRanges(embedded, [position], cssStylesheets.get(embedded))[0]; }, diff --git a/extensions/html-language-features/server/src/modes/formatting.ts b/extensions/html-language-features/server/src/modes/formatting.ts index 4acb60a9b9a..49c3a0dd68e 100644 --- a/extensions/html-language-features/server/src/modes/formatting.ts +++ b/extensions/html-language-features/server/src/modes/formatting.ts @@ -7,7 +7,7 @@ import { LanguageModes, Settings, LanguageModeRange, TextDocument, Range, TextEd import { pushAll } from '../utils/arrays'; import { isEOL } from '../utils/strings'; -export function format(languageModes: LanguageModes, document: TextDocument, formatRange: Range, formattingOptions: FormattingOptions, settings: Settings | undefined, enabledModes: { [mode: string]: boolean }) { +export async function format(languageModes: LanguageModes, document: TextDocument, formatRange: Range, formattingOptions: FormattingOptions, settings: Settings | undefined, enabledModes: { [mode: string]: boolean }) { let result: TextEdit[] = []; let endPos = formatRange.end; @@ -39,7 +39,7 @@ export function format(languageModes: LanguageModes, document: TextDocument, for while (i < allRanges.length && !isHTML(allRanges[i])) { let range = allRanges[i]; if (!range.attributeValue && range.mode && range.mode.format) { - let edits = range.mode.format(document, Range.create(startPos, range.end), formattingOptions, settings); + let edits = await range.mode.format(document, Range.create(startPos, range.end), formattingOptions, settings); pushAll(result, edits); } startPos = range.end; @@ -53,7 +53,7 @@ export function format(languageModes: LanguageModes, document: TextDocument, for // perform a html format and apply changes to a new document let htmlMode = languageModes.getMode('html')!; - let htmlEdits = htmlMode.format!(document, formatRange, formattingOptions, settings); + let htmlEdits = await htmlMode.format!(document, formatRange, formattingOptions, settings); let htmlFormattedContent = TextDocument.applyEdits(document, htmlEdits); let newDocument = TextDocument.create(document.uri + '.tmp', document.languageId, document.version, htmlFormattedContent); try { @@ -67,7 +67,7 @@ export function format(languageModes: LanguageModes, document: TextDocument, for for (let r of embeddedRanges) { let mode = r.mode; if (mode && mode.format && enabledModes[mode.getId()] && !r.attributeValue) { - let edits = mode.format(newDocument, r, formattingOptions, settings); + let edits = await mode.format(newDocument, r, formattingOptions, settings); for (let edit of edits) { embeddedEdits.push(edit); } diff --git a/extensions/html-language-features/server/src/modes/htmlFolding.ts b/extensions/html-language-features/server/src/modes/htmlFolding.ts index 5eccc0ef876..78674fb0bc4 100644 --- a/extensions/html-language-features/server/src/modes/htmlFolding.ts +++ b/extensions/html-language-features/server/src/modes/htmlFolding.ts @@ -6,21 +6,21 @@ import { TextDocument, FoldingRange, Position, Range, LanguageModes, LanguageMode } from './languageModes'; import { CancellationToken } from 'vscode-languageserver'; -export function getFoldingRanges(languageModes: LanguageModes, document: TextDocument, maxRanges: number | undefined, _cancellationToken: CancellationToken | null): FoldingRange[] { +export async function getFoldingRanges(languageModes: LanguageModes, document: TextDocument, maxRanges: number | undefined, _cancellationToken: CancellationToken | null): Promise { let htmlMode = languageModes.getMode('html'); let range = Range.create(Position.create(0, 0), Position.create(document.lineCount, 0)); let result: FoldingRange[] = []; if (htmlMode && htmlMode.getFoldingRanges) { - result.push(...htmlMode.getFoldingRanges(document)); + result.push(... await htmlMode.getFoldingRanges(document)); } // cache folding ranges per mode let rangesPerMode: { [mode: string]: FoldingRange[] } = Object.create(null); - let getRangesForMode = (mode: LanguageMode) => { + let getRangesForMode = async (mode: LanguageMode) => { if (mode.getFoldingRanges) { let ranges = rangesPerMode[mode.getId()]; if (!Array.isArray(ranges)) { - ranges = mode.getFoldingRanges(document) || []; + ranges = await mode.getFoldingRanges(document) || []; rangesPerMode[mode.getId()] = ranges; } return ranges; @@ -32,7 +32,7 @@ export function getFoldingRanges(languageModes: LanguageModes, document: TextDoc for (let modeRange of modeRanges) { let mode = modeRange.mode; if (mode && mode !== htmlMode && !modeRange.attributeValue) { - const ranges = getRangesForMode(mode); + const ranges = await getRangesForMode(mode); result.push(...ranges.filter(r => r.startLine >= modeRange.start.line && r.endLine < modeRange.end.line)); } } diff --git a/extensions/html-language-features/server/src/modes/htmlMode.ts b/extensions/html-language-features/server/src/modes/htmlMode.ts index 4a3be8244a4..96462f8e011 100644 --- a/extensions/html-language-features/server/src/modes/htmlMode.ts +++ b/extensions/html-language-features/server/src/modes/htmlMode.ts @@ -7,10 +7,9 @@ import { getLanguageModelCache } from '../languageModelCache'; import { LanguageService as HTMLLanguageService, HTMLDocument, DocumentContext, FormattingOptions, HTMLFormatConfiguration, SelectionRange, - TextDocument, Position, Range, CompletionItem, FoldingRange, + TextDocument, Position, Range, FoldingRange, LanguageMode, Workspace } from './languageModes'; -import { getPathCompletionParticipant } from './pathCompletion'; export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: Workspace): LanguageMode { let htmlDocuments = getLanguageModelCache(10, 60, document => htmlLanguageService.parseHTMLDocument(document)); @@ -18,37 +17,33 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: getId() { return 'html'; }, - getSelectionRange(document: TextDocument, position: Position): SelectionRange { + async getSelectionRange(document: TextDocument, position: Position): Promise { return htmlLanguageService.getSelectionRanges(document, [position])[0]; }, - doComplete(document: TextDocument, position: Position, settings = workspace.settings) { + doComplete(document: TextDocument, position: Position, documentContext: DocumentContext, settings = workspace.settings) { let options = settings && settings.html && settings.html.suggest; let doAutoComplete = settings && settings.html && settings.html.autoClosingTags; if (doAutoComplete) { options.hideAutoCompleteProposals = true; } - let pathCompletionProposals: CompletionItem[] = []; - let participants = [getPathCompletionParticipant(document, workspace.folders, pathCompletionProposals)]; - htmlLanguageService.setCompletionParticipants(participants); const htmlDocument = htmlDocuments.get(document); - let completionList = htmlLanguageService.doComplete(document, position, htmlDocument, options); - completionList.items.push(...pathCompletionProposals); + let completionList = htmlLanguageService.doComplete2(document, position, htmlDocument, documentContext, options); return completionList; }, - doHover(document: TextDocument, position: Position) { + async doHover(document: TextDocument, position: Position) { return htmlLanguageService.doHover(document, position, htmlDocuments.get(document)); }, - findDocumentHighlight(document: TextDocument, position: Position) { + async findDocumentHighlight(document: TextDocument, position: Position) { return htmlLanguageService.findDocumentHighlights(document, position, htmlDocuments.get(document)); }, - findDocumentLinks(document: TextDocument, documentContext: DocumentContext) { + async findDocumentLinks(document: TextDocument, documentContext: DocumentContext) { return htmlLanguageService.findDocumentLinks(document, documentContext); }, - findDocumentSymbols(document: TextDocument) { + async findDocumentSymbols(document: TextDocument) { return htmlLanguageService.findDocumentSymbols(document, htmlDocuments.get(document)); }, - format(document: TextDocument, range: Range, formatParams: FormattingOptions, settings = workspace.settings) { + async format(document: TextDocument, range: Range, formatParams: FormattingOptions, settings = workspace.settings) { let formatSettings: HTMLFormatConfiguration = settings && settings.html && settings.html.format; if (formatSettings) { formatSettings = merge(formatSettings, {}); @@ -63,10 +58,10 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: formatSettings = merge(formatParams, formatSettings); return htmlLanguageService.format(document, range, formatSettings); }, - getFoldingRanges(document: TextDocument): FoldingRange[] { + async getFoldingRanges(document: TextDocument): Promise { return htmlLanguageService.getFoldingRanges(document); }, - doAutoClose(document: TextDocument, position: Position) { + async doAutoClose(document: TextDocument, position: Position) { let offset = document.offsetAt(position); let text = document.getText(); if (offset > 0 && text.charAt(offset - 1).match(/[>\/]/g)) { @@ -74,18 +69,18 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: } return null; }, - doRename(document: TextDocument, position: Position, newName: string) { + async doRename(document: TextDocument, position: Position, newName: string) { const htmlDocument = htmlDocuments.get(document); return htmlLanguageService.doRename(document, position, newName, htmlDocument); }, - onDocumentRemoved(document: TextDocument) { + async onDocumentRemoved(document: TextDocument) { htmlDocuments.onDocumentRemoved(document); }, - findMatchingTagPosition(document: TextDocument, position: Position) { + async findMatchingTagPosition(document: TextDocument, position: Position) { const htmlDocument = htmlDocuments.get(document); return htmlLanguageService.findMatchingTagPosition(document, position, htmlDocument); }, - doOnTypeRename(document: TextDocument, position: Position) { + async doOnTypeRename(document: TextDocument, position: Position) { const htmlDocument = htmlDocuments.get(document); return htmlLanguageService.findOnTypeRenameRanges(document, position, htmlDocument); }, diff --git a/extensions/html-language-features/server/src/modes/javascriptLibs.ts b/extensions/html-language-features/server/src/modes/javascriptLibs.ts new file mode 100644 index 00000000000..bdca89be362 --- /dev/null +++ b/extensions/html-language-features/server/src/modes/javascriptLibs.ts @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { join, basename, dirname } from 'path'; +import { readFileSync } from 'fs'; + +const contents: { [name: string]: string } = {}; + +const serverFolder = basename(__dirname) === 'dist' ? dirname(__dirname) : dirname(dirname(__dirname)); +const TYPESCRIPT_LIB_SOURCE = join(serverFolder, '../../node_modules/typescript/lib'); +const JQUERY_PATH = join(serverFolder, 'lib/jquery.d.ts'); + +export function loadLibrary(name: string) { + let content = contents[name]; + if (typeof content !== 'string') { + let libPath; + if (name === 'jquery') { + libPath = JQUERY_PATH; + } else { + libPath = join(TYPESCRIPT_LIB_SOURCE, name); // from source + } + try { + content = readFileSync(libPath).toString(); + } catch (e) { + console.log(`Unable to load library ${name} at ${libPath}: ${e.message}`); + content = ''; + } + contents[name] = content; + } + return content; +} diff --git a/extensions/html-language-features/server/src/modes/javascriptMode.ts b/extensions/html-language-features/server/src/modes/javascriptMode.ts index 9841c7167ec..086b8a906b8 100644 --- a/extensions/html-language-features/server/src/modes/javascriptMode.ts +++ b/extensions/html-language-features/server/src/modes/javascriptMode.ts @@ -8,94 +8,105 @@ import { SymbolInformation, SymbolKind, CompletionItem, Location, SignatureHelp, SignatureInformation, ParameterInformation, Definition, TextEdit, TextDocument, Diagnostic, DiagnosticSeverity, Range, CompletionItemKind, Hover, MarkedString, DocumentHighlight, DocumentHighlightKind, CompletionList, Position, FormattingOptions, FoldingRange, FoldingRangeKind, SelectionRange, - LanguageMode, Settings, SemanticTokenData, Workspace + LanguageMode, Settings, SemanticTokenData, Workspace, DocumentContext } from './languageModes'; -import { getWordAtText, startsWith, isWhitespaceOnly, repeat } from '../utils/strings'; +import { getWordAtText, isWhitespaceOnly, repeat } from '../utils/strings'; import { HTMLDocumentRegions } from './embeddedSupport'; import * as ts from 'typescript'; -import { join } from 'path'; import { getSemanticTokens, getSemanticTokenLegend } from './javascriptSemanticTokens'; const JS_WORD_REGEX = /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g; -let jquery_d_ts = join(__dirname, '../lib/jquery.d.ts'); // when packaged -if (!ts.sys.fileExists(jquery_d_ts)) { - jquery_d_ts = join(__dirname, '../../lib/jquery.d.ts'); // from source +function getLanguageServiceHost(scriptKind: ts.ScriptKind) { + const compilerOptions: ts.CompilerOptions = { allowNonTsExtensions: true, allowJs: true, lib: ['lib.es6.d.ts'], target: ts.ScriptTarget.Latest, moduleResolution: ts.ModuleResolutionKind.Classic, experimentalDecorators: false }; + + let currentTextDocument = TextDocument.create('init', 'javascript', 1, ''); + const jsLanguageService = import(/* webpackChunkName: "javascriptLibs" */ './javascriptLibs').then(libs => { + const host: ts.LanguageServiceHost = { + getCompilationSettings: () => compilerOptions, + getScriptFileNames: () => [currentTextDocument.uri, 'jquery'], + getScriptKind: (fileName) => { + if (fileName === currentTextDocument.uri) { + return scriptKind; + } + return fileName.substr(fileName.length - 2) === 'ts' ? ts.ScriptKind.TS : ts.ScriptKind.JS; + }, + getScriptVersion: (fileName: string) => { + if (fileName === currentTextDocument.uri) { + return String(currentTextDocument.version); + } + return '1'; // default lib an jquery.d.ts are static + }, + getScriptSnapshot: (fileName: string) => { + let text = ''; + if (fileName === currentTextDocument.uri) { + text = currentTextDocument.getText(); + } else { + text = libs.loadLibrary(fileName); + } + return { + getText: (start, end) => text.substring(start, end), + getLength: () => text.length, + getChangeRange: () => undefined + }; + }, + getCurrentDirectory: () => '', + getDefaultLibFileName: (_options: ts.CompilerOptions) => 'es6' + }; + return ts.createLanguageService(host); + }); + return { + async getLanguageService(jsDocument: TextDocument): Promise { + currentTextDocument = jsDocument; + return jsLanguageService; + }, + getCompilationSettings() { + return compilerOptions; + }, + dispose() { + if (jsLanguageService) { + jsLanguageService.then(s => s.dispose()); + } + } + }; } + export function getJavaScriptMode(documentRegions: LanguageModelCache, languageId: 'javascript' | 'typescript', workspace: Workspace): LanguageMode { let jsDocuments = getLanguageModelCache(10, 60, document => documentRegions.get(document).getEmbeddedDocument(languageId)); - const workingFile = languageId === 'javascript' ? 'vscode://javascript/1.js' : 'vscode://javascript/2.ts'; // the same 'file' is used for all contents - - let compilerOptions: ts.CompilerOptions = { allowNonTsExtensions: true, allowJs: true, lib: ['lib.es6.d.ts'], target: ts.ScriptTarget.Latest, moduleResolution: ts.ModuleResolutionKind.Classic, experimentalDecorators: false }; - let currentTextDocument: TextDocument; - let scriptFileVersion: number = 0; - function updateCurrentTextDocument(doc: TextDocument) { - if (!currentTextDocument || doc.uri !== currentTextDocument.uri || doc.version !== currentTextDocument.version) { - currentTextDocument = jsDocuments.get(doc); - scriptFileVersion++; - } - } - const host: ts.LanguageServiceHost = { - getCompilationSettings: () => compilerOptions, - getScriptFileNames: () => [workingFile, jquery_d_ts], - getScriptKind: (fileName) => fileName.substr(fileName.length - 2) === 'ts' ? ts.ScriptKind.TS : ts.ScriptKind.JS, - getScriptVersion: (fileName: string) => { - if (fileName === workingFile) { - return String(scriptFileVersion); - } - return '1'; // default lib an jquery.d.ts are static - }, - getScriptSnapshot: (fileName: string) => { - let text = ''; - if (startsWith(fileName, 'vscode:')) { - if (fileName === workingFile) { - text = currentTextDocument.getText(); - } - } else { - text = ts.sys.readFile(fileName) || ''; - } - return { - getText: (start, end) => text.substring(start, end), - getLength: () => text.length, - getChangeRange: () => undefined - }; - }, - getCurrentDirectory: () => '', - getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options) - }; - let jsLanguageService = ts.createLanguageService(host); - + const host = getLanguageServiceHost(languageId === 'javascript' ? ts.ScriptKind.JS : ts.ScriptKind.TS); let globalSettings: Settings = {}; return { getId() { return languageId; }, - doValidation(document: TextDocument, settings = workspace.settings): Diagnostic[] { - updateCurrentTextDocument(document); + async doValidation(document: TextDocument, settings = workspace.settings): Promise { host.getCompilationSettings()['experimentalDecorators'] = settings && settings.javascript && settings.javascript.implicitProjectConfig.experimentalDecorators; - const syntaxDiagnostics: ts.Diagnostic[] = jsLanguageService.getSyntacticDiagnostics(workingFile); - const semanticDiagnostics = jsLanguageService.getSemanticDiagnostics(workingFile); + const jsDocument = jsDocuments.get(document); + const languageService = await host.getLanguageService(jsDocument); + const syntaxDiagnostics: ts.Diagnostic[] = languageService.getSyntacticDiagnostics(jsDocument.uri); + const semanticDiagnostics = languageService.getSemanticDiagnostics(jsDocument.uri); return syntaxDiagnostics.concat(semanticDiagnostics).map((diag: ts.Diagnostic): Diagnostic => { return { - range: convertRange(currentTextDocument, diag), + range: convertRange(jsDocument, diag), severity: DiagnosticSeverity.Error, source: languageId, message: ts.flattenDiagnosticMessageText(diag.messageText, '\n') }; }); }, - doComplete(document: TextDocument, position: Position): CompletionList { - updateCurrentTextDocument(document); - let offset = currentTextDocument.offsetAt(position); - let completions = jsLanguageService.getCompletionsAtPosition(workingFile, offset, { includeExternalModuleExports: false, includeInsertTextCompletions: false }); + async doComplete(document: TextDocument, position: Position, _documentContext: DocumentContext): Promise { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + let offset = jsDocument.offsetAt(position); + let completions = jsLanguageService.getCompletionsAtPosition(jsDocument.uri, offset, { includeExternalModuleExports: false, includeInsertTextCompletions: false }); if (!completions) { return { isIncomplete: false, items: [] }; } - let replaceRange = convertRange(currentTextDocument, getWordAtText(currentTextDocument.getText(), offset, JS_WORD_REGEX)); + let replaceRange = convertRange(jsDocument, getWordAtText(jsDocument.getText(), offset, JS_WORD_REGEX)); return { isIncomplete: false, items: completions.entries.map(entry => { @@ -115,9 +126,10 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + let details = jsLanguageService.getCompletionEntryDetails(jsDocument.uri, item.data.offset, item.label, undefined, undefined, undefined); if (details) { item.detail = ts.displayPartsToString(details.displayParts); item.documentation = ts.displayPartsToString(details.documentation); @@ -125,21 +137,23 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + let info = jsLanguageService.getQuickInfoAtPosition(jsDocument.uri, jsDocument.offsetAt(position)); if (info) { let contents = ts.displayPartsToString(info.displayParts); return { - range: convertRange(currentTextDocument, info.textSpan), + range: convertRange(jsDocument, info.textSpan), contents: MarkedString.fromPlainText(contents) }; } return null; }, - doSignatureHelp(document: TextDocument, position: Position): SignatureHelp | null { - updateCurrentTextDocument(document); - let signHelp = jsLanguageService.getSignatureHelpItems(workingFile, currentTextDocument.offsetAt(position), undefined); + async doSignatureHelp(document: TextDocument, position: Position): Promise { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + let signHelp = jsLanguageService.getSignatureHelpItems(jsDocument.uri, jsDocument.offsetAt(position), undefined); if (signHelp) { let ret: SignatureHelp = { activeSignature: signHelp.selectedItemIndex, @@ -174,23 +188,25 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + const highlights = jsLanguageService.getDocumentHighlights(jsDocument.uri, jsDocument.offsetAt(position), [jsDocument.uri]); const out: DocumentHighlight[] = []; for (const entry of highlights || []) { for (const highlight of entry.highlightSpans) { out.push({ - range: convertRange(currentTextDocument, highlight.textSpan), + range: convertRange(jsDocument, highlight.textSpan), kind: highlight.kind === 'writtenReference' ? DocumentHighlightKind.Write : DocumentHighlightKind.Text }); } } return out; }, - findDocumentSymbols(document: TextDocument): SymbolInformation[] { - updateCurrentTextDocument(document); - let items = jsLanguageService.getNavigationBarItems(workingFile); + async findDocumentSymbols(document: TextDocument): Promise { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + let items = jsLanguageService.getNavigationBarItems(jsDocument.uri); if (items) { let result: SymbolInformation[] = []; let existing = Object.create(null); @@ -202,7 +218,7 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + let definition = jsLanguageService.getDefinitionAtPosition(jsDocument.uri, jsDocument.offsetAt(position)); if (definition) { - return definition.filter(d => d.fileName === workingFile).map(d => { + return definition.filter(d => d.fileName === jsDocument.uri).map(d => { return { uri: document.uri, - range: convertRange(currentTextDocument, d.textSpan) + range: convertRange(jsDocument, d.textSpan) }; }); } return null; }, - findReferences(document: TextDocument, position: Position): Location[] { - updateCurrentTextDocument(document); - let references = jsLanguageService.getReferencesAtPosition(workingFile, currentTextDocument.offsetAt(position)); + async findReferences(document: TextDocument, position: Position): Promise { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + let references = jsLanguageService.getReferencesAtPosition(jsDocument.uri, jsDocument.offsetAt(position)); if (references) { - return references.filter(d => d.fileName === workingFile).map(d => { + return references.filter(d => d.fileName === jsDocument.uri).map(d => { return { uri: document.uri, - range: convertRange(currentTextDocument, d.textSpan) + range: convertRange(jsDocument, d.textSpan) }; }); } return []; }, - getSelectionRange(document: TextDocument, position: Position): SelectionRange { - updateCurrentTextDocument(document); + async getSelectionRange(document: TextDocument, position: Position): Promise { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); function convertSelectionRange(selectionRange: ts.SelectionRange): SelectionRange { const parent = selectionRange.parent ? convertSelectionRange(selectionRange.parent) : undefined; - return SelectionRange.create(convertRange(currentTextDocument, selectionRange.textSpan), parent); + return SelectionRange.create(convertRange(jsDocument, selectionRange.textSpan), parent); } - const range = jsLanguageService.getSmartSelectionRange(workingFile, currentTextDocument.offsetAt(position)); + const range = jsLanguageService.getSmartSelectionRange(jsDocument.uri, jsDocument.offsetAt(position)); return convertSelectionRange(range); }, - format(document: TextDocument, range: Range, formatParams: FormattingOptions, settings: Settings = globalSettings): TextEdit[] { - currentTextDocument = documentRegions.get(document).getEmbeddedDocument('javascript', true); - scriptFileVersion++; + async format(document: TextDocument, range: Range, formatParams: FormattingOptions, settings: Settings = globalSettings): Promise { + const jsDocument = documentRegions.get(document).getEmbeddedDocument('javascript', true); + const jsLanguageService = await host.getLanguageService(jsDocument); let formatterSettings = settings && settings.javascript && settings.javascript.format; let initialIndentLevel = computeInitialIndent(document, range, formatParams); let formatSettings = convertOptions(formatParams, formatterSettings, initialIndentLevel + 1); - let start = currentTextDocument.offsetAt(range.start); - let end = currentTextDocument.offsetAt(range.end); + let start = jsDocument.offsetAt(range.start); + let end = jsDocument.offsetAt(range.end); let lastLineRange = null; - if (range.end.line > range.start.line && (range.end.character === 0 || isWhitespaceOnly(currentTextDocument.getText().substr(end - range.end.character, range.end.character)))) { + if (range.end.line > range.start.line && (range.end.character === 0 || isWhitespaceOnly(jsDocument.getText().substr(end - range.end.character, range.end.character)))) { end -= range.end.character; lastLineRange = Range.create(Position.create(range.end.line, 0), range.end); } - let edits = jsLanguageService.getFormattingEditsForRange(workingFile, start, end, formatSettings); + let edits = jsLanguageService.getFormattingEditsForRange(jsDocument.uri, start, end, formatSettings); if (edits) { let result = []; for (let edit of edits) { if (edit.span.start >= start && edit.span.start + edit.span.length <= end) { result.push({ - range: convertRange(currentTextDocument, edit.span), + range: convertRange(jsDocument, edit.span), newText: edit.newText }); } @@ -295,12 +314,13 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + let spans = jsLanguageService.getOutliningSpans(jsDocument.uri); let ranges: FoldingRange[] = []; for (let span of spans) { - let curr = convertRange(currentTextDocument, span.textSpan); + let curr = convertRange(jsDocument, span.textSpan); let startLine = curr.start.line; let endLine = curr.end.line; if (startLine < endLine) { @@ -317,15 +337,16 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache { + const jsDocument = jsDocuments.get(document); + const jsLanguageService = await host.getLanguageService(jsDocument); + return getSemanticTokens(jsLanguageService, jsDocument, jsDocument.uri); }, getSemanticTokenLegend(): { types: string[], modifiers: string[] } { return getSemanticTokenLegend(); }, dispose() { - jsLanguageService.dispose(); + host.dispose(); jsDocuments.dispose(); } }; diff --git a/extensions/html-language-features/server/src/modes/languageModes.ts b/extensions/html-language-features/server/src/modes/languageModes.ts index a69a2516dcf..e47df5a797b 100644 --- a/extensions/html-language-features/server/src/modes/languageModes.ts +++ b/extensions/html-language-features/server/src/modes/languageModes.ts @@ -16,6 +16,7 @@ import { getCSSMode } from './cssMode'; import { getDocumentRegions, HTMLDocumentRegions } from './embeddedSupport'; import { getHTMLMode } from './htmlMode'; import { getJavaScriptMode } from './javascriptMode'; +import { RequestService } from '../requests'; export * from 'vscode-html-languageservice'; export { WorkspaceFolder } from 'vscode-languageserver'; @@ -40,32 +41,33 @@ export interface SemanticTokenData { export interface LanguageMode { getId(): string; - getSelectionRange?: (document: TextDocument, position: Position) => SelectionRange; - doValidation?: (document: TextDocument, settings?: Settings) => Diagnostic[]; - doComplete?: (document: TextDocument, position: Position, settings?: Settings) => CompletionList; - doResolve?: (document: TextDocument, item: CompletionItem) => CompletionItem; - doHover?: (document: TextDocument, position: Position) => Hover | null; - doSignatureHelp?: (document: TextDocument, position: Position) => SignatureHelp | null; - doRename?: (document: TextDocument, position: Position, newName: string) => WorkspaceEdit | null; - doOnTypeRename?: (document: TextDocument, position: Position) => Range[] | null; - findDocumentHighlight?: (document: TextDocument, position: Position) => DocumentHighlight[]; - findDocumentSymbols?: (document: TextDocument) => SymbolInformation[]; - findDocumentLinks?: (document: TextDocument, documentContext: DocumentContext) => DocumentLink[]; - findDefinition?: (document: TextDocument, position: Position) => Definition | null; - findReferences?: (document: TextDocument, position: Position) => Location[]; - format?: (document: TextDocument, range: Range, options: FormattingOptions, settings?: Settings) => TextEdit[]; - findDocumentColors?: (document: TextDocument) => ColorInformation[]; - getColorPresentations?: (document: TextDocument, color: Color, range: Range) => ColorPresentation[]; - doAutoClose?: (document: TextDocument, position: Position) => string | null; - findMatchingTagPosition?: (document: TextDocument, position: Position) => Position | null; - getFoldingRanges?: (document: TextDocument) => FoldingRange[]; + getSelectionRange?: (document: TextDocument, position: Position) => Promise; + doValidation?: (document: TextDocument, settings?: Settings) => Promise; + doComplete?: (document: TextDocument, position: Position, documentContext: DocumentContext, settings?: Settings) => Promise; + doResolve?: (document: TextDocument, item: CompletionItem) => Promise; + doHover?: (document: TextDocument, position: Position) => Promise; + doSignatureHelp?: (document: TextDocument, position: Position) => Promise; + doRename?: (document: TextDocument, position: Position, newName: string) => Promise; + doOnTypeRename?: (document: TextDocument, position: Position) => Promise; + findDocumentHighlight?: (document: TextDocument, position: Position) => Promise; + findDocumentSymbols?: (document: TextDocument) => Promise; + findDocumentLinks?: (document: TextDocument, documentContext: DocumentContext) => Promise; + findDefinition?: (document: TextDocument, position: Position) => Promise; + findReferences?: (document: TextDocument, position: Position) => Promise; + format?: (document: TextDocument, range: Range, options: FormattingOptions, settings?: Settings) => Promise; + findDocumentColors?: (document: TextDocument) => Promise; + getColorPresentations?: (document: TextDocument, color: Color, range: Range) => Promise; + doAutoClose?: (document: TextDocument, position: Position) => Promise; + findMatchingTagPosition?: (document: TextDocument, position: Position) => Promise; + getFoldingRanges?: (document: TextDocument) => Promise; onDocumentRemoved(document: TextDocument): void; - getSemanticTokens?(document: TextDocument): SemanticTokenData[]; + getSemanticTokens?(document: TextDocument): Promise; getSemanticTokenLegend?(): { types: string[], modifiers: string[] }; dispose(): void; } export interface LanguageModes { + updateDataProviders(dataProviders: IHTMLDataProvider[]): void; getModeAtPosition(document: TextDocument, position: Position): LanguageMode | undefined; getModesInRange(document: TextDocument, range: Range): LanguageModeRange[]; getAllModes(): LanguageMode[]; @@ -80,9 +82,9 @@ export interface LanguageModeRange extends Range { attributeValue?: boolean; } -export function getLanguageModes(supportedLanguages: { [languageId: string]: boolean; }, workspace: Workspace, clientCapabilities: ClientCapabilities, customDataProviders?: IHTMLDataProvider[]): LanguageModes { - const htmlLanguageService = getHTMLLanguageService({ customDataProviders, clientCapabilities }); - const cssLanguageService = getCSSLanguageService({ clientCapabilities }); +export function getLanguageModes(supportedLanguages: { [languageId: string]: boolean; }, workspace: Workspace, clientCapabilities: ClientCapabilities, requestService: RequestService): LanguageModes { + const htmlLanguageService = getHTMLLanguageService({ clientCapabilities, fileSystemProvider: requestService }); + const cssLanguageService = getCSSLanguageService({ clientCapabilities, fileSystemProvider: requestService }); let documentRegions = getLanguageModelCache(10, 60, document => getDocumentRegions(htmlLanguageService, document)); @@ -99,6 +101,9 @@ export function getLanguageModes(supportedLanguages: { [languageId: string]: boo modes['typescript'] = getJavaScriptMode(documentRegions, 'typescript', workspace); } return { + async updateDataProviders(dataProviders: IHTMLDataProvider[]): Promise { + htmlLanguageService.setDataProviders(true, dataProviders); + }, getModeAtPosition(document: TextDocument, position: Position): LanguageMode | undefined { let languageId = documentRegions.get(document).getLanguageAtPosition(position); if (languageId) { diff --git a/extensions/html-language-features/server/src/modes/pathCompletion.ts b/extensions/html-language-features/server/src/modes/pathCompletion.ts deleted file mode 100644 index d522efdc0df..00000000000 --- a/extensions/html-language-features/server/src/modes/pathCompletion.ts +++ /dev/null @@ -1,183 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as path from 'path'; -import * as fs from 'fs'; -import { URI } from 'vscode-uri'; -import { ICompletionParticipant, TextDocument, CompletionItemKind, CompletionItem, TextEdit, Range, Position, WorkspaceFolder } from './languageModes'; -import { startsWith } from '../utils/strings'; -import { contains } from '../utils/arrays'; - -export function getPathCompletionParticipant( - document: TextDocument, - workspaceFolders: WorkspaceFolder[], - result: CompletionItem[] -): ICompletionParticipant { - return { - onHtmlAttributeValue: ({ tag, attribute, value: valueBeforeCursor, range }) => { - const fullValue = stripQuotes(document.getText(range)); - - if (shouldDoPathCompletion(tag, attribute, fullValue)) { - if (workspaceFolders.length === 0) { - return; - } - const workspaceRoot = resolveWorkspaceRoot(document, workspaceFolders); - - const paths = providePaths(valueBeforeCursor, URI.parse(document.uri).fsPath, workspaceRoot); - result.push(...paths.map(p => pathToSuggestion(p, valueBeforeCursor, fullValue, range))); - } - } - }; -} - -function stripQuotes(fullValue: string) { - if (startsWith(fullValue, `'`) || startsWith(fullValue, `"`)) { - return fullValue.slice(1, -1); - } else { - return fullValue; - } -} - -function shouldDoPathCompletion(tag: string, attr: string, value: string) { - if (startsWith(value, 'http') || startsWith(value, 'https') || startsWith(value, '//')) { - return false; - } - - if (PATH_TAG_AND_ATTR[tag]) { - if (typeof PATH_TAG_AND_ATTR[tag] === 'string') { - return PATH_TAG_AND_ATTR[tag] === attr; - } else { - return contains(PATH_TAG_AND_ATTR[tag], attr); - } - } - - return false; -} - -/** - * Get a list of path suggestions. Folder suggestions are suffixed with a slash. - */ -function providePaths(valueBeforeCursor: string, activeDocFsPath: string, root?: string): string[] { - const lastIndexOfSlash = valueBeforeCursor.lastIndexOf('/'); - const valueBeforeLastSlash = valueBeforeCursor.slice(0, lastIndexOfSlash + 1); - - const startsWithSlash = startsWith(valueBeforeCursor, '/'); - let parentDir: string; - if (startsWithSlash) { - if (!root) { - return []; - } - parentDir = path.resolve(root, '.' + valueBeforeLastSlash); - } else { - parentDir = path.resolve(activeDocFsPath, '..', valueBeforeLastSlash); - } - - try { - const paths = fs.readdirSync(parentDir).map(f => { - return isDir(path.resolve(parentDir, f)) - ? f + '/' - : f; - }); - return paths.filter(p => p[0] !== '.'); - } catch (e) { - return []; - } -} - -function isDir(p: string) { - try { - return fs.statSync(p).isDirectory(); - } catch (e) { - return false; - } -} - -function pathToSuggestion(p: string, valueBeforeCursor: string, fullValue: string, range: Range): CompletionItem { - const isDir = p[p.length - 1] === '/'; - - let replaceRange: Range; - const lastIndexOfSlash = valueBeforeCursor.lastIndexOf('/'); - if (lastIndexOfSlash === -1) { - replaceRange = shiftRange(range, 1, -1); - } else { - // For cases where cursor is in the middle of attribute value, like ', { + test('HTML JavaScript Completions', async () => { + await testCompletionFor('', { items: [ { label: 'location', resultText: '' }, ] }); - testCompletionFor('', { + await testCompletionFor('', { items: [ { label: 'getJSON', resultText: '' }, ] }); + await testCompletionFor('', { + items: [ + { label: 'a', resultText: '' }, + ] + }, 'test://test/test2.html'); }); }); @@ -96,8 +105,8 @@ suite('HTML Path Completion', () => { const indexHtmlUri = URI.file(path.resolve(fixtureRoot, 'index.html')).toString(); const aboutHtmlUri = URI.file(path.resolve(fixtureRoot, 'about/about.html')).toString(); - test('Basics - Correct label/kind/result/command', () => { - testCompletionFor('', '\n\n\n \n\n\n'); - assertFormat('', '\n\n\n \n\n\n'); - assertFormat('', '\n\n\n \n\n\n'); - assertFormat('\n ', '\n\n\n \n\n\n'); - assertFormat('\n ', '\n\n\n \n\n\n'); - assertFormat('\n ||', '\n '); + test('HTML & Scripts', async () => { + await assertFormat('', '\n\n\n \n\n\n'); + await assertFormat('', '\n\n\n \n\n\n'); + await assertFormat('', '\n\n\n \n\n\n'); + await assertFormat('\n ', '\n\n\n \n\n\n'); + await assertFormat('\n ', '\n\n\n \n\n\n'); + await assertFormat('\n ||', '\n '); }); - test('HTLM & Scripts - Fixtures', function () { + test('HTLM & Scripts - Fixtures', async () => { assertFormatWithFixture('19813.html', '19813.html'); assertFormatWithFixture('19813.html', '19813-4spaces.html', undefined, FormattingOptions.create(4, true)); assertFormatWithFixture('19813.html', '19813-tab.html', undefined, FormattingOptions.create(1, false)); assertFormatWithFixture('21634.html', '21634.html'); }); - test('Script end tag', function (): any { - assertFormat('\n\n ', '\n\n\n \n\n\n'); + test('Script end tag', async () => { + await assertFormat('\n\n ', '\n\n\n \n\n\n'); }); - test('HTML & Multiple Scripts', function (): any { - assertFormat('\n', '\n\n\n \n \n\n\n'); + test('HTML & Multiple Scripts', async () => { + await assertFormat('\n', '\n\n\n \n \n\n\n'); }); - test('HTML & Styles', function (): any { - assertFormat('\n', '\n\n\n \n\n\n'); + test('HTML & Styles', async () => { + await assertFormat('\n', '\n\n\n \n\n\n'); }); - test('EndWithNewline', function (): any { + test('EndWithNewline', async () => { let options = { html: { format: { @@ -91,26 +92,26 @@ suite('HTML Embedded Formatting', () => { } } }; - assertFormat('

Hello

', '\n\n\n

Hello

\n\n\n\n', options); - assertFormat('|

Hello

|', '\n

Hello

\n', options); - assertFormat('', '\n\n\n \n\n\n\n', options); + await assertFormat('

Hello

', '\n\n\n

Hello

\n\n\n\n', options); + await assertFormat('|

Hello

|', '\n

Hello

\n', options); + await assertFormat('', '\n\n\n \n\n\n\n', options); }); - test('Inside script', function (): any { - assertFormat('\n ', '\n '); - assertFormat('\n ', '\n '); + test('Inside script', async () => { + await assertFormat('\n ', '\n '); + await assertFormat('\n ', '\n '); }); - test('Range after new line', function (): any { - assertFormat('\n |\n|', '\n \n'); + test('Range after new line', async () => { + await assertFormat('\n |\n|', '\n \n'); }); - test('bug 36574', function (): any { - assertFormat('', ''); + test('bug 36574', async () => { + await assertFormat('', ''); }); - test('bug 48049', function (): any { - assertFormat( + test('bug 48049', async () => { + await assertFormat( [ '', '', @@ -158,7 +159,7 @@ suite('HTML Embedded Formatting', () => { ].join('\n') ); }); - test('#58435', () => { + test('#58435', async () => { let options = { html: { format: { @@ -189,7 +190,7 @@ suite('HTML Embedded Formatting', () => { '', ].join('\n'); - assertFormat(content, expected, options); + await assertFormat(content, expected, options); }); }); /* diff --git a/extensions/html-language-features/server/src/test/selectionRanges.test.ts b/extensions/html-language-features/server/src/test/selectionRanges.test.ts index dbc33d93a9b..9f9937bcaf7 100644 --- a/extensions/html-language-features/server/src/test/selectionRanges.test.ts +++ b/extensions/html-language-features/server/src/test/selectionRanges.test.ts @@ -7,8 +7,9 @@ import 'mocha'; import * as assert from 'assert'; import { getLanguageModes, ClientCapabilities, TextDocument, SelectionRange} from '../modes/languageModes'; import { getSelectionRanges } from '../modes/selectionRanges'; +import { getNodeFSRequestService } from '../node/nodeFs'; -function assertRanges(content: string, expected: (number | string)[][]): void { +async function assertRanges(content: string, expected: (number | string)[][]): Promise { let message = `${content} gives selection range:\n`; const offset = content.indexOf('|'); @@ -18,10 +19,10 @@ function assertRanges(content: string, expected: (number | string)[][]): void { settings: {}, folders: [{ name: 'foo', uri: 'test://foo' }] }; - let languageModes = getLanguageModes({ css: true, javascript: true }, workspace, ClientCapabilities.LATEST); + const languageModes = getLanguageModes({ css: true, javascript: true }, workspace, ClientCapabilities.LATEST, getNodeFSRequestService()); const document = TextDocument.create('test://foo.html', 'html', 1, content); - const actualRanges = getSelectionRanges(languageModes, document, [document.positionAt(offset)]); + const actualRanges = await getSelectionRanges(languageModes, document, [document.positionAt(offset)]); assert.equal(actualRanges.length, 1); const offsetPairs: [number, string][] = []; let curr: SelectionRange | undefined = actualRanges[0]; @@ -35,8 +36,8 @@ function assertRanges(content: string, expected: (number | string)[][]): void { } suite('HTML SelectionRange', () => { - test('Embedded JavaScript', () => { - assertRanges('', [ + test('Embedded JavaScript', async () => { + await assertRanges('', [ [48, '1'], [48, '1+2'], [47, '(1+2)'], @@ -51,8 +52,8 @@ suite('HTML SelectionRange', () => { ]); }); - test('Embedded CSS', () => { - assertRanges('', [ + test('Embedded CSS', async () => { + await assertRanges('', [ [34, 'none'], [25, 'display: none'], [24, ' display: none; '], @@ -65,8 +66,8 @@ suite('HTML SelectionRange', () => { ]); }); - test('Embedded style', () => { - assertRanges('
', [ + test('Embedded style', async () => { + await assertRanges('
', [ [19, 'red'], [12, 'color: red'], [11, '"color: red"'], diff --git a/extensions/html-language-features/server/src/test/semanticTokens.test.ts b/extensions/html-language-features/server/src/test/semanticTokens.test.ts index ea3777e84e9..6d815748e5e 100644 --- a/extensions/html-language-features/server/src/test/semanticTokens.test.ts +++ b/extensions/html-language-features/server/src/test/semanticTokens.test.ts @@ -7,6 +7,7 @@ import 'mocha'; import * as assert from 'assert'; import { TextDocument, getLanguageModes, ClientCapabilities, Range, Position } from '../modes/languageModes'; import { newSemanticTokenProvider } from '../modes/semanticTokens'; +import { getNodeFSRequestService } from '../node/nodeFs'; interface ExpectedToken { startLine: number; @@ -15,17 +16,17 @@ interface ExpectedToken { tokenClassifiction: string; } -function assertTokens(lines: string[], expected: ExpectedToken[], ranges?: Range[], message?: string): void { +async function assertTokens(lines: string[], expected: ExpectedToken[], ranges?: Range[], message?: string): Promise { const document = TextDocument.create('test://foo/bar.html', 'html', 1, lines.join('\n')); const workspace = { settings: {}, folders: [{ name: 'foo', uri: 'test://foo' }] }; - const languageModes = getLanguageModes({ css: true, javascript: true }, workspace, ClientCapabilities.LATEST); + const languageModes = getLanguageModes({ css: true, javascript: true }, workspace, ClientCapabilities.LATEST, getNodeFSRequestService()); const semanticTokensProvider = newSemanticTokenProvider(languageModes); const legend = semanticTokensProvider.legend; - const actual = semanticTokensProvider.getSemanticTokens(document, ranges); + const actual = await semanticTokensProvider.getSemanticTokens(document, ranges); let actualRanges = []; let lastLine = 0; @@ -48,7 +49,7 @@ function t(startLine: number, character: number, length: number, tokenClassifict suite('HTML Semantic Tokens', () => { - test('Variables', () => { + test('Variables', async () => { const input = [ /*0*/'', /*1*/'', @@ -63,7 +64,7 @@ suite('HTML Semantic Tokens', () => { /*10*/'', /*11*/'', ]; - assertTokens(input, [ + await assertTokens(input, [ t(3, 6, 1, 'variable.declaration'), t(3, 13, 2, 'variable.declaration'), t(3, 19, 1, 'variable'), t(5, 15, 1, 'variable.declaration.readonly'), t(5, 20, 2, 'variable'), t(5, 26, 1, 'variable'), t(5, 30, 1, 'variable.readonly'), t(6, 11, 1, 'variable.declaration'), @@ -71,7 +72,7 @@ suite('HTML Semantic Tokens', () => { ]); }); - test('Functions', () => { + test('Functions', async () => { const input = [ /*0*/'', /*1*/'', @@ -84,14 +85,14 @@ suite('HTML Semantic Tokens', () => { /*8*/'', /*9*/'', ]; - assertTokens(input, [ + await assertTokens(input, [ t(3, 11, 3, 'function.declaration'), t(3, 15, 2, 'parameter.declaration'), t(4, 11, 3, 'function'), t(4, 15, 4, 'interface'), t(4, 20, 3, 'member'), t(4, 24, 2, 'parameter'), t(6, 6, 6, 'variable'), t(6, 13, 8, 'property'), t(6, 24, 5, 'member'), t(6, 35, 7, 'member'), t(6, 43, 1, 'parameter.declaration'), t(6, 48, 3, 'function'), t(6, 52, 1, 'parameter') ]); }); - test('Members', () => { + test('Members', async () => { const input = [ /*0*/'', /*1*/'', @@ -110,7 +111,7 @@ suite('HTML Semantic Tokens', () => { ]; - assertTokens(input, [ + await assertTokens(input, [ t(3, 8, 1, 'class.declaration'), t(4, 11, 1, 'property.declaration.static'), t(5, 4, 1, 'property.declaration'), @@ -120,7 +121,7 @@ suite('HTML Semantic Tokens', () => { ]); }); - test('Interfaces', () => { + test('Interfaces', async () => { const input = [ /*0*/'', /*1*/'', @@ -132,14 +133,14 @@ suite('HTML Semantic Tokens', () => { /*7*/'', /*8*/'', ]; - assertTokens(input, [ + await assertTokens(input, [ t(3, 12, 8, 'interface.declaration'), t(3, 23, 1, 'property.declaration'), t(3, 34, 1, 'property.declaration'), t(4, 8, 1, 'variable.declaration.readonly'), t(4, 30, 8, 'interface'), t(5, 8, 3, 'variable.declaration.readonly'), t(5, 15, 1, 'parameter.declaration'), t(5, 18, 8, 'interface'), t(5, 31, 1, 'parameter'), t(5, 33, 1, 'property'), t(5, 37, 1, 'parameter'), t(5, 39, 1, 'property') ]); }); - test('Readonly', () => { + test('Readonly', async () => { const input = [ /*0*/'', /*1*/'', @@ -152,7 +153,7 @@ suite('HTML Semantic Tokens', () => { /*8*/'', /*9*/'', ]; - assertTokens(input, [ + await assertTokens(input, [ t(3, 8, 1, 'variable.declaration.readonly'), t(4, 8, 1, 'class.declaration'), t(4, 28, 1, 'property.declaration.static.readonly'), t(4, 42, 3, 'property.declaration.static'), t(4, 47, 3, 'interface'), t(5, 13, 1, 'enum.declaration'), t(5, 17, 1, 'property.declaration.readonly'), t(5, 24, 1, 'property.declaration.readonly'), t(5, 28, 1, 'property.readonly'), @@ -161,7 +162,7 @@ suite('HTML Semantic Tokens', () => { }); - test('Type aliases and type parameters', () => { + test('Type aliases and type parameters', async () => { const input = [ /*0*/'', /*1*/'', @@ -174,14 +175,14 @@ suite('HTML Semantic Tokens', () => { /*8*/'', /*9*/'', ]; - assertTokens(input, [ + await assertTokens(input, [ t(3, 7, 5, 'type.declaration'), t(3, 15, 3, 'interface') /* to investiagte */, t(4, 11, 1, 'function.declaration'), t(4, 13, 1, 'typeParameter.declaration'), t(4, 23, 5, 'type'), t(4, 30, 1, 'parameter.declaration'), t(4, 33, 1, 'typeParameter'), t(4, 47, 1, 'typeParameter'), t(5, 12, 1, 'typeParameter'), t(5, 29, 3, 'interface'), t(5, 41, 5, 'type'), ]); }); - test('TS and JS', () => { + test('TS and JS', async () => { const input = [ /*0*/'', /*1*/'', @@ -194,13 +195,13 @@ suite('HTML Semantic Tokens', () => { /*8*/'', /*9*/'', ]; - assertTokens(input, [ + await assertTokens(input, [ t(3, 11, 1, 'function.declaration'), t(3, 13, 1, 'typeParameter.declaration'), t(3, 16, 2, 'parameter.declaration'), t(3, 20, 1, 'typeParameter'), t(3, 24, 1, 'typeParameter'), t(3, 39, 2, 'parameter'), t(6, 2, 6, 'variable'), t(6, 9, 5, 'member') ]); }); - test('Ranges', () => { + test('Ranges', async () => { const input = [ /*0*/'', /*1*/'', @@ -213,11 +214,11 @@ suite('HTML Semantic Tokens', () => { /*8*/'', /*9*/'', ]; - assertTokens(input, [ + await assertTokens(input, [ t(3, 2, 6, 'variable'), t(3, 9, 5, 'member') ], [Range.create(Position.create(2, 0), Position.create(4, 0))]); - assertTokens(input, [ + await assertTokens(input, [ t(6, 2, 6, 'variable'), ], [Range.create(Position.create(6, 2), Position.create(6, 8))]); }); diff --git a/extensions/html-language-features/server/src/utils/documentContext.ts b/extensions/html-language-features/server/src/utils/documentContext.ts index 0f728860de8..f8bc67f8b10 100644 --- a/extensions/html-language-features/server/src/utils/documentContext.ts +++ b/extensions/html-language-features/server/src/utils/documentContext.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DocumentContext, WorkspaceFolder } from '../modes/languageModes'; +import { DocumentContext } from 'vscode-css-languageservice'; import { endsWith, startsWith } from '../utils/strings'; -import * as url from 'url'; +import { WorkspaceFolder } from 'vscode-languageserver'; +import { resolvePath } from '../requests'; export function getDocumentContext(documentUri: string, workspaceFolders: WorkspaceFolder[]): DocumentContext { function getRootFolder(): string | undefined { @@ -22,20 +23,15 @@ export function getDocumentContext(documentUri: string, workspaceFolders: Worksp } return { - resolveReference: (ref, base = documentUri) => { + resolveReference: (ref: string, base = documentUri) => { if (ref[0] === '/') { // resolve absolute path against the current workspace folder - if (startsWith(base, 'file://')) { - let folderUri = getRootFolder(); - if (folderUri) { - return folderUri + ref.substr(1); - } + let folderUri = getRootFolder(); + if (folderUri) { + return folderUri + ref.substr(1); } } - try { - return url.resolve(base, ref); - } catch { - return ''; - } + base = base.substr(0, base.lastIndexOf('/') + 1); + return resolvePath(base, ref); }, }; } diff --git a/extensions/html-language-features/server/src/utils/runner.ts b/extensions/html-language-features/server/src/utils/runner.ts index 98a7a96f9aa..6bf8a88d0c6 100644 --- a/extensions/html-language-features/server/src/utils/runner.ts +++ b/extensions/html-language-features/server/src/utils/runner.ts @@ -17,7 +17,7 @@ export function formatError(message: string, err: any): string { return message; } -export function runSafeAsync(func: () => Thenable, errorVal: T, errorMessage: string, token: CancellationToken): Thenable> { +export function runSafe(func: () => Thenable, errorVal: T, errorMessage: string, token: CancellationToken): Thenable> { return new Promise>((resolve) => { setImmediate(() => { if (token.isCancellationRequested) { @@ -38,29 +38,7 @@ export function runSafeAsync(func: () => Thenable, errorVal: T, errorMessa }); } -export function runSafe(func: () => T, errorVal: T, errorMessage: string, token: CancellationToken): Thenable> { - return new Promise>((resolve) => { - setImmediate(() => { - if (token.isCancellationRequested) { - resolve(cancelValue()); - } else { - try { - let result = func(); - if (token.isCancellationRequested) { - resolve(cancelValue()); - return; - } else { - resolve(result); - } - } catch (e) { - console.error(formatError(errorMessage, e)); - resolve(errorVal); - } - } - }); - }); -} function cancelValue() { return new ResponseError(ErrorCodes.RequestCancelled, 'Request cancelled'); diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index 41ff086ca26..0778b5468ac 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -726,66 +726,61 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -vscode-css-languageservice@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.2.0.tgz#56081374857ce8aa4dd4c98f97e4e10a30b7242f" - integrity sha512-HIjl5bofrrxMMF05K/nq83270EdvteuAIio44FWd6tDdfhgg4vbofiAuXRSpXFi335f5+ekKdrzvPZm9ahqzsg== +vscode-css-languageservice@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.3.0.tgz#40c797d664ab6188cace33cfbb19b037580a9318" + integrity sha512-BkQAMz4oVHjr0oOAz5PdeE72txlLQK7NIwzmclfr+b6fj6I8POwB+VoXvrZLTbWt9hWRgfvgiQRkh5JwrjPJ5A== dependencies: vscode-languageserver-textdocument "^1.0.1" - vscode-languageserver-types "^3.15.1" + vscode-languageserver-types "3.16.0-next.2" vscode-nls "^4.1.2" - vscode-uri "^2.1.1" + vscode-uri "^2.1.2" -vscode-html-languageservice@^3.1.0-next.2: - version "3.1.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-3.1.0-next.2.tgz#a6ad42ed0ad0adda9ad0c5d34b2ac0d05076190e" - integrity sha512-cohfk2Ez8MrnT/8upnKsOc2FK2T+lU2LsBgg0L2P2BHjVzq4LMCOiYcwNeq+u9y2L5ck9E6SFw1BTdyZ5377KQ== +vscode-html-languageservice@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-3.1.0.tgz#265b53bda595e6947b16b0fb8c604e1e58685393" + integrity sha512-QAyRHI98bbEIBCqTzZVA0VblGU40na0txggongw5ZgTj9UVsVk5XbLT16O9OTcbqBGSqn0oWmFDNjK/XGIDcqg== dependencies: vscode-languageserver-textdocument "^1.0.1" - vscode-languageserver-types "^3.15.1" + vscode-languageserver-types "3.16.0-next.2" vscode-nls "^4.1.2" - vscode-uri "^2.1.1" + vscode-uri "^2.1.2" -vscode-jsonrpc@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794" - integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A== +vscode-jsonrpc@6.0.0-next.2: + version "6.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.2.tgz#3d73f86d812304cb91b9fb1efee40ec60b09ed7f" + integrity sha512-dKQXRYNUY6BHALQJBJlyZyv9oWlYpbJ2vVoQNNVNPLAYQ3hzNp4zy+iSo7zGx1BPXByArJQDWTKLQh8dz3dnNw== -vscode-languageserver-protocol@^3.15.3: - version "3.15.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb" - integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw== +vscode-languageserver-protocol@3.16.0-next.4: + version "3.16.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0-next.4.tgz#8f8b1b831d4dfd9b26aa1ba3d2a32c427a91c99f" + integrity sha512-6GmPUp2MhJy2H1CTWp2B40Pa9BeC9glrXWmQWVG6A/0V9UbcAjVC9m56znm2GL32iyLDIprTBe8gBvvvcjbpaQ== dependencies: - vscode-jsonrpc "^5.0.1" - vscode-languageserver-types "3.15.1" + vscode-jsonrpc "6.0.0-next.2" + vscode-languageserver-types "3.16.0-next.2" vscode-languageserver-textdocument@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f" integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA== -vscode-languageserver-types@3.15.1, vscode-languageserver-types@^3.15.1: - version "3.15.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" - integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ== +vscode-languageserver-types@3.16.0-next.2: + version "3.16.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083" + integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q== -vscode-languageserver@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz#d76afc68172c27d4327ee74332b468fbc740d762" - integrity sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ== +vscode-languageserver@7.0.0-next.3: + version "7.0.0-next.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-7.0.0-next.3.tgz#3833bd09259a4a085baeba90783f1e4d06d81095" + integrity sha512-qSt8eb546iFuoFIN+9MPl4Avru6Iz2/JP0UmS/3djf40ICa31Np/yJ7anX2j0Az5rCzb0fak8oeKwDioGeVOYg== dependencies: - vscode-languageserver-protocol "^3.15.3" + vscode-languageserver-protocol "3.16.0-next.4" vscode-nls@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== -vscode-uri@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.1.tgz#5aa1803391b6ebdd17d047f51365cf62c38f6e90" - integrity sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A== - vscode-uri@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" diff --git a/extensions/html-language-features/yarn.lock b/extensions/html-language-features/yarn.lock index fd8ffd55140..0d4b9507c21 100644 --- a/extensions/html-language-features/yarn.lock +++ b/extensions/html-language-features/yarn.lock @@ -45,31 +45,31 @@ vscode-extension-telemetry@0.1.1: dependencies: applicationinsights "1.0.8" -vscode-jsonrpc@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794" - integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A== +vscode-jsonrpc@6.0.0-next.2: + version "6.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.2.tgz#3d73f86d812304cb91b9fb1efee40ec60b09ed7f" + integrity sha512-dKQXRYNUY6BHALQJBJlyZyv9oWlYpbJ2vVoQNNVNPLAYQ3hzNp4zy+iSo7zGx1BPXByArJQDWTKLQh8dz3dnNw== -vscode-languageclient@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-6.1.3.tgz#c979c5bb5855714a0307e998c18ca827c1b3953a" - integrity sha512-YciJxk08iU5LmWu7j5dUt9/1OLjokKET6rME3cI4BRpiF6HZlusm2ZwPt0MYJ0lV5y43sZsQHhyon2xBg4ZJVA== +vscode-languageclient@7.0.0-next.5.1: + version "7.0.0-next.5.1" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-7.0.0-next.5.1.tgz#ed93f14e4c2cdccedf15002c7bf8ef9cb638f36c" + integrity sha512-OONvbk3IFpubwF8/Y5uPQaq5J5CEskpeET3SfK4iGlv5OUK+44JawH/SEW5wXuEPpfdMLEMZLuGLU5v5d7N7PQ== dependencies: semver "^6.3.0" - vscode-languageserver-protocol "^3.15.3" + vscode-languageserver-protocol "3.16.0-next.4" -vscode-languageserver-protocol@^3.15.3: - version "3.15.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb" - integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw== +vscode-languageserver-protocol@3.16.0-next.4: + version "3.16.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0-next.4.tgz#8f8b1b831d4dfd9b26aa1ba3d2a32c427a91c99f" + integrity sha512-6GmPUp2MhJy2H1CTWp2B40Pa9BeC9glrXWmQWVG6A/0V9UbcAjVC9m56znm2GL32iyLDIprTBe8gBvvvcjbpaQ== dependencies: - vscode-jsonrpc "^5.0.1" - vscode-languageserver-types "3.15.1" + vscode-jsonrpc "6.0.0-next.2" + vscode-languageserver-types "3.16.0-next.2" -vscode-languageserver-types@3.15.1: - version "3.15.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" - integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ== +vscode-languageserver-types@3.16.0-next.2: + version "3.16.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083" + integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q== vscode-nls@^4.1.2: version "4.1.2" diff --git a/extensions/image-preview/extension-browser.webpack.config.js b/extensions/image-preview/extension-browser.webpack.config.js index 56372a02bfe..9a1bb4d3c8e 100644 --- a/extensions/image-preview/extension-browser.webpack.config.js +++ b/extensions/image-preview/extension-browser.webpack.config.js @@ -7,23 +7,11 @@ 'use strict'; -const withDefaults = require('../shared.webpack.config'); -const path = require('path'); +const withBrowserDefaults = require('../shared.webpack.config').browser; -const clientConfig = withDefaults({ +module.exports = withBrowserDefaults({ context: __dirname, - target: 'webworker', entry: { extension: './src/extension.ts' }, - resolve: { - alias: { - 'vscode-extension-telemetry': path.resolve(__dirname, '../../build/polyfills/vscode-extension-telemetry.js'), - 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js'), - }, - } }); - -clientConfig.module.rules[0].use.shift(); // remove nls loader - -module.exports = clientConfig; diff --git a/extensions/image-preview/package.json b/extensions/image-preview/package.json index 2284ceb2ef5..dd04cc77771 100644 --- a/extensions/image-preview/package.json +++ b/extensions/image-preview/package.json @@ -16,7 +16,7 @@ "vscode": "^1.39.0" }, "main": "./out/extension", - "browser": "./dist/extension.js", + "browser": "./dist/browser/extension.js", "categories": [ "Other" ], diff --git a/extensions/javascript/snippets/javascript.code-snippets b/extensions/javascript/snippets/javascript.code-snippets index 5da4ebe0c18..fc892b57e92 100644 --- a/extensions/javascript/snippets/javascript.code-snippets +++ b/extensions/javascript/snippets/javascript.code-snippets @@ -173,8 +173,7 @@ "Log to the console": { "prefix": "log", "body": [ - "console.log($1);", - "$0" + "console.log($1);" ], "description": "Log to the console" }, @@ -182,7 +181,6 @@ "prefix": "warn", "body": [ "console.warn($1);", - "$0" ], "description": "Log warning to the console" }, @@ -190,7 +188,6 @@ "prefix": "error", "body": [ "console.error($1);", - "$0" ], "description": "Log error to the console" } diff --git a/extensions/json-language-features/extension-browser.webpack.config.js b/extensions/json-language-features/extension-browser.webpack.config.js index 90685bcd30f..900ef6a3b12 100644 --- a/extensions/json-language-features/extension-browser.webpack.config.js +++ b/extensions/json-language-features/extension-browser.webpack.config.js @@ -7,10 +7,10 @@ 'use strict'; -const withDefaults = require('../shared.webpack.config'); +const withBrowserDefaults = require('../shared.webpack.config').browser; const path = require('path'); -const clientConfig = withDefaults({ +module.exports = withBrowserDefaults({ target: 'webworker', context: path.join(__dirname, 'client'), entry: { @@ -19,16 +19,5 @@ const clientConfig = withDefaults({ output: { filename: 'jsonClientMain.js', path: path.join(__dirname, 'client', 'dist', 'browser') - }, - performance: { - hints: false - }, - resolve: { - alias: { - 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') - } } }); -clientConfig.module.rules[0].use.shift(); // remove nls loader - -module.exports = clientConfig; diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 6c7e2d7cf78..db003f05121 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -129,7 +129,7 @@ "dependencies": { "request-light": "^0.3.0", "vscode-extension-telemetry": "0.1.1", - "vscode-languageclient": "7.0.0-next.5", + "vscode-languageclient": "7.0.0-next.5.1", "vscode-nls": "^4.1.2" }, "devDependencies": { diff --git a/extensions/json-language-features/package.nls.json b/extensions/json-language-features/package.nls.json index abf7d17b925..59729a0ee99 100644 --- a/extensions/json-language-features/package.nls.json +++ b/extensions/json-language-features/package.nls.json @@ -3,7 +3,7 @@ "description": "Provides rich language support for JSON files.", "json.schemas.desc": "Associate schemas to JSON files in the current project", "json.schemas.url.desc": "A URL to a schema or a relative path to a schema in the current directory", - "json.schemas.fileMatch.desc": "An array of file patterns to match against when resolving JSON files to schemas. `*` can be used as a wildcard. Exclusion patterns can also be defined and start with '!'. A file matches when there at least one matching pattern and the last matching pattern is not an exclusion pattern.", + "json.schemas.fileMatch.desc": "An array of file patterns to match against when resolving JSON files to schemas. `*` can be used as a wildcard. Exclusion patterns can also be defined and start with '!'. A file matches when there is at least one matching pattern and the last matching pattern is not an exclusion pattern.", "json.schemas.fileMatch.item.desc": "A file pattern that can contain '*' to match against when resolving JSON files to schemas.", "json.schemas.schema.desc": "The schema definition for the given URL. The schema only needs to be provided to avoid accesses to the schema URL.", "json.format.enable.desc": "Enable/disable default JSON formatter", diff --git a/extensions/json-language-features/server/README.md b/extensions/json-language-features/server/README.md index edf55ce63f5..d04ff913e92 100644 --- a/extensions/json-language-features/server/README.md +++ b/extensions/json-language-features/server/README.md @@ -63,10 +63,10 @@ The server supports the following settings: - `format` - `enable`: Whether the server should register the formatting support. This option is only applicable if the client supports *dynamicRegistration* for *rangeFormatting* and `initializationOptions.provideFormatter` is not defined. - `schemas`: Configures association of file names to schema URL or schemas and/or associations of schema URL to schema content. - - `fileMatch`: an array of file names or paths (separated by `/`). `*` can be used as a wildcard. Exclusion patterns can also be defined and start with '!'. A file matches when there at least one matching pattern and the last matching pattern is not an exclusion pattern. + - `fileMatch`: an array of file names or paths (separated by `/`). `*` can be used as a wildcard. Exclusion patterns can also be defined and start with '!'. A file matches when there is at least one matching pattern and the last matching pattern is not an exclusion pattern. - `url`: The URL of the schema, optional when also a schema is provided. - `schema`: The schema content. - - `resultLimit`: The max number foldig ranges and otline symbols to be computed (for performance reasons) + - `resultLimit`: The max number folding ranges and outline symbols to be computed (for performance reasons) ```json { @@ -160,7 +160,7 @@ Notification: ### Item Limit If the setting `resultLimit` is set, the JSON language server will limit the number of folding ranges and document symbols computed. -When the limit is reached, a notification `json/resultLimitReached` is sent that can be shown that camn be shown to the user. +When the limit is reached, a notification `json/resultLimitReached` is sent that can be shown that can be shown to the user. Notification: - method: 'json/resultLimitReached' @@ -180,7 +180,7 @@ For that, install the `json-language-server` npm module: `npm install -g json-language-server` -Start the language server with the `json-language-server` command. Use a command line argument to specify the prefered communication channel: +Start the language server with the `json-language-server` command. Use a command line argument to specify the preferred communication channel: ``` json-language-server --node-ipc diff --git a/extensions/json-language-features/server/extension-browser.webpack.config.js b/extensions/json-language-features/server/extension-browser.webpack.config.js index b499a2af699..b1ae74c7b60 100644 --- a/extensions/json-language-features/server/extension-browser.webpack.config.js +++ b/extensions/json-language-features/server/extension-browser.webpack.config.js @@ -7,11 +7,10 @@ 'use strict'; -const withDefaults = require('../../shared.webpack.config'); +const withBrowserDefaults = require('../../shared.webpack.config').browser; const path = require('path'); -const serverConfig = withDefaults({ - target: 'webworker', +module.exports = withBrowserDefaults({ context: __dirname, entry: { extension: './src/browser/jsonServerMain.ts', @@ -20,16 +19,5 @@ const serverConfig = withDefaults({ filename: 'jsonServerMain.js', path: path.join(__dirname, 'dist', 'browser'), libraryTarget: 'var' - }, - performance: { - hints: false - }, - resolve: { - alias: { - 'vscode-nls': path.resolve(__dirname, '../../../build/polyfills/vscode-nls.js') - } } }); -serverConfig.module.rules[0].use.shift(); // remove nls loader - -module.exports = serverConfig; diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 751e1dd5c37..eb2b984af06 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -10,7 +10,7 @@ "bin": { "vscode-json-languageserver": "./bin/vscode-json-languageserver" }, - "main": "./out/jsonServerMain", + "main": "./out/node/jsonServerMain", "dependencies": { "jsonc-parser": "^2.2.1", "request-light": "^0.3.0", diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index 237cddb80f3..29972b7df03 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -125,10 +125,10 @@ vscode-jsonrpc@6.0.0-next.2: resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.2.tgz#3d73f86d812304cb91b9fb1efee40ec60b09ed7f" integrity sha512-dKQXRYNUY6BHALQJBJlyZyv9oWlYpbJ2vVoQNNVNPLAYQ3hzNp4zy+iSo7zGx1BPXByArJQDWTKLQh8dz3dnNw== -vscode-languageclient@7.0.0-next.5: - version "7.0.0-next.5" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-7.0.0-next.5.tgz#7ae84c598dff360bd2bc64322b74e10e5d0b9cd6" - integrity sha512-ec+fJg+JiNBIdbeKbzssSuORUaVdtLValtiYdNEUCUjpYE+Y6xXPtXwiZOlS/0OB9pC/RLCMxsj16UwWncQhYQ== +vscode-languageclient@7.0.0-next.5.1: + version "7.0.0-next.5.1" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-7.0.0-next.5.1.tgz#ed93f14e4c2cdccedf15002c7bf8ef9cb638f36c" + integrity sha512-OONvbk3IFpubwF8/Y5uPQaq5J5CEskpeET3SfK4iGlv5OUK+44JawH/SEW5wXuEPpfdMLEMZLuGLU5v5d7N7PQ== dependencies: semver "^6.3.0" vscode-languageserver-protocol "3.16.0-next.4" diff --git a/extensions/markdown-language-features/extension-browser.webpack.config.js b/extensions/markdown-language-features/extension-browser.webpack.config.js index 382b8208a2c..7fcc53a728b 100644 --- a/extensions/markdown-language-features/extension-browser.webpack.config.js +++ b/extensions/markdown-language-features/extension-browser.webpack.config.js @@ -7,26 +7,11 @@ 'use strict'; -const withDefaults = require('../shared.webpack.config'); -const path = require('path'); +const withBrowserDefaults = require('../shared.webpack.config').browser; -const clientConfig = withDefaults({ +module.exports = withBrowserDefaults({ context: __dirname, - target: 'webworker', entry: { extension: './src/extension.ts' - }, - resolve: { - alias: { - 'vscode-extension-telemetry': path.resolve(__dirname, '../../build/polyfills/vscode-extension-telemetry.js'), - 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js'), - }, - }, - performance: { - hints: false - }, + } }); - -clientConfig.module.rules[0].use.shift(); // remove nls loader - -module.exports = clientConfig; diff --git a/extensions/markdown-language-features/media/index.js b/extensions/markdown-language-features/media/index.js index 0762949b41c..12b9b68f884 100644 --- a/extensions/markdown-language-features/media/index.js +++ b/extensions/markdown-language-features/media/index.js @@ -1,2 +1 @@ -!function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let o=void 0;function i(e){const t=document.getElementById("vscode-markdown-preview-data");if(t){const n=t.getAttribute(e);if(n)return JSON.parse(n)}throw new Error(`Could not load data for ${e}`)}t.getData=i,t.getSettings=function(){if(o)return o;if(o=i("data-settings"))return o;throw new Error("Could not load settings")}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(0),i="code-line";function r(e){return t=0,n=o.getSettings().lineCount-1,i=e,Math.min(n,Math.max(t,i));var t,n,i}const c=(()=>{let e;return()=>{if(!e){e=[{element:document.body,line:0}];for(const t of document.getElementsByClassName(i)){const n=+t.getAttribute("data-line");isNaN(n)||("CODE"===t.tagName&&t.parentElement&&"PRE"===t.parentElement.tagName?e.push({element:t.parentElement,line:n}):e.push({element:t,line:n}))}}return e}})();function s(e){const t=Math.floor(e),n=c();let o=n[0]||null;for(const e of n){if(e.line===t)return{previous:e,next:void 0};if(e.line>t)return{previous:o,next:e};o=e}return{previous:o}}function a(e){const t=c(),n=e-window.scrollY;let o=-1,i=t.length-1;for(;o+1=n?i=e:o=e}const r=t[i],s=u(r);if(i>=1&&s.top>n){return{previous:t[o],next:r}}return i>1&&in?{previous:r,next:t[i+1]}:{previous:r}}function u({element:e}){const t=e.getBoundingClientRect(),n=e.querySelector(`.${i}`);if(n){const e=n.getBoundingClientRect(),o=Math.max(1,e.top-t.top);return{top:t.top,height:o}}return t}t.getElementsForSourceLine=s,t.getLineElementsAtPageOffset=a,t.scrollToRevealSourceLine=function(e){if(!o.getSettings().scrollPreviewWithEditor)return;if(e<=0)return void window.scroll(window.scrollX,0);const{previous:t,next:n}=s(e);if(!t)return;let i=0;const r=u(t),c=r.top;if(n&&n.line!==t.line){i=c+(e-t.line)/(n.line-t.line)*(n.element.getBoundingClientRect().top-c)}else{const t=e-Math.floor(e);i=c+r.height*t}window.scroll(window.scrollX,Math.max(1,window.scrollY+i))},t.getEditorLineNumberForPageOffset=function(e){const{previous:t,next:n}=a(e);if(t){const o=u(t),i=e-window.scrollY-o.top;if(n){const e=i/(u(n).top-o.top);return r(t.line+e*(n.line-t.line))}{const e=i/o.height;return r(t.line+e)}}return null},t.getLineElementForFragment=function(e){return c().find(t=>t.element.id===e)}},function(e,t,n){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const o=n(7),i=n(8),r=n(9),c=n(2),s=n(0),a=n(10);let u=!0;const l=new o.ActiveLineMarker,f=s.getSettings(),d=acquireVsCodeApi(),m={...d.getState(),...s.getData("data-state")};d.setState(m);const p=r.createPosterForVsCode(d);window.cspAlerter.setPoster(p),window.styleLoadingMonitor.setPoster(p),window.onload=()=>{h()},i.onceDocumentLoaded(()=>{const t=m.scrollProgress;"number"!=typeof t||f.fragment?f.scrollPreviewWithEditor&&e(()=>{if(f.fragment){m.fragment=void 0,d.setState(m);const e=c.getLineElementForFragment(f.fragment);e&&(u=!0,c.scrollToRevealSourceLine(e.line))}else isNaN(f.line)||(u=!0,c.scrollToRevealSourceLine(f.line))}):e(()=>{u=!0,window.scrollTo(0,t*document.body.clientHeight)})});const g=(()=>{const e=a(e=>{u=!0,c.scrollToRevealSourceLine(e)},50);return t=>{isNaN(t)||(m.line=t,e(t))}})();let h=a(()=>{const e=[];let t=document.getElementsByTagName("img");if(t){let n;for(n=0;n{u=!0,y(),h()},!0),window.addEventListener("message",e=>{if(e.data.source===f.source)switch(e.data.type){case"onDidChangeTextEditorSelection":l.onDidChangeTextEditorSelection(e.data.line);break;case"updateView":g(e.data.line)}},!1),document.addEventListener("dblclick",e=>{if(!f.doubleClickToSwitchToEditor)return;for(let t=e.target;t;t=t.parentNode)if("A"===t.tagName)return;const t=e.pageY,n=c.getEditorLineNumberForPageOffset(t);"number"!=typeof n||isNaN(n)||p.postMessage("didClick",{line:Math.floor(n)})});const v=["http:","https:","mailto:","vscode:","vscode-insiders:"];function y(){m.scrollProgress=window.scrollY/document.body.clientHeight,d.setState(m)}document.addEventListener("click",e=>{if(!e)return;let t=e.target;for(;t;){if(t.tagName&&"A"===t.tagName&&t.href){if(t.getAttribute("href").startsWith("#"))return;if(v.some(e=>t.href.startsWith(e)))return;const n=t.getAttribute("data-href")||t.getAttribute("href");return/^[a-z\-]+:/i.test(n)?void 0:(p.postMessage("openLink",{href:n}),e.preventDefault(),void e.stopPropagation())}t=t.parentNode}},!0),window.addEventListener("scroll",a(()=>{if(y(),u)u=!1;else{const e=c.getEditorLineNumberForPageOffset(window.scrollY);"number"!=typeof e||isNaN(e)||p.postMessage("revealLine",{line:e})}},50))}).call(this,n(4).setImmediate)},function(e,t,n){(function(e){var o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(5),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(1))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var o,i,r,c,s,a=1,u={},l=!1,f=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?o=function(e){t.nextTick((function(){p(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){p(e.data)},o=function(e){r.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(i=f.documentElement,o=function(e){var t=f.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):o=function(e){setTimeout(p,0,e)}:(c="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(c)&&p(+t.data.slice(c.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),o=function(t){e.postMessage(c+t,"*")}),d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;nnew class{postMessage(t,n){e.postMessage({type:t,source:o.getSettings().source,body:n})}}},function(e,t,n){(function(t){var n="Expected a function",o=NaN,i="[object Symbol]",r=/^\s+|\s+$/g,c=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,u=parseInt,l="object"==typeof t&&t&&t.Object===Object&&t,f="object"==typeof self&&self&&self.Object===Object&&self,d=l||f||Function("return this")(),m=Object.prototype.toString,p=Math.max,g=Math.min,h=function(){return d.Date.now()};function v(e,t,o){var i,r,c,s,a,u,l=0,f=!1,d=!1,m=!0;if("function"!=typeof e)throw new TypeError(n);function v(t){var n=i,o=r;return i=r=void 0,l=t,s=e.apply(o,n)}function b(e){var n=e-u;return void 0===u||n>=t||n<0||d&&e-l>=c}function T(){var e=h();if(b(e))return E(e);a=setTimeout(T,function(e){var n=t-(e-u);return d?g(n,c-(e-l)):n}(e))}function E(e){return a=void 0,m&&i?v(e):(i=r=void 0,s)}function _(){var e=h(),n=b(e);if(i=arguments,r=this,u=e,n){if(void 0===a)return function(e){return l=e,a=setTimeout(T,t),f?v(e):s}(u);if(d)return a=setTimeout(T,t),v(u)}return void 0===a&&(a=setTimeout(T,t)),s}return t=w(t)||0,y(o)&&(f=!!o.leading,c=(d="maxWait"in o)?p(w(o.maxWait)||0,t):c,m="trailing"in o?!!o.trailing:m),_.cancel=function(){void 0!==a&&clearTimeout(a),l=0,i=u=r=a=void 0},_.flush=function(){return void 0===a?s:E(h())},_}function y(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function w(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&m.call(e)==i}(e))return o;if(y(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=y(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=s.test(e);return n||a.test(e)?u(e.slice(2),n?2:8):c.test(e)?o:+e}e.exports=function(e,t,o){var i=!0,r=!0;if("function"!=typeof e)throw new TypeError(n);return y(o)&&(i="leading"in o?!!o.leading:i,r="trailing"in o?!!o.trailing:r),v(e,t,{leading:i,maxWait:t,trailing:r})}}).call(this,n(1))}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zY3JvbGwtc3luYy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9pbmRleC50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2FjdGl2ZUxpbmVNYXJrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvZXZlbnRzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL21lc3NhZ2luZy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoLnRocm90dGxlL2luZGV4LmpzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiY2FjaGVkU2V0dGluZ3MiLCJ1bmRlZmluZWQiLCJnZXREYXRhIiwiZWxlbWVudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkYXRhIiwiZ2V0QXR0cmlidXRlIiwiSlNPTiIsInBhcnNlIiwiRXJyb3IiLCJnZXRTZXR0aW5ncyIsImciLCJ0aGlzIiwiRnVuY3Rpb24iLCJlIiwid2luZG93Iiwic2V0dGluZ3NfMSIsImNvZGVMaW5lQ2xhc3MiLCJjbGFtcExpbmUiLCJsaW5lIiwibWluIiwibWF4IiwibGluZUNvdW50IiwiTWF0aCIsImdldENvZGVMaW5lRWxlbWVudHMiLCJlbGVtZW50cyIsImJvZHkiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaXNOYU4iLCJ0YWdOYW1lIiwicGFyZW50RWxlbWVudCIsInB1c2giLCJnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUiLCJ0YXJnZXRMaW5lIiwibGluZU51bWJlciIsImZsb29yIiwibGluZXMiLCJwcmV2aW91cyIsImVudHJ5IiwibmV4dCIsImdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldCIsIm9mZnNldCIsInBvc2l0aW9uIiwic2Nyb2xsWSIsImxvIiwiaGkiLCJsZW5ndGgiLCJtaWQiLCJib3VuZHMiLCJnZXRFbGVtZW50Qm91bmRzIiwidG9wIiwiaGVpZ2h0IiwiaGlFbGVtZW50IiwiaGlCb3VuZHMiLCJteUJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImNvZGVMaW5lQ2hpbGQiLCJxdWVyeVNlbGVjdG9yIiwiY2hpbGRCb3VuZHMiLCJzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUiLCJzY3JvbGxQcmV2aWV3V2l0aEVkaXRvciIsInNjcm9sbCIsInNjcm9sbFgiLCJzY3JvbGxUbyIsInJlY3QiLCJwcmV2aW91c1RvcCIsInByb2dyZXNzSW5FbGVtZW50IiwiZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQiLCJwcmV2aW91c0JvdW5kcyIsIm9mZnNldEZyb21QcmV2aW91cyIsInByb2dyZXNzQmV0d2VlbkVsZW1lbnRzIiwicHJvZ3Jlc3NXaXRoaW5FbGVtZW50IiwiZ2V0TGluZUVsZW1lbnRGb3JGcmFnbWVudCIsImZyYWdtZW50IiwiZmluZCIsImlkIiwiYWN0aXZlTGluZU1hcmtlcl8xIiwiZXZlbnRzXzEiLCJtZXNzYWdpbmdfMSIsInNjcm9sbF9zeW5jXzEiLCJ0aHJvdHRsZSIsInNjcm9sbERpc2FibGVkIiwibWFya2VyIiwiQWN0aXZlTGluZU1hcmtlciIsInNldHRpbmdzIiwidnNjb2RlIiwiYWNxdWlyZVZzQ29kZUFwaSIsInN0YXRlIiwiZ2V0U3RhdGUiLCJzZXRTdGF0ZSIsIm1lc3NhZ2luZyIsImNyZWF0ZVBvc3RlckZvclZzQ29kZSIsImNzcEFsZXJ0ZXIiLCJzZXRQb3N0ZXIiLCJzdHlsZUxvYWRpbmdNb25pdG9yIiwib25sb2FkIiwidXBkYXRlSW1hZ2VTaXplcyIsIm9uY2VEb2N1bWVudExvYWRlZCIsInNjcm9sbFByb2dyZXNzIiwic2V0SW1tZWRpYXRlIiwiY2xpZW50SGVpZ2h0Iiwib25VcGRhdGVWaWV3IiwiZG9TY3JvbGwiLCJpbWFnZUluZm8iLCJpbWFnZXMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImltZyIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwicmVtb3ZlIiwid2lkdGgiLCJwb3N0TWVzc2FnZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVTY3JvbGxQcm9ncmVzcyIsImV2ZW50Iiwic291cmNlIiwidHlwZSIsIm9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbiIsImRvdWJsZUNsaWNrVG9Td2l0Y2hUb0VkaXRvciIsIm5vZGUiLCJ0YXJnZXQiLCJwYXJlbnROb2RlIiwicGFnZVkiLCJwYXNzVGhyb3VnaExpbmtTY2hlbWVzIiwiaHJlZiIsInN0YXJ0c1dpdGgiLCJzb21lIiwic2NoZW1lIiwiaHJlZlRleHQiLCJ0ZXN0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJUaW1lb3V0IiwiY2xlYXJGbiIsIl9pZCIsIl9jbGVhckZuIiwic2V0VGltZW91dCIsImFwcGx5IiwiYXJndW1lbnRzIiwiY2xlYXJUaW1lb3V0Iiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwidGltZW91dCIsImNsb3NlIiwidW5yZWYiLCJyZWYiLCJlbnJvbGwiLCJpdGVtIiwibXNlY3MiLCJfaWRsZVRpbWVvdXRJZCIsIl9pZGxlVGltZW91dCIsInVuZW5yb2xsIiwiX3VucmVmQWN0aXZlIiwiYWN0aXZlIiwiX29uVGltZW91dCIsInNlbGYiLCJnbG9iYWwiLCJjbGVhckltbWVkaWF0ZSIsInJlZ2lzdGVySW1tZWRpYXRlIiwiaHRtbCIsImNoYW5uZWwiLCJtZXNzYWdlUHJlZml4Iiwib25HbG9iYWxNZXNzYWdlIiwibmV4dEhhbmRsZSIsInRhc2tzQnlIYW5kbGUiLCJjdXJyZW50bHlSdW5uaW5nQVRhc2siLCJkb2MiLCJhdHRhY2hUbyIsImdldFByb3RvdHlwZU9mIiwidG9TdHJpbmciLCJwcm9jZXNzIiwiaGFuZGxlIiwibmV4dFRpY2siLCJydW5JZlByZXNlbnQiLCJpbXBvcnRTY3JpcHRzIiwicG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyIsIm9sZE9uTWVzc2FnZSIsIm9ubWVzc2FnZSIsImNhblVzZVBvc3RNZXNzYWdlIiwiTWVzc2FnZUNoYW5uZWwiLCJwb3J0MSIsInBvcnQyIiwiY3JlYXRlRWxlbWVudCIsImRvY3VtZW50RWxlbWVudCIsInNjcmlwdCIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlbW92ZUNoaWxkIiwiYXBwZW5kQ2hpbGQiLCJyYW5kb20iLCJpbmRleE9mIiwic2xpY2UiLCJhdHRhY2hFdmVudCIsImNhbGxiYWNrIiwiYXJncyIsIkFycmF5IiwidGFzayIsInJ1biIsImNhY2hlZFNldFRpbWVvdXQiLCJjYWNoZWRDbGVhclRpbWVvdXQiLCJkZWZhdWx0U2V0VGltb3V0IiwiZGVmYXVsdENsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJmdW4iLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImNvbmNhdCIsImRyYWluUXVldWUiLCJsZW4iLCJydW5DbGVhclRpbWVvdXQiLCJJdGVtIiwiYXJyYXkiLCJub29wIiwidGl0bGUiLCJicm93c2VyIiwiZW52IiwiYXJndiIsInZlcnNpb24iLCJ2ZXJzaW9ucyIsIm9uIiwiYWRkTGlzdGVuZXIiLCJvbmNlIiwib2ZmIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJlbWl0IiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3RlbmVycyIsImJpbmRpbmciLCJjd2QiLCJjaGRpciIsImRpciIsInVtYXNrIiwiX3VwZGF0ZSIsImJlZm9yZSIsIl91bm1hcmtBY3RpdmVFbGVtZW50IiwiX2N1cnJlbnQiLCJfbWFya0FjdGl2ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJyZXBsYWNlIiwiZiIsInJlYWR5U3RhdGUiLCJGVU5DX0VSUk9SX1RFWFQiLCJOQU4iLCJzeW1ib2xUYWciLCJyZVRyaW0iLCJyZUlzQmFkSGV4IiwicmVJc0JpbmFyeSIsInJlSXNPY3RhbCIsImZyZWVQYXJzZUludCIsInBhcnNlSW50IiwiZnJlZUdsb2JhbCIsImZyZWVTZWxmIiwicm9vdCIsIm9iamVjdFRvU3RyaW5nIiwibmF0aXZlTWF4IiwibmF0aXZlTWluIiwibm93IiwiRGF0ZSIsImRlYm91bmNlIiwiZnVuYyIsIndhaXQiLCJvcHRpb25zIiwibGFzdEFyZ3MiLCJsYXN0VGhpcyIsIm1heFdhaXQiLCJyZXN1bHQiLCJ0aW1lcklkIiwibGFzdENhbGxUaW1lIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nIiwibWF4aW5nIiwidHJhaWxpbmciLCJUeXBlRXJyb3IiLCJpbnZva2VGdW5jIiwidGltZSIsInRoaXNBcmciLCJzaG91bGRJbnZva2UiLCJ0aW1lU2luY2VMYXN0Q2FsbCIsInRpbWVyRXhwaXJlZCIsInRyYWlsaW5nRWRnZSIsInJlbWFpbmluZ1dhaXQiLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwibGVhZGluZ0VkZ2UiLCJ0b051bWJlciIsImlzT2JqZWN0IiwiY2FuY2VsIiwiZmx1c2giLCJpc09iamVjdExpa2UiLCJpc1N5bWJvbCIsIm90aGVyIiwidmFsdWVPZiIsImlzQmluYXJ5Il0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUFLZkYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNYLG9CQUFYaUIsUUFBMEJBLE9BQU9DLGFBQzFDTixPQUFPQyxlQUFlYixFQUFTaUIsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sS0FRdkRyQixFQUFvQnNCLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRckIsRUFBb0JxQixJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FBOEIsaUJBQVZGLEdBQXNCQSxHQUFTQSxFQUFNRyxXQUFZLE9BQU9ILEVBQ2hGLElBQUlJLEVBQUtYLE9BQU9ZLE9BQU8sTUFHdkIsR0FGQTFCLEVBQW9Ca0IsRUFBRU8sR0FDdEJYLE9BQU9DLGVBQWVVLEVBQUksVUFBVyxDQUFFVCxZQUFZLEVBQU1LLE1BQU9BLElBQ3RELEVBQVBFLEdBQTRCLGlCQUFURixFQUFtQixJQUFJLElBQUlNLEtBQU9OLEVBQU9yQixFQUFvQlUsRUFBRWUsRUFBSUUsRUFBSyxTQUFTQSxHQUFPLE9BQU9OLEVBQU1NLElBQVFDLEtBQUssS0FBTUQsSUFDOUksT0FBT0YsR0FJUnpCLEVBQW9CNkIsRUFBSSxTQUFTMUIsR0FDaEMsSUFBSVMsRUFBU1QsR0FBVUEsRUFBT3FCLFdBQzdCLFdBQXdCLE9BQU9yQixFQUFnQixTQUMvQyxXQUE4QixPQUFPQSxHQUV0QyxPQURBSCxFQUFvQlUsRUFBRUUsRUFBUSxJQUFLQSxHQUM1QkEsR0FJUlosRUFBb0JhLEVBQUksU0FBU2lCLEVBQVFDLEdBQVksT0FBT2pCLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBS3VCLEVBQVFDLElBR3pHL0IsRUFBb0JrQyxFQUFJLEdBSWpCbEMsRUFBb0JBLEVBQW9CbUMsRUFBSSxHLCtCQzdFckRyQixPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sSUFDdEQsSUFBSWUsT0FBaUJDLEVBQ3JCLFNBQVNDLEVBQVFYLEdBQ2IsTUFBTVksRUFBVUMsU0FBU0MsZUFBZSxnQ0FDeEMsR0FBSUYsRUFBUyxDQUNULE1BQU1HLEVBQU9ILEVBQVFJLGFBQWFoQixHQUNsQyxHQUFJZSxFQUNBLE9BQU9FLEtBQUtDLE1BQU1ILEdBRzFCLE1BQU0sSUFBSUksTUFBTSwyQkFBMkJuQixLQUUvQ3pCLEVBQVFvQyxRQUFVQSxFQVdsQnBDLEVBQVE2QyxZQVZSLFdBQ0ksR0FBSVgsRUFDQSxPQUFPQSxFQUdYLEdBREFBLEVBQWlCRSxFQUFRLGlCQUVyQixPQUFPRixFQUVYLE1BQU0sSUFBSVUsTUFBTSw2QixjQzFCcEIsSUFBSUUsRUFHSkEsRUFBSSxXQUNILE9BQU9DLEtBREosR0FJSixJQUVDRCxFQUFJQSxHQUFLLElBQUlFLFNBQVMsY0FBYixHQUNSLE1BQU9DLEdBRWMsaUJBQVhDLFNBQXFCSixFQUFJSSxRQU9yQ2pELEVBQU9ELFFBQVU4QyxHLDZCQ2RqQmxDLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxJQUN0RCxNQUFNZ0MsRUFBYSxFQUFRLEdBQ3JCQyxFQUFnQixZQUl0QixTQUFTQyxFQUFVQyxHQUNmLE9BSldDLEVBSUUsRUFKR0MsRUFJQUwsRUFBV04sY0FBY1ksVUFBWSxFQUpoQ3RDLEVBSW1DbUMsRUFIakRJLEtBQUtILElBQUlDLEVBQUtFLEtBQUtGLElBQUlELEVBQUtwQyxJQUR2QyxJQUFlb0MsRUFBS0MsRUFBS3JDLEVBTXpCLE1BQU13QyxFQUFzQixNQUN4QixJQUFJQyxFQUNKLE1BQU8sS0FDSCxJQUFLQSxFQUFVLENBQ1hBLEVBQVcsQ0FBQyxDQUFFdkIsUUFBU0MsU0FBU3VCLEtBQU1QLEtBQU0sSUFDNUMsSUFBSyxNQUFNakIsS0FBV0MsU0FBU3dCLHVCQUF1QlYsR0FBZ0IsQ0FDbEUsTUFBTUUsR0FBUWpCLEVBQVFJLGFBQWEsYUFDL0JzQixNQUFNVCxLQUdjLFNBQXBCakIsRUFBUTJCLFNBQXNCM0IsRUFBUTRCLGVBQW1ELFFBQWxDNUIsRUFBUTRCLGNBQWNELFFBRzdFSixFQUFTTSxLQUFLLENBQUU3QixRQUFTQSxFQUFRNEIsY0FBZVgsU0FHaERNLEVBQVNNLEtBQUssQ0FBRTdCLFFBQVNBLEVBQVNpQixXQUk5QyxPQUFPTSxJQXBCYSxHQTZCNUIsU0FBU08sRUFBeUJDLEdBQzlCLE1BQU1DLEVBQWFYLEtBQUtZLE1BQU1GLEdBQ3hCRyxFQUFRWixJQUNkLElBQUlhLEVBQVdELEVBQU0sSUFBTSxLQUMzQixJQUFLLE1BQU1FLEtBQVNGLEVBQU8sQ0FDdkIsR0FBSUUsRUFBTW5CLE9BQVNlLEVBQ2YsTUFBTyxDQUFFRyxTQUFVQyxFQUFPQyxVQUFNdkMsR0FFL0IsR0FBSXNDLEVBQU1uQixLQUFPZSxFQUNsQixNQUFPLENBQUVHLFdBQVVFLEtBQU1ELEdBRTdCRCxFQUFXQyxFQUVmLE1BQU8sQ0FBRUQsWUFNYixTQUFTRyxFQUE0QkMsR0FDakMsTUFBTUwsRUFBUVosSUFDUmtCLEVBQVdELEVBQVMxQixPQUFPNEIsUUFDakMsSUFBSUMsR0FBTSxFQUNOQyxFQUFLVCxFQUFNVSxPQUFTLEVBQ3hCLEtBQU9GLEVBQUssRUFBSUMsR0FBSSxDQUNoQixNQUFNRSxFQUFNeEIsS0FBS1ksT0FBT1MsRUFBS0MsR0FBTSxHQUM3QkcsRUFBU0MsRUFBaUJiLEVBQU1XLElBQ2xDQyxFQUFPRSxJQUFNRixFQUFPRyxRQUFVVCxFQUM5QkcsRUFBS0UsRUFHTEgsRUFBS0csRUFHYixNQUFNSyxFQUFZaEIsRUFBTVMsR0FDbEJRLEVBQVdKLEVBQWlCRyxHQUNsQyxHQUFJUCxHQUFNLEdBQUtRLEVBQVNILElBQU1SLEVBQVUsQ0FFcEMsTUFBTyxDQUFFTCxTQURTRCxFQUFNUSxHQUNNTCxLQUFNYSxHQUV4QyxPQUFJUCxFQUFLLEdBQUtBLEVBQUtULEVBQU1VLFFBQVVPLEVBQVNILElBQU1HLEVBQVNGLE9BQVNULEVBQ3pELENBQUVMLFNBQVVlLEVBQVdiLEtBQU1ILEVBQU1TLEVBQUssSUFFNUMsQ0FBRVIsU0FBVWUsR0FHdkIsU0FBU0gsR0FBaUIsUUFBRS9DLElBQ3hCLE1BQU1vRCxFQUFXcEQsRUFBUXFELHdCQUduQkMsRUFBZ0J0RCxFQUFRdUQsY0FBYyxJQUFJeEMsS0FDaEQsR0FBSXVDLEVBQWUsQ0FDZixNQUFNRSxFQUFjRixFQUFjRCx3QkFDNUJKLEVBQVM1QixLQUFLRixJQUFJLEVBQUlxQyxFQUFZUixJQUFNSSxFQUFTSixLQUN2RCxNQUFPLENBQ0hBLElBQUtJLEVBQVNKLElBQ2RDLE9BQVFBLEdBR2hCLE9BQU9HLEVBNUNYekYsRUFBUW1FLHlCQUEyQkEsRUE4Qm5DbkUsRUFBUTJFLDRCQUE4QkEsRUE4Q3RDM0UsRUFBUThGLHlCQTNCUixTQUFrQ3hDLEdBQzlCLElBQUtILEVBQVdOLGNBQWNrRCx3QkFDMUIsT0FFSixHQUFJekMsR0FBUSxFQUVSLFlBREFKLE9BQU84QyxPQUFPOUMsT0FBTytDLFFBQVMsR0FHbEMsTUFBTSxTQUFFekIsRUFBUSxLQUFFRSxHQUFTUCxFQUF5QmIsR0FDcEQsSUFBS2tCLEVBQ0QsT0FFSixJQUFJMEIsRUFBVyxFQUNmLE1BQU1DLEVBQU9mLEVBQWlCWixHQUN4QjRCLEVBQWNELEVBQUtkLElBQ3pCLEdBQUlYLEdBQVFBLEVBQUtwQixPQUFTa0IsRUFBU2xCLEtBQU0sQ0FJckM0QyxFQUFXRSxHQUZjOUMsRUFBT2tCLEVBQVNsQixPQUFTb0IsRUFBS3BCLEtBQU9rQixFQUFTbEIsT0FDakRvQixFQUFLckMsUUFBUXFELHdCQUF3QkwsSUFBTWUsT0FHaEUsQ0FDRCxNQUFNQyxFQUFvQi9DLEVBQU9JLEtBQUtZLE1BQU1oQixHQUM1QzRDLEVBQVdFLEVBQWVELEVBQUtiLE9BQVNlLEVBRTVDbkQsT0FBTzhDLE9BQU85QyxPQUFPK0MsUUFBU3ZDLEtBQUtGLElBQUksRUFBR04sT0FBTzRCLFFBQVVvQixLQXFCL0RsRyxFQUFRc0csaUNBbEJSLFNBQTBDMUIsR0FDdEMsTUFBTSxTQUFFSixFQUFRLEtBQUVFLEdBQVNDLEVBQTRCQyxHQUN2RCxHQUFJSixFQUFVLENBQ1YsTUFBTStCLEVBQWlCbkIsRUFBaUJaLEdBQ2xDZ0MsRUFBc0I1QixFQUFTMUIsT0FBTzRCLFFBQVV5QixFQUFlbEIsSUFDckUsR0FBSVgsRUFBTSxDQUNOLE1BQU0rQixFQUEwQkQsR0FBc0JwQixFQUFpQlYsR0FBTVcsSUFBTWtCLEVBQWVsQixLQUVsRyxPQUFPaEMsRUFETW1CLEVBQVNsQixLQUFPbUQsR0FBMkIvQixFQUFLcEIsS0FBT2tCLEVBQVNsQixPQUc1RSxDQUNELE1BQU1vRCxFQUF3QkYsRUFBc0JELEVBQXFCLE9BRXpFLE9BQU9sRCxFQURNbUIsRUFBU2xCLEtBQU9vRCxJQUlyQyxPQUFPLE1BV1gxRyxFQUFRMkcsMEJBTFIsU0FBbUNDLEdBQy9CLE9BQU9qRCxJQUFzQmtELEtBQU14RSxHQUN4QkEsRUFBUUEsUUFBUXlFLEtBQU9GLEssOEJDL0p0QyxZQUtBaEcsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLElBQ3RELE1BQU00RixFQUFxQixFQUFRLEdBQzdCQyxFQUFXLEVBQVEsR0FDbkJDLEVBQWMsRUFBUSxHQUN0QkMsRUFBZ0IsRUFBUSxHQUN4Qi9ELEVBQWEsRUFBUSxHQUNyQmdFLEVBQVcsRUFBUSxJQUN6QixJQUFJQyxHQUFpQixFQUNyQixNQUFNQyxFQUFTLElBQUlOLEVBQW1CTyxpQkFDaENDLEVBQVdwRSxFQUFXTixjQUN0QjJFLEVBQVNDLG1CQUNUQyxFQUFRLElBQUtGLEVBQU9HLGNBQWV4RSxFQUFXZixRQUFRLGVBRTVEb0YsRUFBT0ksU0FBU0YsR0FDaEIsTUFBTUcsRUFBWVosRUFBWWEsc0JBQXNCTixHQUNwRHRFLE9BQU82RSxXQUFXQyxVQUFVSCxHQUM1QjNFLE9BQU8rRSxvQkFBb0JELFVBQVVILEdBQ3JDM0UsT0FBT2dGLE9BQVMsS0FDWkMsS0FFSm5CLEVBQVNvQixtQkFBbUIsS0FDeEIsTUFBTUMsRUFBaUJYLEVBQU1XLGVBQ0MsaUJBQW5CQSxHQUFnQ2QsRUFBU1gsU0FPaERXLEVBQVN4Qix5QkFDVHVDLEVBQWEsS0FFVCxHQUFJZixFQUFTWCxTQUFVLENBQ25CYyxFQUFNZCxjQUFXekUsRUFDakJxRixFQUFPSSxTQUFTRixHQUNoQixNQUFNckYsRUFBVTZFLEVBQWNQLDBCQUEwQlksRUFBU1gsVUFDN0R2RSxJQUNBK0UsR0FBaUIsRUFDakJGLEVBQWNwQix5QkFBeUJ6RCxFQUFRaUIsWUFJOUNTLE1BQU13RCxFQUFTakUsUUFDaEI4RCxHQUFpQixFQUNqQkYsRUFBY3BCLHlCQUF5QnlCLEVBQVNqRSxTQXJCNURnRixFQUFhLEtBQ1RsQixHQUFpQixFQUNqQmxFLE9BQU9nRCxTQUFTLEVBQUdtQyxFQUFpQi9GLFNBQVN1QixLQUFLMEUsa0JBeUI5RCxNQUFNQyxFQUFlLE1BQ2pCLE1BQU1DLEVBQVd0QixFQUFVN0QsSUFDdkI4RCxHQUFpQixFQUNqQkYsRUFBY3BCLHlCQUF5QnhDLElBQ3hDLElBQ0gsT0FBUUEsSUFDQ1MsTUFBTVQsS0FDUG9FLEVBQU1wRSxLQUFPQSxFQUNibUYsRUFBU25GLE1BUkEsR0FZckIsSUFBSTZFLEVBQW1CaEIsRUFBUyxLQUM1QixNQUFNdUIsRUFBWSxHQUNsQixJQUFJQyxFQUFTckcsU0FBU3NHLHFCQUFxQixPQUMzQyxHQUFJRCxFQUFRLENBQ1IsSUFBSXpJLEVBQ0osSUFBS0EsRUFBSSxFQUFHQSxFQUFJeUksRUFBTzFELE9BQVEvRSxJQUFLLENBQ2hDLE1BQU0ySSxFQUFNRixFQUFPekksR0FDZjJJLEVBQUlDLFVBQVVDLFNBQVMsWUFDdkJGLEVBQUlDLFVBQVVFLE9BQU8sV0FFekJOLEVBQVV4RSxLQUFLLENBQ1g0QyxHQUFJK0IsRUFBSS9CLEdBQ1J4QixPQUFRdUQsRUFBSXZELE9BQ1oyRCxNQUFPSixFQUFJSSxRQUduQnBCLEVBQVVxQixZQUFZLGtCQUFtQlIsS0FFOUMsSUFDSHhGLE9BQU9pRyxpQkFBaUIsU0FBVSxLQUM5Qi9CLEdBQWlCLEVBQ2pCZ0MsSUFDQWpCLE1BQ0QsR0FDSGpGLE9BQU9pRyxpQkFBaUIsVUFBV0UsSUFDL0IsR0FBSUEsRUFBTTdHLEtBQUs4RyxTQUFXL0IsRUFBUytCLE9BR25DLE9BQVFELEVBQU03RyxLQUFLK0csTUFDZixJQUFLLGlDQUNEbEMsRUFBT21DLCtCQUErQkgsRUFBTTdHLEtBQUtjLE1BQ2pELE1BQ0osSUFBSyxhQUNEa0YsRUFBYWEsRUFBTTdHLEtBQUtjLFNBR2pDLEdBQ0hoQixTQUFTNkcsaUJBQWlCLFdBQVlFLElBQ2xDLElBQUs5QixFQUFTa0MsNEJBQ1YsT0FHSixJQUFLLElBQUlDLEVBQU9MLEVBQU1NLE9BQVFELEVBQU1BLEVBQU9BLEVBQUtFLFdBQzVDLEdBQXFCLE1BQWpCRixFQUFLMUYsUUFDTCxPQUdSLE1BQU1ZLEVBQVN5RSxFQUFNUSxNQUNmdkcsRUFBTzRELEVBQWNaLGlDQUFpQzFCLEdBQ3hDLGlCQUFUdEIsR0FBc0JTLE1BQU1ULElBQ25DdUUsRUFBVXFCLFlBQVksV0FBWSxDQUFFNUYsS0FBTUksS0FBS1ksTUFBTWhCLE9BRzdELE1BQU13RyxFQUF5QixDQUFDLFFBQVMsU0FBVSxVQUFXLFVBQVcsb0JBd0N6RSxTQUFTVixJQUNMMUIsRUFBTVcsZUFBaUJuRixPQUFPNEIsUUFBVXhDLFNBQVN1QixLQUFLMEUsYUFDdERmLEVBQU9JLFNBQVNGLEdBekNwQnBGLFNBQVM2RyxpQkFBaUIsUUFBU0UsSUFDL0IsSUFBS0EsRUFDRCxPQUVKLElBQUlLLEVBQU9MLEVBQU1NLE9BQ2pCLEtBQU9ELEdBQU0sQ0FDVCxHQUFJQSxFQUFLMUYsU0FBNEIsTUFBakIwRixFQUFLMUYsU0FBbUIwRixFQUFLSyxLQUFNLENBQ25ELEdBQUlMLEVBQUtqSCxhQUFhLFFBQVF1SCxXQUFXLEtBQ3JDLE9BR0osR0FBSUYsRUFBdUJHLEtBQUtDLEdBQVVSLEVBQUtLLEtBQUtDLFdBQVdFLElBQzNELE9BRUosTUFBTUMsRUFBV1QsRUFBS2pILGFBQWEsY0FBZ0JpSCxFQUFLakgsYUFBYSxRQUVyRSxNQUFLLGNBQWMySCxLQUFLRCxRQU14QixHQUxJdEMsRUFBVXFCLFlBQVksV0FBWSxDQUFFYSxLQUFNSSxJQUMxQ2QsRUFBTWdCLHNCQUNOaEIsRUFBTWlCLG1CQUtkWixFQUFPQSxFQUFLRSxjQUVqQixHQUNIMUcsT0FBT2lHLGlCQUFpQixTQUFVaEMsRUFBUyxLQUV2QyxHQURBaUMsSUFDSWhDLEVBQ0FBLEdBQWlCLE1BRWhCLENBQ0QsTUFBTTlELEVBQU80RCxFQUFjWixpQ0FBaUNwRCxPQUFPNEIsU0FDL0MsaUJBQVR4QixHQUFzQlMsTUFBTVQsSUFDbkN1RSxFQUFVcUIsWUFBWSxhQUFjLENBQUU1RixXQUcvQyxPLCtDQy9KSCwyQ0FpQkEsU0FBU2lILEVBQVF6RCxFQUFJMEQsR0FDbkJ6SCxLQUFLMEgsSUFBTTNELEVBQ1gvRCxLQUFLMkgsU0FBV0YsRUFmbEJ4SyxFQUFRMkssV0FBYSxXQUNuQixPQUFPLElBQUlKLEVBQVFLLEVBQU12SyxLQUFLc0ssV0FBWXpILE9BQVEySCxXQUFZQyxlQUVoRTlLLEVBQVErSyxZQUFjLFdBQ3BCLE9BQU8sSUFBSVIsRUFBUUssRUFBTXZLLEtBQUswSyxZQUFhN0gsT0FBUTJILFdBQVlHLGdCQUVqRWhMLEVBQVE4SyxhQUNSOUssRUFBUWdMLGNBQWdCLFNBQVNDLEdBQzNCQSxHQUNGQSxFQUFRQyxTQVFaWCxFQUFRekksVUFBVXFKLE1BQVFaLEVBQVF6SSxVQUFVc0osSUFBTSxhQUNsRGIsRUFBUXpJLFVBQVVvSixNQUFRLFdBQ3hCbkksS0FBSzJILFNBQVNySyxLQUFLNkMsT0FBUUgsS0FBSzBILE1BSWxDekssRUFBUXFMLE9BQVMsU0FBU0MsRUFBTUMsR0FDOUJULGFBQWFRLEVBQUtFLGdCQUNsQkYsRUFBS0csYUFBZUYsR0FHdEJ2TCxFQUFRMEwsU0FBVyxTQUFTSixHQUMxQlIsYUFBYVEsRUFBS0UsZ0JBQ2xCRixFQUFLRyxjQUFnQixHQUd2QnpMLEVBQVEyTCxhQUFlM0wsRUFBUTRMLE9BQVMsU0FBU04sR0FDL0NSLGFBQWFRLEVBQUtFLGdCQUVsQixJQUFJRCxFQUFRRCxFQUFLRyxhQUNiRixHQUFTLElBQ1hELEVBQUtFLGVBQWlCYixZQUFXLFdBQzNCVyxFQUFLTyxZQUNQUCxFQUFLTyxlQUNOTixLQUtQLEVBQVEsR0FJUnZMLEVBQVFzSSxhQUFnQyxvQkFBVHdELE1BQXdCQSxLQUFLeEQsbUJBQ2xCLElBQVh5RCxHQUEwQkEsRUFBT3pELGNBQ3hDdkYsTUFBUUEsS0FBS3VGLGFBQ3JDdEksRUFBUWdNLGVBQWtDLG9CQUFURixNQUF3QkEsS0FBS0UscUJBQ2xCLElBQVhELEdBQTBCQSxFQUFPQyxnQkFDeENqSixNQUFRQSxLQUFLaUosaUIsa0NDM0R2Qyw2QkFDSSxhQUVBLElBQUlELEVBQU96RCxhQUFYLENBSUEsSUFJSTJELEVBNkhJQyxFQVpBQyxFQXJCQUMsRUFDQUMsRUFqR0pDLEVBQWEsRUFDYkMsRUFBZ0IsR0FDaEJDLEdBQXdCLEVBQ3hCQyxFQUFNVixFQUFPekosU0FvSmJvSyxFQUFXOUwsT0FBTytMLGdCQUFrQi9MLE9BQU8rTCxlQUFlWixHQUM5RFcsRUFBV0EsR0FBWUEsRUFBUy9CLFdBQWErQixFQUFXWCxFQUdmLHFCQUFyQyxHQUFHYSxTQUFTdk0sS0FBSzBMLEVBQU9jLFNBcEZ4QlosRUFBb0IsU0FBU2EsR0FDekJELEVBQVFFLFVBQVMsV0FBY0MsRUFBYUYsUUFJcEQsV0FHSSxHQUFJZixFQUFPN0MsY0FBZ0I2QyxFQUFPa0IsY0FBZSxDQUM3QyxJQUFJQyxHQUE0QixFQUM1QkMsRUFBZXBCLEVBQU9xQixVQU0xQixPQUxBckIsRUFBT3FCLFVBQVksV0FDZkYsR0FBNEIsR0FFaENuQixFQUFPN0MsWUFBWSxHQUFJLEtBQ3ZCNkMsRUFBT3FCLFVBQVlELEVBQ1pELEdBd0VKRyxHQUlBdEIsRUFBT3VCLGlCQTlDVm5CLEVBQVUsSUFBSW1CLGdCQUNWQyxNQUFNSCxVQUFZLFNBQVMvRCxHQUUvQjJELEVBRGEzRCxFQUFNN0csT0FJdkJ5SixFQUFvQixTQUFTYSxHQUN6QlgsRUFBUXFCLE1BQU10RSxZQUFZNEQsS0EyQ3ZCTCxHQUFPLHVCQUF3QkEsRUFBSWdCLGNBQWMsV0F0Q3BEdkIsRUFBT08sRUFBSWlCLGdCQUNmekIsRUFBb0IsU0FBU2EsR0FHekIsSUFBSWEsRUFBU2xCLEVBQUlnQixjQUFjLFVBQy9CRSxFQUFPQyxtQkFBcUIsV0FDeEJaLEVBQWFGLEdBQ2JhLEVBQU9DLG1CQUFxQixLQUM1QjFCLEVBQUsyQixZQUFZRixHQUNqQkEsRUFBUyxNQUViekIsRUFBSzRCLFlBQVlILEtBS3JCMUIsRUFBb0IsU0FBU2EsR0FDekJuQyxXQUFXcUMsRUFBYyxFQUFHRixLQWxENUJWLEVBQWdCLGdCQUFrQjFJLEtBQUtxSyxTQUFXLElBQ2xEMUIsRUFBa0IsU0FBU2hELEdBQ3ZCQSxFQUFNQyxTQUFXeUMsR0FDSyxpQkFBZjFDLEVBQU03RyxNQUN5QixJQUF0QzZHLEVBQU03RyxLQUFLd0wsUUFBUTVCLElBQ25CWSxHQUFjM0QsRUFBTTdHLEtBQUt5TCxNQUFNN0IsRUFBY25ILFVBSWpEOEcsRUFBTzVDLGlCQUNQNEMsRUFBTzVDLGlCQUFpQixVQUFXa0QsR0FBaUIsR0FFcEROLEVBQU9tQyxZQUFZLFlBQWE3QixHQUdwQ0osRUFBb0IsU0FBU2EsR0FDekJmLEVBQU83QyxZQUFZa0QsRUFBZ0JVLEVBQVEsT0FnRW5ESixFQUFTcEUsYUExS1QsU0FBc0I2RixHQUVJLG1CQUFiQSxJQUNUQSxFQUFXLElBQUluTCxTQUFTLEdBQUttTCxJQUkvQixJQURBLElBQUlDLEVBQU8sSUFBSUMsTUFBTXhELFVBQVU1RixPQUFTLEdBQy9CL0UsRUFBSSxFQUFHQSxFQUFJa08sRUFBS25KLE9BQVEvRSxJQUM3QmtPLEVBQUtsTyxHQUFLMkssVUFBVTNLLEVBQUksR0FHNUIsSUFBSW9PLEVBQU8sQ0FBRUgsU0FBVUEsRUFBVUMsS0FBTUEsR0FHdkMsT0FGQTdCLEVBQWNELEdBQWNnQyxFQUM1QnJDLEVBQWtCSyxHQUNYQSxLQTZKVEksRUFBU1YsZUFBaUJBLEVBMUoxQixTQUFTQSxFQUFlYyxVQUNiUCxFQUFjTyxHQXlCekIsU0FBU0UsRUFBYUYsR0FHbEIsR0FBSU4sRUFHQTdCLFdBQVdxQyxFQUFjLEVBQUdGLE9BQ3pCLENBQ0gsSUFBSXdCLEVBQU8vQixFQUFjTyxHQUN6QixHQUFJd0IsRUFBTSxDQUNOOUIsR0FBd0IsRUFDeEIsS0FqQ1osU0FBYThCLEdBQ1QsSUFBSUgsRUFBV0csRUFBS0gsU0FDaEJDLEVBQU9FLEVBQUtGLEtBQ2hCLE9BQVFBLEVBQUtuSixRQUNiLEtBQUssRUFDRGtKLElBQ0EsTUFDSixLQUFLLEVBQ0RBLEVBQVNDLEVBQUssSUFDZCxNQUNKLEtBQUssRUFDREQsRUFBU0MsRUFBSyxHQUFJQSxFQUFLLElBQ3ZCLE1BQ0osS0FBSyxFQUNERCxFQUFTQyxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxJQUNoQyxNQUNKLFFBQ0lELEVBQVN2RCxNQUFNekksRUFBV2lNLElBaUJsQkcsQ0FBSUQsR0FDTixRQUNFdEMsRUFBZWMsR0FDZk4sR0FBd0IsTUF2RTVDLENBeUxrQixvQkFBVFYsVUFBeUMsSUFBWEMsRUFBeUJoSixLQUFPZ0osRUFBU0QsUSxvQ0N4TGhGLElBT0kwQyxFQUNBQyxFQVJBNUIsRUFBVTVNLEVBQU9ELFFBQVUsR0FVL0IsU0FBUzBPLElBQ0wsTUFBTSxJQUFJOUwsTUFBTSxtQ0FFcEIsU0FBUytMLElBQ0wsTUFBTSxJQUFJL0wsTUFBTSxxQ0FzQnBCLFNBQVNnTSxFQUFXQyxHQUNoQixHQUFJTCxJQUFxQjdELFdBRXJCLE9BQU9BLFdBQVdrRSxFQUFLLEdBRzNCLElBQUtMLElBQXFCRSxJQUFxQkYsSUFBcUI3RCxXQUVoRSxPQURBNkQsRUFBbUI3RCxXQUNaQSxXQUFXa0UsRUFBSyxHQUUzQixJQUVJLE9BQU9MLEVBQWlCSyxFQUFLLEdBQy9CLE1BQU01TCxHQUNKLElBRUksT0FBT3VMLEVBQWlCbk8sS0FBSyxLQUFNd08sRUFBSyxHQUMxQyxNQUFNNUwsR0FFSixPQUFPdUwsRUFBaUJuTyxLQUFLMEMsS0FBTThMLEVBQUssTUF2Q25ELFdBQ0csSUFFUUwsRUFEc0IsbUJBQWY3RCxXQUNZQSxXQUVBK0QsRUFFekIsTUFBT3pMLEdBQ0x1TCxFQUFtQkUsRUFFdkIsSUFFUUQsRUFEd0IsbUJBQWpCM0QsYUFDY0EsYUFFQTZELEVBRTNCLE1BQU8xTCxHQUNMd0wsRUFBcUJFLEdBakI3QixHQXdFQSxJQUVJRyxFQUZBQyxFQUFRLEdBQ1JDLEdBQVcsRUFFWEMsR0FBYyxFQUVsQixTQUFTQyxJQUNBRixHQUFhRixJQUdsQkUsR0FBVyxFQUNQRixFQUFhN0osT0FDYjhKLEVBQVFELEVBQWFLLE9BQU9KLEdBRTVCRSxHQUFjLEVBRWRGLEVBQU05SixRQUNObUssS0FJUixTQUFTQSxJQUNMLElBQUlKLEVBQUosQ0FHQSxJQUFJL0QsRUFBVTJELEVBQVdNLEdBQ3pCRixHQUFXLEVBR1gsSUFEQSxJQUFJSyxFQUFNTixFQUFNOUosT0FDVm9LLEdBQUssQ0FHUCxJQUZBUCxFQUFlQyxFQUNmQSxFQUFRLEtBQ0NFLEVBQWFJLEdBQ2RQLEdBQ0FBLEVBQWFHLEdBQVlWLE1BR2pDVSxHQUFjLEVBQ2RJLEVBQU1OLEVBQU05SixPQUVoQjZKLEVBQWUsS0FDZkUsR0FBVyxFQW5FZixTQUF5QjNILEdBQ3JCLEdBQUlvSCxJQUF1QjNELGFBRXZCLE9BQU9BLGFBQWF6RCxHQUd4QixJQUFLb0gsSUFBdUJFLElBQXdCRixJQUF1QjNELGFBRXZFLE9BREEyRCxFQUFxQjNELGFBQ2RBLGFBQWF6RCxHQUV4QixJQUVXb0gsRUFBbUJwSCxHQUM1QixNQUFPcEUsR0FDTCxJQUVJLE9BQU93TCxFQUFtQnBPLEtBQUssS0FBTWdILEdBQ3ZDLE1BQU9wRSxHQUdMLE9BQU93TCxFQUFtQnBPLEtBQUswQyxLQUFNc0UsS0FnRDdDaUksQ0FBZ0JyRSxJQWlCcEIsU0FBU3NFLEVBQUtWLEVBQUtXLEdBQ2Z6TSxLQUFLOEwsSUFBTUEsRUFDWDlMLEtBQUt5TSxNQUFRQSxFQVlqQixTQUFTQyxLQTVCVDVDLEVBQVFFLFNBQVcsU0FBVThCLEdBQ3pCLElBQUlULEVBQU8sSUFBSUMsTUFBTXhELFVBQVU1RixPQUFTLEdBQ3hDLEdBQUk0RixVQUFVNUYsT0FBUyxFQUNuQixJQUFLLElBQUkvRSxFQUFJLEVBQUdBLEVBQUkySyxVQUFVNUYsT0FBUS9FLElBQ2xDa08sRUFBS2xPLEVBQUksR0FBSzJLLFVBQVUzSyxHQUdoQzZPLEVBQU03SyxLQUFLLElBQUlxTCxFQUFLVixFQUFLVCxJQUNKLElBQWpCVyxFQUFNOUosUUFBaUIrSixHQUN2QkosRUFBV1EsSUFTbkJHLEVBQUt6TixVQUFVeU0sSUFBTSxXQUNqQnhMLEtBQUs4TCxJQUFJakUsTUFBTSxLQUFNN0gsS0FBS3lNLFFBRTlCM0MsRUFBUTZDLE1BQVEsVUFDaEI3QyxFQUFROEMsU0FBVSxFQUNsQjlDLEVBQVErQyxJQUFNLEdBQ2QvQyxFQUFRZ0QsS0FBTyxHQUNmaEQsRUFBUWlELFFBQVUsR0FDbEJqRCxFQUFRa0QsU0FBVyxHQUluQmxELEVBQVFtRCxHQUFLUCxFQUNiNUMsRUFBUW9ELFlBQWNSLEVBQ3RCNUMsRUFBUXFELEtBQU9ULEVBQ2Y1QyxFQUFRc0QsSUFBTVYsRUFDZDVDLEVBQVF1RCxlQUFpQlgsRUFDekI1QyxFQUFRd0QsbUJBQXFCWixFQUM3QjVDLEVBQVF5RCxLQUFPYixFQUNmNUMsRUFBUTBELGdCQUFrQmQsRUFDMUI1QyxFQUFRMkQsb0JBQXNCZixFQUU5QjVDLEVBQVE0RCxVQUFZLFNBQVVoUSxHQUFRLE1BQU8sSUFFN0NvTSxFQUFRNkQsUUFBVSxTQUFValEsR0FDeEIsTUFBTSxJQUFJbUMsTUFBTSxxQ0FHcEJpSyxFQUFROEQsSUFBTSxXQUFjLE1BQU8sS0FDbkM5RCxFQUFRK0QsTUFBUSxTQUFVQyxHQUN0QixNQUFNLElBQUlqTyxNQUFNLG1DQUVwQmlLLEVBQVFpRSxNQUFRLFdBQWEsT0FBTyxJLDZCQ3RMcENsUSxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sSUFLdEQsTUFBTStGLEVBQWdCLEVBQVEsR0F3QjlCbEgsRUFBUXNILGlCQXZCUixNQUNJLCtCQUErQmhFLEdBQzNCLE1BQU0sU0FBRWtCLEdBQWEwQyxFQUFjL0MseUJBQXlCYixHQUM1RFAsS0FBS2dPLFFBQVF2TSxHQUFZQSxFQUFTbkMsU0FFdEMsUUFBUTJPLEdBQ0pqTyxLQUFLa08scUJBQXFCbE8sS0FBS21PLFVBQy9Cbk8sS0FBS29PLG1CQUFtQkgsR0FDeEJqTyxLQUFLbU8sU0FBV0YsRUFFcEIscUJBQXFCM08sR0FDWkEsSUFHTEEsRUFBUStPLFVBQVkvTyxFQUFRK08sVUFBVUMsUUFBUSx3QkFBeUIsS0FFM0UsbUJBQW1CaFAsR0FDVkEsSUFHTEEsRUFBUStPLFdBQWEsd0IsNkJDdEI3QnhRLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxJQVN0RG5CLEVBQVFvSSxtQkFSUixTQUE0QmtKLEdBQ0ksWUFBeEJoUCxTQUFTaVAsWUFBb0Qsa0JBQXhCalAsU0FBU2lQLFdBQzlDalAsU0FBUzZHLGlCQUFpQixtQkFBb0JtSSxHQUc5Q0EsTSw2QkNOUjFRLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxJQUN0RCxNQUFNZ0MsRUFBYSxFQUFRLEdBQzNCbkQsRUFBUThILHNCQUF5Qk4sR0FDdEIsSUFBSSxNQUNQLFlBQVkrQixFQUFNMUYsR0FDZDJELEVBQU8wQixZQUFZLENBQ2ZLLE9BQ0FELE9BQVFuRyxFQUFXTixjQUFjeUcsT0FDakN6RixZLGlCQ2JoQixZQVVBLElBQUkyTixFQUFrQixzQkFHbEJDLEVBQU0sSUFHTkMsRUFBWSxrQkFHWkMsRUFBUyxhQUdUQyxFQUFhLHFCQUdiQyxFQUFhLGFBR2JDLEVBQVksY0FHWkMsRUFBZUMsU0FHZkMsRUFBOEIsaUJBQVZsRyxHQUFzQkEsR0FBVUEsRUFBT25MLFNBQVdBLFFBQVVtTCxFQUdoRm1HLEVBQTBCLGlCQUFScEcsTUFBb0JBLE1BQVFBLEtBQUtsTCxTQUFXQSxRQUFVa0wsS0FHeEVxRyxFQUFPRixHQUFjQyxHQUFZbFAsU0FBUyxjQUFUQSxHQVVqQ29QLEVBUGN4UixPQUFPa0IsVUFPUThLLFNBRzdCeUYsRUFBWTNPLEtBQUtGLElBQ2pCOE8sRUFBWTVPLEtBQUtILElBa0JqQmdQLEVBQU0sV0FDUixPQUFPSixFQUFLSyxLQUFLRCxPQXlEbkIsU0FBU0UsRUFBU0MsRUFBTUMsRUFBTUMsR0FDNUIsSUFBSUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFBaUIsRUFDakJDLEdBQVUsRUFDVkMsR0FBUyxFQUNUQyxHQUFXLEVBRWYsR0FBbUIsbUJBQVJaLEVBQ1QsTUFBTSxJQUFJYSxVQUFVL0IsR0FVdEIsU0FBU2dDLEVBQVdDLEdBQ2xCLElBQUlyRixFQUFPeUUsRUFDUGEsRUFBVVosRUFLZCxPQUhBRCxFQUFXQyxPQUFXM1EsRUFDdEJnUixFQUFpQk0sRUFDakJULEVBQVNOLEVBQUs5SCxNQUFNOEksRUFBU3RGLEdBcUIvQixTQUFTdUYsRUFBYUYsR0FDcEIsSUFBSUcsRUFBb0JILEVBQU9QLEVBTS9CLFlBQXlCL1EsSUFBakIrUSxHQUErQlUsR0FBcUJqQixHQUN6RGlCLEVBQW9CLEdBQU9QLEdBTkpJLEVBQU9OLEdBTThCSixFQUdqRSxTQUFTYyxJQUNQLElBQUlKLEVBQU9sQixJQUNYLEdBQUlvQixFQUFhRixHQUNmLE9BQU9LLEVBQWFMLEdBR3RCUixFQUFVdEksV0FBV2tKLEVBekJ2QixTQUF1QkosR0FDckIsSUFFSVQsRUFBU0wsR0FGV2MsRUFBT1AsR0FJL0IsT0FBT0csRUFBU2YsRUFBVVUsRUFBUUQsR0FIUlUsRUFBT04sSUFHa0NILEVBb0JoQ2UsQ0FBY04sSUFHbkQsU0FBU0ssRUFBYUwsR0FLcEIsT0FKQVIsT0FBVTlRLEVBSU5tUixHQUFZVCxFQUNQVyxFQUFXQyxJQUVwQlosRUFBV0MsT0FBVzNRLEVBQ2Y2USxHQWVULFNBQVNnQixJQUNQLElBQUlQLEVBQU9sQixJQUNQMEIsRUFBYU4sRUFBYUYsR0FNOUIsR0FKQVosRUFBV2hJLFVBQ1hpSSxFQUFXL1AsS0FDWG1RLEVBQWVPLEVBRVhRLEVBQVksQ0FDZCxRQUFnQjlSLElBQVo4USxFQUNGLE9BdkVOLFNBQXFCUSxHQU1uQixPQUpBTixFQUFpQk0sRUFFakJSLEVBQVV0SSxXQUFXa0osRUFBY2xCLEdBRTVCUyxFQUFVSSxFQUFXQyxHQUFRVCxFQWlFekJrQixDQUFZaEIsR0FFckIsR0FBSUcsRUFHRixPQURBSixFQUFVdEksV0FBV2tKLEVBQWNsQixHQUM1QmEsRUFBV04sR0FNdEIsWUFIZ0IvUSxJQUFaOFEsSUFDRkEsRUFBVXRJLFdBQVdrSixFQUFjbEIsSUFFOUJLLEVBSVQsT0F4R0FMLEVBQU93QixFQUFTeEIsSUFBUyxFQUNyQnlCLEVBQVN4QixLQUNYUSxJQUFZUixFQUFRUSxRQUVwQkwsR0FEQU0sRUFBUyxZQUFhVCxHQUNIUCxFQUFVOEIsRUFBU3ZCLEVBQVFHLFVBQVksRUFBR0osR0FBUUksRUFDckVPLEVBQVcsYUFBY1YsSUFBWUEsRUFBUVUsU0FBV0EsR0FpRzFEVSxFQUFVSyxPQW5DVixnQkFDa0JsUyxJQUFaOFEsR0FDRm5JLGFBQWFtSSxHQUVmRSxFQUFpQixFQUNqQk4sRUFBV0ssRUFBZUosRUFBV0csT0FBVTlRLEdBK0JqRDZSLEVBQVVNLE1BNUJWLFdBQ0UsWUFBbUJuUyxJQUFaOFEsRUFBd0JELEVBQVNjLEVBQWF2QixNQTRCaER5QixFQTBGVCxTQUFTSSxFQUFTalQsR0FDaEIsSUFBSW9JLFNBQWNwSSxFQUNsQixRQUFTQSxJQUFrQixVQUFSb0ksR0FBNEIsWUFBUkEsR0E0RXpDLFNBQVM0SyxFQUFTaFQsR0FDaEIsR0FBb0IsaUJBQVRBLEVBQ1QsT0FBT0EsRUFFVCxHQWhDRixTQUFrQkEsR0FDaEIsTUFBdUIsaUJBQVRBLEdBdEJoQixTQUFzQkEsR0FDcEIsUUFBU0EsR0FBeUIsaUJBQVRBLEVBc0J0Qm9ULENBQWFwVCxJQUFVaVIsRUFBZS9SLEtBQUtjLElBQVV1USxFQThCcEQ4QyxDQUFTclQsR0FDWCxPQUFPc1EsRUFFVCxHQUFJMkMsRUFBU2pULEdBQVEsQ0FDbkIsSUFBSXNULEVBQWdDLG1CQUFqQnRULEVBQU11VCxRQUF3QnZULEVBQU11VCxVQUFZdlQsRUFDbkVBLEVBQVFpVCxFQUFTSyxHQUFVQSxFQUFRLEdBQU1BLEVBRTNDLEdBQW9CLGlCQUFUdFQsRUFDVCxPQUFpQixJQUFWQSxFQUFjQSxHQUFTQSxFQUVoQ0EsRUFBUUEsRUFBTWtRLFFBQVFNLEVBQVEsSUFDOUIsSUFBSWdELEVBQVc5QyxFQUFXekgsS0FBS2pKLEdBQy9CLE9BQVF3VCxHQUFZN0MsRUFBVTFILEtBQUtqSixHQUMvQjRRLEVBQWE1USxFQUFNOE0sTUFBTSxHQUFJMEcsRUFBVyxFQUFJLEdBQzNDL0MsRUFBV3hILEtBQUtqSixHQUFTc1EsR0FBT3RRLEVBR3ZDbEIsRUFBT0QsUUE5SVAsU0FBa0IwUyxFQUFNQyxFQUFNQyxHQUM1QixJQUFJUSxHQUFVLEVBQ1ZFLEdBQVcsRUFFZixHQUFtQixtQkFBUlosRUFDVCxNQUFNLElBQUlhLFVBQVUvQixHQU10QixPQUpJNEMsRUFBU3hCLEtBQ1hRLEVBQVUsWUFBYVIsSUFBWUEsRUFBUVEsUUFBVUEsRUFDckRFLEVBQVcsYUFBY1YsSUFBWUEsRUFBUVUsU0FBV0EsR0FFbkRiLEVBQVNDLEVBQU1DLEVBQU0sQ0FDMUIsUUFBV1MsRUFDWCxRQUFXVCxFQUNYLFNBQVlXLE8iLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IGNhY2hlZFNldHRpbmdzID0gdW5kZWZpbmVkO1xuZnVuY3Rpb24gZ2V0RGF0YShrZXkpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZzY29kZS1tYXJrZG93bi1wcmV2aWV3LWRhdGEnKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkYXRhID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvYWQgZGF0YSBmb3IgJHtrZXl9YCk7XG59XG5leHBvcnRzLmdldERhdGEgPSBnZXREYXRhO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKSB7XG4gICAgaWYgKGNhY2hlZFNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRTZXR0aW5ncztcbiAgICB9XG4gICAgY2FjaGVkU2V0dGluZ3MgPSBnZXREYXRhKCdkYXRhLXNldHRpbmdzJyk7XG4gICAgaWYgKGNhY2hlZFNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRTZXR0aW5ncztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuZXhwb3J0cy5nZXRTZXR0aW5ncyA9IGdldFNldHRpbmdzO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmNvbnN0IGNvZGVMaW5lQ2xhc3MgPSAnY29kZS1saW5lJztcbmZ1bmN0aW9uIGNsYW1wKG1pbiwgbWF4LCB2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgdmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGNsYW1wTGluZShsaW5lKSB7XG4gICAgcmV0dXJuIGNsYW1wKDAsIHNldHRpbmdzXzEuZ2V0U2V0dGluZ3MoKS5saW5lQ291bnQgLSAxLCBsaW5lKTtcbn1cbmNvbnN0IGdldENvZGVMaW5lRWxlbWVudHMgPSAoKCkgPT4ge1xuICAgIGxldCBlbGVtZW50cztcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgICAgICAgICBlbGVtZW50cyA9IFt7IGVsZW1lbnQ6IGRvY3VtZW50LmJvZHksIGxpbmU6IDAgfV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjb2RlTGluZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSArZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGluZScpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0NPREUnICYmIGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBlbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ1BSRScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmVuY2hlZCBjb2RlIGJsb2NrcyBhcmUgYSBzcGVjaWFsIGNhc2Ugc2luY2UgdGhlIGBjb2RlLWxpbmVgIGNhbiBvbmx5IGJlIG1hcmtlZCBvblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYDxjb2RlPmAgZWxlbWVudCBhbmQgbm90IHRoZSBwYXJlbnQgYDxwcmU+YCBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKHsgZWxlbWVudDogZWxlbWVudC5wYXJlbnRFbGVtZW50LCBsaW5lIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaCh7IGVsZW1lbnQ6IGVsZW1lbnQsIGxpbmUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9O1xufSkoKTtcbi8qKlxuICogRmluZCB0aGUgaHRtbCBlbGVtZW50cyB0aGF0IG1hcCB0byBhIHNwZWNpZmljIHRhcmdldCBsaW5lIGluIHRoZSBlZGl0b3IuXG4gKlxuICogSWYgYW4gZXhhY3QgbWF0Y2gsIHJldHVybnMgYSBzaW5nbGUgZWxlbWVudC4gSWYgdGhlIGxpbmUgaXMgYmV0d2VlbiBlbGVtZW50cyxcbiAqIHJldHVybnMgdGhlIGVsZW1lbnQgcHJpb3IgdG8gYW5kIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBnaXZlbiBsaW5lLlxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUodGFyZ2V0TGluZSkge1xuICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBNYXRoLmZsb29yKHRhcmdldExpbmUpO1xuICAgIGNvbnN0IGxpbmVzID0gZ2V0Q29kZUxpbmVFbGVtZW50cygpO1xuICAgIGxldCBwcmV2aW91cyA9IGxpbmVzWzBdIHx8IG51bGw7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoZW50cnkubGluZSA9PT0gbGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJldmlvdXM6IGVudHJ5LCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbnRyeS5saW5lID4gbGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJldmlvdXMsIG5leHQ6IGVudHJ5IH07XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXMgPSBlbnRyeTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcHJldmlvdXMgfTtcbn1cbmV4cG9ydHMuZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lO1xuLyoqXG4gKiBGaW5kIHRoZSBodG1sIGVsZW1lbnRzIHRoYXQgYXJlIGF0IGEgc3BlY2lmaWMgcGl4ZWwgb2Zmc2V0IG9uIHRoZSBwYWdlLlxuICovXG5mdW5jdGlvbiBnZXRMaW5lRWxlbWVudHNBdFBhZ2VPZmZzZXQob2Zmc2V0KSB7XG4gICAgY29uc3QgbGluZXMgPSBnZXRDb2RlTGluZUVsZW1lbnRzKCk7XG4gICAgY29uc3QgcG9zaXRpb24gPSBvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWTtcbiAgICBsZXQgbG8gPSAtMTtcbiAgICBsZXQgaGkgPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChsbyArIDEgPCBoaSkge1xuICAgICAgICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKChsbyArIGhpKSAvIDIpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBnZXRFbGVtZW50Qm91bmRzKGxpbmVzW21pZF0pO1xuICAgICAgICBpZiAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gcG9zaXRpb24pIHtcbiAgICAgICAgICAgIGhpID0gbWlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG8gPSBtaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaGlFbGVtZW50ID0gbGluZXNbaGldO1xuICAgIGNvbnN0IGhpQm91bmRzID0gZ2V0RWxlbWVudEJvdW5kcyhoaUVsZW1lbnQpO1xuICAgIGlmIChoaSA+PSAxICYmIGhpQm91bmRzLnRvcCA+IHBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGxvRWxlbWVudCA9IGxpbmVzW2xvXTtcbiAgICAgICAgcmV0dXJuIHsgcHJldmlvdXM6IGxvRWxlbWVudCwgbmV4dDogaGlFbGVtZW50IH07XG4gICAgfVxuICAgIGlmIChoaSA+IDEgJiYgaGkgPCBsaW5lcy5sZW5ndGggJiYgaGlCb3VuZHMudG9wICsgaGlCb3VuZHMuaGVpZ2h0ID4gcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcHJldmlvdXM6IGhpRWxlbWVudCwgbmV4dDogbGluZXNbaGkgKyAxXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBwcmV2aW91czogaGlFbGVtZW50IH07XG59XG5leHBvcnRzLmdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldCA9IGdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldDtcbmZ1bmN0aW9uIGdldEVsZW1lbnRCb3VuZHMoeyBlbGVtZW50IH0pIHtcbiAgICBjb25zdCBteUJvdW5kcyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gU29tZSBjb2RlIGxpbmUgZWxlbWVudHMgbWF5IGNvbnRhaW4gb3RoZXIgY29kZSBsaW5lIGVsZW1lbnRzLlxuICAgIC8vIEluIHRob3NlIGNhc2VzLCBvbmx5IHRha2UgdGhlIGhlaWdodCB1cCB0byB0aGF0IGNoaWxkLlxuICAgIGNvbnN0IGNvZGVMaW5lQ2hpbGQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2NvZGVMaW5lQ2xhc3N9YCk7XG4gICAgaWYgKGNvZGVMaW5lQ2hpbGQpIHtcbiAgICAgICAgY29uc3QgY2hpbGRCb3VuZHMgPSBjb2RlTGluZUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCAoY2hpbGRCb3VuZHMudG9wIC0gbXlCb3VuZHMudG9wKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IG15Qm91bmRzLnRvcCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBteUJvdW5kcztcbn1cbi8qKlxuICogQXR0ZW1wdCB0byByZXZlYWwgdGhlIGVsZW1lbnQgZm9yIGEgc291cmNlIGxpbmUgaW4gdGhlIGVkaXRvci5cbiAqL1xuZnVuY3Rpb24gc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGxpbmUpIHtcbiAgICBpZiAoIXNldHRpbmdzXzEuZ2V0U2V0dGluZ3MoKS5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChsaW5lIDw9IDApIHtcbiAgICAgICAgd2luZG93LnNjcm9sbCh3aW5kb3cuc2Nyb2xsWCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2Nyb2xsVG8gPSAwO1xuICAgIGNvbnN0IHJlY3QgPSBnZXRFbGVtZW50Qm91bmRzKHByZXZpb3VzKTtcbiAgICBjb25zdCBwcmV2aW91c1RvcCA9IHJlY3QudG9wO1xuICAgIGlmIChuZXh0ICYmIG5leHQubGluZSAhPT0gcHJldmlvdXMubGluZSkge1xuICAgICAgICAvLyBCZXR3ZWVuIHR3byBlbGVtZW50cy4gR28gdG8gcGVyY2VudGFnZSBvZmZzZXQgYmV0d2VlbiB0aGVtLlxuICAgICAgICBjb25zdCBiZXR3ZWVuUHJvZ3Jlc3MgPSAobGluZSAtIHByZXZpb3VzLmxpbmUpIC8gKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuICAgICAgICBjb25zdCBlbGVtZW50T2Zmc2V0ID0gbmV4dC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHByZXZpb3VzVG9wO1xuICAgICAgICBzY3JvbGxUbyA9IHByZXZpb3VzVG9wICsgYmV0d2VlblByb2dyZXNzICogZWxlbWVudE9mZnNldDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzSW5FbGVtZW50ID0gbGluZSAtIE1hdGguZmxvb3IobGluZSk7XG4gICAgICAgIHNjcm9sbFRvID0gcHJldmlvdXNUb3AgKyAocmVjdC5oZWlnaHQgKiBwcm9ncmVzc0luRWxlbWVudCk7XG4gICAgfVxuICAgIHdpbmRvdy5zY3JvbGwod2luZG93LnNjcm9sbFgsIE1hdGgubWF4KDEsIHdpbmRvdy5zY3JvbGxZICsgc2Nyb2xsVG8pKTtcbn1cbmV4cG9ydHMuc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lID0gc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lO1xuZnVuY3Rpb24gZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQob2Zmc2V0KSB7XG4gICAgY29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0TGluZUVsZW1lbnRzQXRQYWdlT2Zmc2V0KG9mZnNldCk7XG4gICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQm91bmRzID0gZ2V0RWxlbWVudEJvdW5kcyhwcmV2aW91cyk7XG4gICAgICAgIGNvbnN0IG9mZnNldEZyb21QcmV2aW91cyA9IChvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWSAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzc0JldHdlZW5FbGVtZW50cyA9IG9mZnNldEZyb21QcmV2aW91cyAvIChnZXRFbGVtZW50Qm91bmRzKG5leHQpLnRvcCAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcHJldmlvdXMubGluZSArIHByb2dyZXNzQmV0d2VlbkVsZW1lbnRzICogKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGNsYW1wTGluZShsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzV2l0aGluRWxlbWVudCA9IG9mZnNldEZyb21QcmV2aW91cyAvIChwcmV2aW91c0JvdW5kcy5oZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHByZXZpb3VzLmxpbmUgKyBwcm9ncmVzc1dpdGhpbkVsZW1lbnQ7XG4gICAgICAgICAgICByZXR1cm4gY2xhbXBMaW5lKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZXhwb3J0cy5nZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldCA9IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0O1xuLyoqXG4gKiBUcnkgdG8gZmluZCB0aGUgaHRtbCBlbGVtZW50IGJ5IHVzaW5nIGEgZnJhZ21lbnQgaWRcbiAqL1xuZnVuY3Rpb24gZ2V0TGluZUVsZW1lbnRGb3JGcmFnbWVudChmcmFnbWVudCkge1xuICAgIHJldHVybiBnZXRDb2RlTGluZUVsZW1lbnRzKCkuZmluZCgoZWxlbWVudCkgPT4ge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5lbGVtZW50LmlkID09PSBmcmFnbWVudDtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0TGluZUVsZW1lbnRGb3JGcmFnbWVudCA9IGdldExpbmVFbGVtZW50Rm9yRnJhZ21lbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYWN0aXZlTGluZU1hcmtlcl8xID0gcmVxdWlyZShcIi4vYWN0aXZlTGluZU1hcmtlclwiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3QgbWVzc2FnaW5nXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdpbmdcIik7XG5jb25zdCBzY3JvbGxfc3luY18xID0gcmVxdWlyZShcIi4vc2Nyb2xsLXN5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5jb25zdCB0aHJvdHRsZSA9IHJlcXVpcmUoXCJsb2Rhc2gudGhyb3R0bGVcIik7XG5sZXQgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuY29uc3QgbWFya2VyID0gbmV3IGFjdGl2ZUxpbmVNYXJrZXJfMS5BY3RpdmVMaW5lTWFya2VyKCk7XG5jb25zdCBzZXR0aW5ncyA9IHNldHRpbmdzXzEuZ2V0U2V0dGluZ3MoKTtcbmNvbnN0IHZzY29kZSA9IGFjcXVpcmVWc0NvZGVBcGkoKTtcbmNvbnN0IHN0YXRlID0geyAuLi52c2NvZGUuZ2V0U3RhdGUoKSwgLi4uc2V0dGluZ3NfMS5nZXREYXRhKCdkYXRhLXN0YXRlJykgfTtcbi8vIE1ha2Ugc3VyZSB0byBzeW5jIFZTIENvZGUgc3RhdGUgaGVyZVxudnNjb2RlLnNldFN0YXRlKHN0YXRlKTtcbmNvbnN0IG1lc3NhZ2luZyA9IG1lc3NhZ2luZ18xLmNyZWF0ZVBvc3RlckZvclZzQ29kZSh2c2NvZGUpO1xud2luZG93LmNzcEFsZXJ0ZXIuc2V0UG9zdGVyKG1lc3NhZ2luZyk7XG53aW5kb3cuc3R5bGVMb2FkaW5nTW9uaXRvci5zZXRQb3N0ZXIobWVzc2FnaW5nKTtcbndpbmRvdy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgdXBkYXRlSW1hZ2VTaXplcygpO1xufTtcbmV2ZW50c18xLm9uY2VEb2N1bWVudExvYWRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2Nyb2xsUHJvZ3Jlc3MgPSBzdGF0ZS5zY3JvbGxQcm9ncmVzcztcbiAgICBpZiAodHlwZW9mIHNjcm9sbFByb2dyZXNzID09PSAnbnVtYmVyJyAmJiAhc2V0dGluZ3MuZnJhZ21lbnQpIHtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBzY3JvbGxQcm9ncmVzcyAqIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnNjcm9sbFByZXZpZXdXaXRoRWRpdG9yKSB7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gc2Nyb2xsIHRvIGZyYWdtZW50IGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuZnJhZ21lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdnNjb2RlLnNldFN0YXRlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc2Nyb2xsX3N5bmNfMS5nZXRMaW5lRWxlbWVudEZvckZyYWdtZW50KHNldHRpbmdzLmZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbF9zeW5jXzEuc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGVsZW1lbnQubGluZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihzZXR0aW5ncy5saW5lKSkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbF9zeW5jXzEuc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKHNldHRpbmdzLmxpbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jb25zdCBvblVwZGF0ZVZpZXcgPSAoKCkgPT4ge1xuICAgIGNvbnN0IGRvU2Nyb2xsID0gdGhyb3R0bGUoKGxpbmUpID0+IHtcbiAgICAgICAgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBzY3JvbGxfc3luY18xLnNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShsaW5lKTtcbiAgICB9LCA1MCk7XG4gICAgcmV0dXJuIChsaW5lKSA9PiB7XG4gICAgICAgIGlmICghaXNOYU4obGluZSkpIHtcbiAgICAgICAgICAgIHN0YXRlLmxpbmUgPSBsaW5lO1xuICAgICAgICAgICAgZG9TY3JvbGwobGluZSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmxldCB1cGRhdGVJbWFnZVNpemVzID0gdGhyb3R0bGUoKCkgPT4ge1xuICAgIGNvbnN0IGltYWdlSW5mbyA9IFtdO1xuICAgIGxldCBpbWFnZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XG4gICAgaWYgKGltYWdlcykge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW1nID0gaW1hZ2VzW2ldO1xuICAgICAgICAgICAgaWYgKGltZy5jbGFzc0xpc3QuY29udGFpbnMoJ2xvYWRpbmcnKSkge1xuICAgICAgICAgICAgICAgIGltZy5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbWFnZUluZm8ucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IGltZy5pZCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGltZy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGltZy53aWR0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnaW5nLnBvc3RNZXNzYWdlKCdjYWNoZUltYWdlU2l6ZXMnLCBpbWFnZUluZm8pO1xuICAgIH1cbn0sIDUwKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuICAgIHVwZGF0ZVNjcm9sbFByb2dyZXNzKCk7XG4gICAgdXBkYXRlSW1hZ2VTaXplcygpO1xufSwgdHJ1ZSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQuZGF0YS5zb3VyY2UgIT09IHNldHRpbmdzLnNvdXJjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoZXZlbnQuZGF0YS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ29uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbic6XG4gICAgICAgICAgICBtYXJrZXIub25EaWRDaGFuZ2VUZXh0RWRpdG9yU2VsZWN0aW9uKGV2ZW50LmRhdGEubGluZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndXBkYXRlVmlldyc6XG4gICAgICAgICAgICBvblVwZGF0ZVZpZXcoZXZlbnQuZGF0YS5saW5lKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn0sIGZhbHNlKTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgZXZlbnQgPT4ge1xuICAgIGlmICghc2V0dGluZ3MuZG91YmxlQ2xpY2tUb1N3aXRjaFRvRWRpdG9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWdub3JlIGNsaWNrcyBvbiBsaW5rc1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQ7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gZXZlbnQucGFnZVk7XG4gICAgY29uc3QgbGluZSA9IHNjcm9sbF9zeW5jXzEuZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQob2Zmc2V0KTtcbiAgICBpZiAodHlwZW9mIGxpbmUgPT09ICdudW1iZXInICYmICFpc05hTihsaW5lKSkge1xuICAgICAgICBtZXNzYWdpbmcucG9zdE1lc3NhZ2UoJ2RpZENsaWNrJywgeyBsaW5lOiBNYXRoLmZsb29yKGxpbmUpIH0pO1xuICAgIH1cbn0pO1xuY29uc3QgcGFzc1Rocm91Z2hMaW5rU2NoZW1lcyA9IFsnaHR0cDonLCAnaHR0cHM6JywgJ21haWx0bzonLCAndnNjb2RlOicsICd2c2NvZGUtaW5zaWRlcnM6J107XG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG5vZGUgPSBldmVudC50YXJnZXQ7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUgPT09ICdBJyAmJiBub2RlLmhyZWYpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZSgnaHJlZicpLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBhc3MgdGhyb3VnaCBrbm93biBzY2hlbWVzXG4gICAgICAgICAgICBpZiAocGFzc1Rocm91Z2hMaW5rU2NoZW1lcy5zb21lKHNjaGVtZSA9PiBub2RlLmhyZWYuc3RhcnRzV2l0aChzY2hlbWUpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhyZWZUZXh0ID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaHJlZicpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgICAgICAgICAvLyBJZiBvcmlnaW5hbCBsaW5rIGRvZXNuJ3QgbG9vayBsaWtlIGEgdXJsLCBkZWxlZ2F0ZSBiYWNrIHRvIFZTIENvZGUgdG8gcmVzb2x2ZVxuICAgICAgICAgICAgaWYgKCEvXlthLXpcXC1dKzovaS50ZXN0KGhyZWZUZXh0KSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2luZy5wb3N0TWVzc2FnZSgnb3BlbkxpbmsnLCB7IGhyZWY6IGhyZWZUZXh0IH0pO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxufSwgdHJ1ZSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGUoKCkgPT4ge1xuICAgIHVwZGF0ZVNjcm9sbFByb2dyZXNzKCk7XG4gICAgaWYgKHNjcm9sbERpc2FibGVkKSB7XG4gICAgICAgIHNjcm9sbERpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBsaW5lID0gc2Nyb2xsX3N5bmNfMS5nZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldCh3aW5kb3cuc2Nyb2xsWSk7XG4gICAgICAgIGlmICh0eXBlb2YgbGluZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKGxpbmUpKSB7XG4gICAgICAgICAgICBtZXNzYWdpbmcucG9zdE1lc3NhZ2UoJ3JldmVhbExpbmUnLCB7IGxpbmUgfSk7XG4gICAgICAgIH1cbiAgICB9XG59LCA1MCkpO1xuZnVuY3Rpb24gdXBkYXRlU2Nyb2xsUHJvZ3Jlc3MoKSB7XG4gICAgc3RhdGUuc2Nyb2xsUHJvZ3Jlc3MgPSB3aW5kb3cuc2Nyb2xsWSAvIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xuICAgIHZzY29kZS5zZXRTdGF0ZShzdGF0ZSk7XG59XG4iLCJ2YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgd2luZG93LCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdywgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWlkYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmNvbnN0IHNjcm9sbF9zeW5jXzEgPSByZXF1aXJlKFwiLi9zY3JvbGwtc3luY1wiKTtcbmNsYXNzIEFjdGl2ZUxpbmVNYXJrZXIge1xuICAgIG9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbihsaW5lKSB7XG4gICAgICAgIGNvbnN0IHsgcHJldmlvdXMgfSA9IHNjcm9sbF9zeW5jXzEuZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuICAgICAgICB0aGlzLl91cGRhdGUocHJldmlvdXMgJiYgcHJldmlvdXMuZWxlbWVudCk7XG4gICAgfVxuICAgIF91cGRhdGUoYmVmb3JlKSB7XG4gICAgICAgIHRoaXMuX3VubWFya0FjdGl2ZUVsZW1lbnQodGhpcy5fY3VycmVudCk7XG4gICAgICAgIHRoaXMuX21hcmtBY3RpdmVFbGVtZW50KGJlZm9yZSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnQgPSBiZWZvcmU7XG4gICAgfVxuICAgIF91bm1hcmtBY3RpdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9cXGJjb2RlLWFjdGl2ZS1saW5lXFxiL2csICcnKTtcbiAgICB9XG4gICAgX21hcmtBY3RpdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gJyBjb2RlLWFjdGl2ZS1saW5lJztcbiAgICB9XG59XG5leHBvcnRzLkFjdGl2ZUxpbmVNYXJrZXIgPSBBY3RpdmVMaW5lTWFya2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIG9uY2VEb2N1bWVudExvYWRlZChmKSB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAndW5pbml0aWFsaXplZCcpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGYpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZigpO1xuICAgIH1cbn1cbmV4cG9ydHMub25jZURvY3VtZW50TG9hZGVkID0gb25jZURvY3VtZW50TG9hZGVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmV4cG9ydHMuY3JlYXRlUG9zdGVyRm9yVnNDb2RlID0gKHZzY29kZSkgPT4ge1xuICAgIHJldHVybiBuZXcgY2xhc3Mge1xuICAgICAgICBwb3N0TWVzc2FnZSh0eXBlLCBib2R5KSB7XG4gICAgICAgICAgICB2c2NvZGUucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBzZXR0aW5nc18xLmdldFNldHRpbmdzKCkuc291cmNlLFxuICAgICAgICAgICAgICAgIGJvZHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +!function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let o=void 0;function i(e){const t=document.getElementById("vscode-markdown-preview-data");if(t){const n=t.getAttribute(e);if(n)return JSON.parse(n)}throw new Error(`Could not load data for ${e}`)}t.getData=i,t.getSettings=function(){if(o)return o;if(o=i("data-settings"))return o;throw new Error("Could not load settings")}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(0),i="code-line";function r(e){return t=0,n=o.getSettings().lineCount-1,i=e,Math.min(n,Math.max(t,i));var t,n,i}const c=(()=>{let e;return()=>{if(!e){e=[{element:document.body,line:0}];for(const t of document.getElementsByClassName(i)){const n=+t.getAttribute("data-line");isNaN(n)||("CODE"===t.tagName&&t.parentElement&&"PRE"===t.parentElement.tagName?e.push({element:t.parentElement,line:n}):e.push({element:t,line:n}))}}return e}})();function s(e){const t=Math.floor(e),n=c();let o=n[0]||null;for(const e of n){if(e.line===t)return{previous:e,next:void 0};if(e.line>t)return{previous:o,next:e};o=e}return{previous:o}}function a(e){const t=c(),n=e-window.scrollY;let o=-1,i=t.length-1;for(;o+1=n?i=e:o=e}const r=t[i],s=u(r);if(i>=1&&s.top>n){return{previous:t[o],next:r}}return i>1&&in?{previous:r,next:t[i+1]}:{previous:r}}function u({element:e}){const t=e.getBoundingClientRect(),n=e.querySelector(`.${i}`);if(n){const e=n.getBoundingClientRect(),o=Math.max(1,e.top-t.top);return{top:t.top,height:o}}return t}t.getElementsForSourceLine=s,t.getLineElementsAtPageOffset=a,t.scrollToRevealSourceLine=function(e){if(!o.getSettings().scrollPreviewWithEditor)return;if(e<=0)return void window.scroll(window.scrollX,0);const{previous:t,next:n}=s(e);if(!t)return;let i=0;const r=u(t),c=r.top;if(n&&n.line!==t.line){i=c+(e-t.line)/(n.line-t.line)*(n.element.getBoundingClientRect().top-c)}else{const t=e-Math.floor(e);i=c+r.height*t}window.scroll(window.scrollX,Math.max(1,window.scrollY+i))},t.getEditorLineNumberForPageOffset=function(e){const{previous:t,next:n}=a(e);if(t){const o=u(t),i=e-window.scrollY-o.top;if(n){const e=i/(u(n).top-o.top);return r(t.line+e*(n.line-t.line))}{const e=i/o.height;return r(t.line+e)}}return null},t.getLineElementForFragment=function(e){return c().find(t=>t.element.id===e)}},function(e,t,n){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const o=n(7),i=n(8),r=n(9),c=n(2),s=n(0),a=n(10);let u=!0;const l=new o.ActiveLineMarker,f=s.getSettings(),d=acquireVsCodeApi(),m={...d.getState(),...s.getData("data-state")};d.setState(m);const p=r.createPosterForVsCode(d);window.cspAlerter.setPoster(p),window.styleLoadingMonitor.setPoster(p),window.onload=()=>{h()},i.onceDocumentLoaded(()=>{const t=m.scrollProgress;"number"!=typeof t||f.fragment?f.scrollPreviewWithEditor&&e(()=>{if(f.fragment){m.fragment=void 0,d.setState(m);const e=c.getLineElementForFragment(f.fragment);e&&(u=!0,c.scrollToRevealSourceLine(e.line))}else isNaN(f.line)||(u=!0,c.scrollToRevealSourceLine(f.line))}):e(()=>{u=!0,window.scrollTo(0,t*document.body.clientHeight)})});const g=(()=>{const e=a(e=>{u=!0,c.scrollToRevealSourceLine(e)},50);return t=>{isNaN(t)||(m.line=t,e(t))}})();let h=a(()=>{const e=[];let t=document.getElementsByTagName("img");if(t){let n;for(n=0;n{u=!0,y(),h()},!0),window.addEventListener("message",e=>{if(e.data.source===f.source)switch(e.data.type){case"onDidChangeTextEditorSelection":l.onDidChangeTextEditorSelection(e.data.line);break;case"updateView":g(e.data.line)}},!1),document.addEventListener("dblclick",e=>{if(!f.doubleClickToSwitchToEditor)return;for(let t=e.target;t;t=t.parentNode)if("A"===t.tagName)return;const t=e.pageY,n=c.getEditorLineNumberForPageOffset(t);"number"!=typeof n||isNaN(n)||p.postMessage("didClick",{line:Math.floor(n)})});const v=["http:","https:","mailto:","vscode:","vscode-insiders:"];function y(){m.scrollProgress=window.scrollY/document.body.clientHeight,d.setState(m)}document.addEventListener("click",e=>{if(!e)return;let t=e.target;for(;t;){if(t.tagName&&"A"===t.tagName&&t.href){if(t.getAttribute("href").startsWith("#"))return;if(v.some(e=>t.href.startsWith(e)))return;const n=t.getAttribute("data-href")||t.getAttribute("href");return/^[a-z\-]+:/i.test(n)?void 0:(p.postMessage("openLink",{href:n}),e.preventDefault(),void e.stopPropagation())}t=t.parentNode}},!0),window.addEventListener("scroll",a(()=>{if(y(),u)u=!1;else{const e=c.getEditorLineNumberForPageOffset(window.scrollY);"number"!=typeof e||isNaN(e)||p.postMessage("revealLine",{line:e})}},50))}).call(this,n(4).setImmediate)},function(e,t,n){(function(e){var o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(5),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(1))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var o,i,r,c,s,a=1,u={},l=!1,f=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?o=function(e){t.nextTick((function(){p(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){p(e.data)},o=function(e){r.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(i=f.documentElement,o=function(e){var t=f.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):o=function(e){setTimeout(p,0,e)}:(c="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(c)&&p(+t.data.slice(c.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),o=function(t){e.postMessage(c+t,"*")}),d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;nnew class{postMessage(t,n){e.postMessage({type:t,source:o.getSettings().source,body:n})}}},function(e,t,n){(function(t){var n="Expected a function",o=NaN,i="[object Symbol]",r=/^\s+|\s+$/g,c=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,u=parseInt,l="object"==typeof t&&t&&t.Object===Object&&t,f="object"==typeof self&&self&&self.Object===Object&&self,d=l||f||Function("return this")(),m=Object.prototype.toString,p=Math.max,g=Math.min,h=function(){return d.Date.now()};function v(e,t,o){var i,r,c,s,a,u,l=0,f=!1,d=!1,m=!0;if("function"!=typeof e)throw new TypeError(n);function v(t){var n=i,o=r;return i=r=void 0,l=t,s=e.apply(o,n)}function b(e){var n=e-u;return void 0===u||n>=t||n<0||d&&e-l>=c}function T(){var e=h();if(b(e))return E(e);a=setTimeout(T,function(e){var n=t-(e-u);return d?g(n,c-(e-l)):n}(e))}function E(e){return a=void 0,m&&i?v(e):(i=r=void 0,s)}function _(){var e=h(),n=b(e);if(i=arguments,r=this,u=e,n){if(void 0===a)return function(e){return l=e,a=setTimeout(T,t),f?v(e):s}(u);if(d)return a=setTimeout(T,t),v(u)}return void 0===a&&(a=setTimeout(T,t)),s}return t=w(t)||0,y(o)&&(f=!!o.leading,c=(d="maxWait"in o)?p(w(o.maxWait)||0,t):c,m="trailing"in o?!!o.trailing:m),_.cancel=function(){void 0!==a&&clearTimeout(a),l=0,i=u=r=a=void 0},_.flush=function(){return void 0===a?s:E(h())},_}function y(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function w(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&m.call(e)==i}(e))return o;if(y(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=y(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=s.test(e);return n||a.test(e)?u(e.slice(2),n?2:8):c.test(e)?o:+e}e.exports=function(e,t,o){var i=!0,r=!0;if("function"!=typeof e)throw new TypeError(n);return y(o)&&(i="leading"in o?!!o.leading:i,r="trailing"in o?!!o.trailing:r),v(e,t,{leading:i,maxWait:t,trailing:r})}}).call(this,n(1))}]); \ No newline at end of file diff --git a/extensions/markdown-language-features/media/pre.js b/extensions/markdown-language-features/media/pre.js index c75da6b8542..8268f1e2d5b 100644 --- a/extensions/markdown-language-features/media/pre.js +++ b/extensions/markdown-language-features/media/pre.js @@ -1,2 +1 @@ -!function(e){var t={};function n(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(s,o,function(t){return e[t]}.bind(null,o));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=11)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let s=void 0;function o(e){const t=document.getElementById("vscode-markdown-preview-data");if(t){const n=t.getAttribute(e);if(n)return JSON.parse(n)}throw new Error(`Could not load data for ${e}`)}t.getData=o,t.getSettings=function(){if(s)return s;if(s=o("data-settings"))return s;throw new Error("Could not load settings")}},,,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=n(12),o=n(14);window.cspAlerter=new s.CspAlerter,window.styleLoadingMonitor=new o.StyleLoadingMonitor},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=n(0),o=n(13);t.CspAlerter=class{constructor(){this.didShow=!1,this.didHaveCspWarning=!1,document.addEventListener("securitypolicyviolation",()=>{this.onCspWarning()}),window.addEventListener("message",e=>{e&&e.data&&"vscode-did-block-svg"===e.data.name&&this.onCspWarning()})}setPoster(e){this.messaging=e,this.didHaveCspWarning&&this.showCspWarning()}onCspWarning(){this.didHaveCspWarning=!0,this.showCspWarning()}showCspWarning(){const e=o.getStrings(),t=s.getSettings();if(this.didShow||t.disableSecurityWarnings||!this.messaging)return;this.didShow=!0;const n=document.createElement("a");n.innerText=e.cspAlertMessageText,n.setAttribute("id","code-csp-warning"),n.setAttribute("title",e.cspAlertMessageTitle),n.setAttribute("role","button"),n.setAttribute("aria-label",e.cspAlertMessageLabel),n.onclick=()=>{this.messaging.postMessage("showPreviewSecuritySelector",{source:t.source})},document.body.appendChild(n)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getStrings=function(){const e=document.getElementById("vscode-markdown-preview-data");if(e){const t=e.getAttribute("data-strings");if(t)return JSON.parse(t)}throw new Error("Could not load strings")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.StyleLoadingMonitor=class{constructor(){this.unloadedStyles=[],this.finishedLoading=!1;const e=e=>{const t=e.target.dataset.source;this.unloadedStyles.push(t)};window.addEventListener("DOMContentLoaded",()=>{for(const t of document.getElementsByClassName("code-user-style"))t.dataset.source&&(t.onerror=e)}),window.addEventListener("load",()=>{this.unloadedStyles.length&&(this.finishedLoading=!0,this.poster&&this.poster.postMessage("previewStyleLoadError",{unloadedStyles:this.unloadedStyles}))})}setPoster(e){this.poster=e,this.finishedLoading&&e.postMessage("previewStyleLoadError",{unloadedStyles:this.unloadedStyles})}}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvcHJlLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2NzcC50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zdHJpbmdzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2xvYWRpbmcudHMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJjYWNoZWRTZXR0aW5ncyIsInVuZGVmaW5lZCIsImdldERhdGEiLCJlbGVtZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRhdGEiLCJnZXRBdHRyaWJ1dGUiLCJKU09OIiwicGFyc2UiLCJFcnJvciIsImdldFNldHRpbmdzIiwiY3NwXzEiLCJsb2FkaW5nXzEiLCJ3aW5kb3ciLCJjc3BBbGVydGVyIiwiQ3NwQWxlcnRlciIsInN0eWxlTG9hZGluZ01vbml0b3IiLCJTdHlsZUxvYWRpbmdNb25pdG9yIiwic2V0dGluZ3NfMSIsInN0cmluZ3NfMSIsInRoaXMiLCJkaWRTaG93IiwiZGlkSGF2ZUNzcFdhcm5pbmciLCJhZGRFdmVudExpc3RlbmVyIiwib25Dc3BXYXJuaW5nIiwiZXZlbnQiLCJwb3N0ZXIiLCJtZXNzYWdpbmciLCJzaG93Q3NwV2FybmluZyIsInN0cmluZ3MiLCJnZXRTdHJpbmdzIiwic2V0dGluZ3MiLCJkaXNhYmxlU2VjdXJpdHlXYXJuaW5ncyIsIm5vdGlmaWNhdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lclRleHQiLCJjc3BBbGVydE1lc3NhZ2VUZXh0Iiwic2V0QXR0cmlidXRlIiwiY3NwQWxlcnRNZXNzYWdlVGl0bGUiLCJjc3BBbGVydE1lc3NhZ2VMYWJlbCIsIm9uY2xpY2siLCJwb3N0TWVzc2FnZSIsInNvdXJjZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsInN0b3JlIiwidW5sb2FkZWRTdHlsZXMiLCJmaW5pc2hlZExvYWRpbmciLCJvblN0eWxlTG9hZEVycm9yIiwidGFyZ2V0IiwiZGF0YXNldCIsInB1c2giLCJsaW5rIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsIm9uZXJyb3IiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiJhQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQUtmRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFWixFQUFvQmtCLEVBQUksU0FBU2hCLEdBQ1gsb0JBQVhpQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWViLEVBQVNpQixPQUFPQyxZQUFhLENBQUVDLE1BQU8sV0FFN0RQLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxLQVF2RHJCLEVBQW9Cc0IsRUFBSSxTQUFTRCxFQUFPRSxHQUV2QyxHQURVLEVBQVBBLElBQVVGLEVBQVFyQixFQUFvQnFCLElBQy9CLEVBQVBFLEVBQVUsT0FBT0YsRUFDcEIsR0FBVyxFQUFQRSxHQUE4QixpQkFBVkYsR0FBc0JBLEdBQVNBLEVBQU1HLFdBQVksT0FBT0gsRUFDaEYsSUFBSUksRUFBS1gsT0FBT1ksT0FBTyxNQUd2QixHQUZBMUIsRUFBb0JrQixFQUFFTyxHQUN0QlgsT0FBT0MsZUFBZVUsRUFBSSxVQUFXLENBQUVULFlBQVksRUFBTUssTUFBT0EsSUFDdEQsRUFBUEUsR0FBNEIsaUJBQVRGLEVBQW1CLElBQUksSUFBSU0sS0FBT04sRUFBT3JCLEVBQW9CVSxFQUFFZSxFQUFJRSxFQUFLLFNBQVNBLEdBQU8sT0FBT04sRUFBTU0sSUFBUUMsS0FBSyxLQUFNRCxJQUM5SSxPQUFPRixHQUlSekIsRUFBb0I2QixFQUFJLFNBQVMxQixHQUNoQyxJQUFJUyxFQUFTVCxHQUFVQSxFQUFPcUIsV0FDN0IsV0FBd0IsT0FBT3JCLEVBQWdCLFNBQy9DLFdBQThCLE9BQU9BLEdBRXRDLE9BREFILEVBQW9CVSxFQUFFRSxFQUFRLElBQUtBLEdBQzVCQSxHQUlSWixFQUFvQmEsRUFBSSxTQUFTaUIsRUFBUUMsR0FBWSxPQUFPakIsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLdUIsRUFBUUMsSUFHekcvQixFQUFvQmtDLEVBQUksR0FJakJsQyxFQUFvQkEsRUFBb0JtQyxFQUFJLEksK0JDN0VyRHJCLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxJQUN0RCxJQUFJZSxPQUFpQkMsRUFDckIsU0FBU0MsRUFBUVgsR0FDYixNQUFNWSxFQUFVQyxTQUFTQyxlQUFlLGdDQUN4QyxHQUFJRixFQUFTLENBQ1QsTUFBTUcsRUFBT0gsRUFBUUksYUFBYWhCLEdBQ2xDLEdBQUllLEVBQ0EsT0FBT0UsS0FBS0MsTUFBTUgsR0FHMUIsTUFBTSxJQUFJSSxNQUFNLDJCQUEyQm5CLEtBRS9DekIsRUFBUW9DLFFBQVVBLEVBV2xCcEMsRUFBUTZDLFlBVlIsV0FDSSxHQUFJWCxFQUNBLE9BQU9BLEVBR1gsR0FEQUEsRUFBaUJFLEVBQVEsaUJBRXJCLE9BQU9GLEVBRVgsTUFBTSxJQUFJVSxNQUFNLDZCLHVDQ3JCcEJoQyxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sSUFDdEQsTUFBTTJCLEVBQVEsRUFBUSxJQUNoQkMsRUFBWSxFQUFRLElBQzFCQyxPQUFPQyxXQUFhLElBQUlILEVBQU1JLFdBQzlCRixPQUFPRyxvQkFBc0IsSUFBSUosRUFBVUsscUIsNkJDSjNDeEMsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLElBQ3RELE1BQU1rQyxFQUFhLEVBQVEsR0FDckJDLEVBQVksRUFBUSxJQThDMUJ0RCxFQUFRa0QsV0ExQ1IsTUFDSSxjQUNJSyxLQUFLQyxTQUFVLEVBQ2ZELEtBQUtFLG1CQUFvQixFQUN6Qm5CLFNBQVNvQixpQkFBaUIsMEJBQTJCLEtBQ2pESCxLQUFLSSxpQkFFVFgsT0FBT1UsaUJBQWlCLFVBQVlFLElBQzVCQSxHQUFTQSxFQUFNcEIsTUFBNEIseUJBQXBCb0IsRUFBTXBCLEtBQUsvQixNQUNsQzhDLEtBQUtJLGlCQUlqQixVQUFVRSxHQUNOTixLQUFLTyxVQUFZRCxFQUNiTixLQUFLRSxtQkFDTEYsS0FBS1EsaUJBR2IsZUFDSVIsS0FBS0UsbUJBQW9CLEVBQ3pCRixLQUFLUSxpQkFFVCxpQkFDSSxNQUFNQyxFQUFVVixFQUFVVyxhQUNwQkMsRUFBV2IsRUFBV1IsY0FDNUIsR0FBSVUsS0FBS0MsU0FBV1UsRUFBU0MsMEJBQTRCWixLQUFLTyxVQUMxRCxPQUVKUCxLQUFLQyxTQUFVLEVBQ2YsTUFBTVksRUFBZTlCLFNBQVMrQixjQUFjLEtBQzVDRCxFQUFhRSxVQUFZTixFQUFRTyxvQkFDakNILEVBQWFJLGFBQWEsS0FBTSxvQkFDaENKLEVBQWFJLGFBQWEsUUFBU1IsRUFBUVMsc0JBQzNDTCxFQUFhSSxhQUFhLE9BQVEsVUFDbENKLEVBQWFJLGFBQWEsYUFBY1IsRUFBUVUsc0JBQ2hETixFQUFhTyxRQUFVLEtBQ25CcEIsS0FBS08sVUFBVWMsWUFBWSw4QkFBK0IsQ0FBRUMsT0FBUVgsRUFBU1csVUFFakZ2QyxTQUFTd0MsS0FBS0MsWUFBWVgsTSw2QkM3Q2xDeEQsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLElBV3REbkIsRUFBUWlFLFdBVlIsV0FDSSxNQUFNZSxFQUFRMUMsU0FBU0MsZUFBZSxnQ0FDdEMsR0FBSXlDLEVBQU8sQ0FDUCxNQUFNeEMsRUFBT3dDLEVBQU12QyxhQUFhLGdCQUNoQyxHQUFJRCxFQUNBLE9BQU9FLEtBQUtDLE1BQU1ILEdBRzFCLE1BQU0sSUFBSUksTUFBTSw0Qiw2QkNicEJoQyxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sSUFpQ3REbkIsRUFBUW9ELG9CQWhDUixNQUNJLGNBQ0lHLEtBQUswQixlQUFpQixHQUN0QjFCLEtBQUsyQixpQkFBa0IsRUFDdkIsTUFBTUMsRUFBb0J2QixJQUN0QixNQUFNaUIsRUFBU2pCLEVBQU13QixPQUFPQyxRQUFRUixPQUNwQ3RCLEtBQUswQixlQUFlSyxLQUFLVCxJQUU3QjdCLE9BQU9VLGlCQUFpQixtQkFBb0IsS0FDeEMsSUFBSyxNQUFNNkIsS0FBUWpELFNBQVNrRCx1QkFBdUIsbUJBQzNDRCxFQUFLRixRQUFRUixTQUNiVSxFQUFLRSxRQUFVTixLQUkzQm5DLE9BQU9VLGlCQUFpQixPQUFRLEtBQ3ZCSCxLQUFLMEIsZUFBZVMsU0FHekJuQyxLQUFLMkIsaUJBQWtCLEVBQ25CM0IsS0FBS00sUUFDTE4sS0FBS00sT0FBT2UsWUFBWSx3QkFBeUIsQ0FBRUssZUFBZ0IxQixLQUFLMEIsb0JBSXBGLFVBQVVwQixHQUNOTixLQUFLTSxPQUFTQSxFQUNWTixLQUFLMkIsaUJBQ0xyQixFQUFPZSxZQUFZLHdCQUF5QixDQUFFSyxlQUFnQjFCLEtBQUswQiIsImZpbGUiOiJwcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTEpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmxldCBjYWNoZWRTZXR0aW5ncyA9IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldERhdGEoa2V5KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBsb2FkIGRhdGEgZm9yICR7a2V5fWApO1xufVxuZXhwb3J0cy5nZXREYXRhID0gZ2V0RGF0YTtcbmZ1bmN0aW9uIGdldFNldHRpbmdzKCkge1xuICAgIGlmIChjYWNoZWRTZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0dGluZ3M7XG4gICAgfVxuICAgIGNhY2hlZFNldHRpbmdzID0gZ2V0RGF0YSgnZGF0YS1zZXR0aW5ncycpO1xuICAgIGlmIChjYWNoZWRTZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0dGluZ3M7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgc2V0dGluZ3MnKTtcbn1cbmV4cG9ydHMuZ2V0U2V0dGluZ3MgPSBnZXRTZXR0aW5ncztcbiIsIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjc3BfMSA9IHJlcXVpcmUoXCIuL2NzcFwiKTtcbmNvbnN0IGxvYWRpbmdfMSA9IHJlcXVpcmUoXCIuL2xvYWRpbmdcIik7XG53aW5kb3cuY3NwQWxlcnRlciA9IG5ldyBjc3BfMS5Dc3BBbGVydGVyKCk7XG53aW5kb3cuc3R5bGVMb2FkaW5nTW9uaXRvciA9IG5ldyBsb2FkaW5nXzEuU3R5bGVMb2FkaW5nTW9uaXRvcigpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmNvbnN0IHN0cmluZ3NfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ3NcIik7XG4vKipcbiAqIFNob3dzIGFuIGFsZXJ0IHdoZW4gdGhlcmUgaXMgYSBjb250ZW50IHNlY3VyaXR5IHBvbGljeSB2aW9sYXRpb24uXG4gKi9cbmNsYXNzIENzcEFsZXJ0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRpZFNob3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWRIYXZlQ3NwV2FybmluZyA9IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWN1cml0eXBvbGljeXZpb2xhdGlvbicsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Dc3BXYXJuaW5nKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS5uYW1lID09PSAndnNjb2RlLWRpZC1ibG9jay1zdmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNzcFdhcm5pbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFBvc3Rlcihwb3N0ZXIpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdpbmcgPSBwb3N0ZXI7XG4gICAgICAgIGlmICh0aGlzLmRpZEhhdmVDc3BXYXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dDc3BXYXJuaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Dc3BXYXJuaW5nKCkge1xuICAgICAgICB0aGlzLmRpZEhhdmVDc3BXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93Q3NwV2FybmluZygpO1xuICAgIH1cbiAgICBzaG93Q3NwV2FybmluZygpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IHN0cmluZ3NfMS5nZXRTdHJpbmdzKCk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gc2V0dGluZ3NfMS5nZXRTZXR0aW5ncygpO1xuICAgICAgICBpZiAodGhpcy5kaWRTaG93IHx8IHNldHRpbmdzLmRpc2FibGVTZWN1cml0eVdhcm5pbmdzIHx8ICF0aGlzLm1lc3NhZ2luZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlkU2hvdyA9IHRydWU7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbm90aWZpY2F0aW9uLmlubmVyVGV4dCA9IHN0cmluZ3MuY3NwQWxlcnRNZXNzYWdlVGV4dDtcbiAgICAgICAgbm90aWZpY2F0aW9uLnNldEF0dHJpYnV0ZSgnaWQnLCAnY29kZS1jc3Atd2FybmluZycpO1xuICAgICAgICBub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCd0aXRsZScsIHN0cmluZ3MuY3NwQWxlcnRNZXNzYWdlVGl0bGUpO1xuICAgICAgICBub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdyb2xlJywgJ2J1dHRvbicpO1xuICAgICAgICBub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VMYWJlbCk7XG4gICAgICAgIG5vdGlmaWNhdGlvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmcucG9zdE1lc3NhZ2UoJ3Nob3dQcmV2aWV3U2VjdXJpdHlTZWxlY3RvcicsIHsgc291cmNlOiBzZXR0aW5ncy5zb3VyY2UgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm90aWZpY2F0aW9uKTtcbiAgICB9XG59XG5leHBvcnRzLkNzcEFsZXJ0ZXIgPSBDc3BBbGVydGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGdldFN0cmluZ3MoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndnNjb2RlLW1hcmtkb3duLXByZXZpZXctZGF0YScpO1xuICAgIGlmIChzdG9yZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gc3RvcmUuZ2V0QXR0cmlidXRlKCdkYXRhLXN0cmluZ3MnKTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgc3RyaW5ncycpO1xufVxuZXhwb3J0cy5nZXRTdHJpbmdzID0gZ2V0U3RyaW5ncztcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY2xhc3MgU3R5bGVMb2FkaW5nTW9uaXRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudW5sb2FkZWRTdHlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgb25TdHlsZUxvYWRFcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuc291cmNlO1xuICAgICAgICAgICAgdGhpcy51bmxvYWRlZFN0eWxlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvZGUtdXNlci1zdHlsZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmsuZGF0YXNldC5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluay5vbmVycm9yID0gb25TdHlsZUxvYWRFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy51bmxvYWRlZFN0eWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkTG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3N0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3Rlci5wb3N0TWVzc2FnZSgncHJldmlld1N0eWxlTG9hZEVycm9yJywgeyB1bmxvYWRlZFN0eWxlczogdGhpcy51bmxvYWRlZFN0eWxlcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFBvc3Rlcihwb3N0ZXIpIHtcbiAgICAgICAgdGhpcy5wb3N0ZXIgPSBwb3N0ZXI7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkTG9hZGluZykge1xuICAgICAgICAgICAgcG9zdGVyLnBvc3RNZXNzYWdlKCdwcmV2aWV3U3R5bGVMb2FkRXJyb3InLCB7IHVubG9hZGVkU3R5bGVzOiB0aGlzLnVubG9hZGVkU3R5bGVzIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5TdHlsZUxvYWRpbmdNb25pdG9yID0gU3R5bGVMb2FkaW5nTW9uaXRvcjtcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +!function(e){var t={};function n(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(s,o,function(t){return e[t]}.bind(null,o));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=11)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let s=void 0;function o(e){const t=document.getElementById("vscode-markdown-preview-data");if(t){const n=t.getAttribute(e);if(n)return JSON.parse(n)}throw new Error(`Could not load data for ${e}`)}t.getData=o,t.getSettings=function(){if(s)return s;if(s=o("data-settings"))return s;throw new Error("Could not load settings")}},,,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=n(12),o=n(14);window.cspAlerter=new s.CspAlerter,window.styleLoadingMonitor=new o.StyleLoadingMonitor},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=n(0),o=n(13);t.CspAlerter=class{constructor(){this.didShow=!1,this.didHaveCspWarning=!1,document.addEventListener("securitypolicyviolation",()=>{this.onCspWarning()}),window.addEventListener("message",e=>{e&&e.data&&"vscode-did-block-svg"===e.data.name&&this.onCspWarning()})}setPoster(e){this.messaging=e,this.didHaveCspWarning&&this.showCspWarning()}onCspWarning(){this.didHaveCspWarning=!0,this.showCspWarning()}showCspWarning(){const e=o.getStrings(),t=s.getSettings();if(this.didShow||t.disableSecurityWarnings||!this.messaging)return;this.didShow=!0;const n=document.createElement("a");n.innerText=e.cspAlertMessageText,n.setAttribute("id","code-csp-warning"),n.setAttribute("title",e.cspAlertMessageTitle),n.setAttribute("role","button"),n.setAttribute("aria-label",e.cspAlertMessageLabel),n.onclick=()=>{this.messaging.postMessage("showPreviewSecuritySelector",{source:t.source})},document.body.appendChild(n)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getStrings=function(){const e=document.getElementById("vscode-markdown-preview-data");if(e){const t=e.getAttribute("data-strings");if(t)return JSON.parse(t)}throw new Error("Could not load strings")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.StyleLoadingMonitor=class{constructor(){this.unloadedStyles=[],this.finishedLoading=!1;const e=e=>{const t=e.target.dataset.source;this.unloadedStyles.push(t)};window.addEventListener("DOMContentLoaded",()=>{for(const t of document.getElementsByClassName("code-user-style"))t.dataset.source&&(t.onerror=e)}),window.addEventListener("load",()=>{this.unloadedStyles.length&&(this.finishedLoading=!0,this.poster&&this.poster.postMessage("previewStyleLoadError",{unloadedStyles:this.unloadedStyles}))})}setPoster(e){this.poster=e,this.finishedLoading&&e.postMessage("previewStyleLoadError",{unloadedStyles:this.unloadedStyles})}}}]); \ No newline at end of file diff --git a/extensions/markdown-language-features/media/preview-right-dark.svg b/extensions/markdown-language-features/media/preview-right-dark.svg deleted file mode 100644 index 1d59877196b..00000000000 --- a/extensions/markdown-language-features/media/preview-right-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/extensions/markdown-language-features/media/preview-right-light.svg b/extensions/markdown-language-features/media/preview-right-light.svg deleted file mode 100644 index 3f1152fc3cd..00000000000 --- a/extensions/markdown-language-features/media/preview-right-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/extensions/markdown-language-features/media/view-source-dark.svg b/extensions/markdown-language-features/media/view-source-dark.svg deleted file mode 100644 index ed302ae1398..00000000000 --- a/extensions/markdown-language-features/media/view-source-dark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/extensions/markdown-language-features/media/view-source-light.svg b/extensions/markdown-language-features/media/view-source-light.svg deleted file mode 100644 index 392a840c5ef..00000000000 --- a/extensions/markdown-language-features/media/view-source-light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index 01bb8a06d03..561996b3d76 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -12,7 +12,7 @@ "vscode": "^1.20.0" }, "main": "./out/extension", - "browser": "./dist/extension.js", + "browser": "./dist/browser/extension", "categories": [ "Programming Languages" ], @@ -44,28 +44,19 @@ "command": "markdown.showPreviewToSide", "title": "%markdown.previewSide.title%", "category": "Markdown", - "icon": { - "light": "./media/preview-right-light.svg", - "dark": "./media/preview-right-dark.svg" - } + "icon": "$(open-preview)" }, { "command": "markdown.showLockedPreviewToSide", "title": "%markdown.showLockedPreviewToSide.title%", "category": "Markdown", - "icon": { - "light": "./media/preview-right-light.svg", - "dark": "./media/preview-right-dark.svg" - } + "icon": "$(open-preview)" }, { "command": "markdown.showSource", "title": "%markdown.showSource.title%", "category": "Markdown", - "icon": { - "light": "./media/view-source-light.svg", - "dark": "./media/view-source-dark.svg" - } + "icon": "$(go-to-file)" }, { "command": "markdown.showPreviewSecuritySelector", diff --git a/extensions/markdown-language-features/webpack.config.js b/extensions/markdown-language-features/webpack.config.js index 58996c3eb7d..865444125fe 100644 --- a/extensions/markdown-language-features/webpack.config.js +++ b/extensions/markdown-language-features/webpack.config.js @@ -21,9 +21,8 @@ module.exports = { resolve: { extensions: ['.tsx', '.ts', '.js'] }, - devtool: 'inline-source-map', output: { filename: '[name].js', path: path.resolve(__dirname, 'media') } -}; \ No newline at end of file +}; diff --git a/extensions/merge-conflict/extension-browser.webpack.config.js b/extensions/merge-conflict/extension-browser.webpack.config.js index 3bc5f783258..e4171bed927 100644 --- a/extensions/merge-conflict/extension-browser.webpack.config.js +++ b/extensions/merge-conflict/extension-browser.webpack.config.js @@ -7,27 +7,14 @@ 'use strict'; -const withDefaults = require('../shared.webpack.config'); -const path = require('path'); +const withBrowserDefaults = require('../shared.webpack.config').browser; -const clientConfig = withDefaults({ - target: 'webworker', +module.exports = withBrowserDefaults({ context: __dirname, entry: { extension: './src/mergeConflictMain.ts' }, output: { filename: 'mergeConflictMain.js' - }, - performance: { - hints: false - }, - resolve: { - alias: { - 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') - } } }); -clientConfig.module.rules[0].use.shift(); // remove nls loader - -module.exports = clientConfig; diff --git a/extensions/merge-conflict/package.json b/extensions/merge-conflict/package.json index f59738d3008..d438b96ca61 100644 --- a/extensions/merge-conflict/package.json +++ b/extensions/merge-conflict/package.json @@ -17,7 +17,7 @@ "*" ], "main": "./out/mergeConflictMain", - "browser": "./dist/mergeConflictMain", + "browser": "./dist/browser/mergeConflictMain", "scripts": { "compile": "gulp compile-extension:merge-conflict", "watch": "gulp watch-extension:merge-conflict" diff --git a/extensions/microsoft-authentication/src/AADHelper.ts b/extensions/microsoft-authentication/src/AADHelper.ts index ebc453cc2ad..9f96e100356 100644 --- a/extensions/microsoft-authentication/src/AADHelper.ts +++ b/extensions/microsoft-authentication/src/AADHelper.ts @@ -87,6 +87,10 @@ export class AzureActiveDirectoryService { try { const sessions = this.parseStoredData(storedData); const refreshes = sessions.map(async session => { + if (!session.refreshToken) { + return Promise.resolve(); + } + try { await this.refreshToken(session.refreshToken, session.scope, session.id); } catch (e) { @@ -148,7 +152,7 @@ export class AzureActiveDirectoryService { const sessions = this.parseStoredData(storedData); let promises = sessions.map(async session => { const matchesExisting = this._tokens.some(token => token.scope === session.scope && token.sessionId === session.id); - if (!matchesExisting) { + if (!matchesExisting && session.refreshToken) { try { await this.refreshToken(session.refreshToken, session.scope, session.id); addedIds.push(session.id); @@ -201,9 +205,9 @@ export class AzureActiveDirectoryService { }, 1000 * 30); } - private async convertToSession(token: IToken): Promise { + private async convertToSession(token: IToken): Promise { const resolvedToken = await this.resolveAccessToken(token); - return new vscode.AuthenticationSession2(token.sessionId, resolvedToken, token.account, token.scope.split(' ')); + return new vscode.AuthenticationSession(token.sessionId, resolvedToken, token.account, token.scope.split(' ')); } private async resolveAccessToken(token: IToken): Promise { @@ -236,12 +240,16 @@ export class AzureActiveDirectoryService { } } - get sessions(): Promise { + get sessions(): Promise { return Promise.all(this._tokens.map(token => this.convertToSession(token))); } - public async login(scope: string): Promise { + public async login(scope: string): Promise { Logger.info('Logging in...'); + if (!scope.includes('offline_access')) { + Logger.info('Warning: The \'offline_access\' scope was not included, so the generated token will not be able to be refreshed.'); + } + return new Promise(async (resolve, reject) => { if (vscode.env.uiKind === vscode.UIKind.Web) { resolve(this.loginWithoutLocalServer(scope)); @@ -330,7 +338,7 @@ export class AzureActiveDirectoryService { } } - private async loginWithoutLocalServer(scope: string): Promise { + private async loginWithoutLocalServer(scope: string): Promise { const callbackUri = await vscode.env.asExternalUri(vscode.Uri.parse(`${vscode.env.uriScheme}://vscode.microsoft-authentication`)); const nonce = crypto.randomBytes(16).toString('base64'); const port = (callbackUri.authority.match(/:([0-9]*)$/) || [])[1] || (callbackUri.scheme === 'https' ? 443 : 80); @@ -345,7 +353,7 @@ export class AzureActiveDirectoryService { }); vscode.env.openExternal(uri); - const timeoutPromise = new Promise((_: (value: vscode.AuthenticationSession2) => void, reject) => { + const timeoutPromise = new Promise((_: (value: vscode.AuthenticationSession) => void, reject) => { const wait = setTimeout(() => { clearTimeout(wait); reject('Login timed out.'); @@ -355,9 +363,9 @@ export class AzureActiveDirectoryService { return Promise.race([this.handleCodeResponse(state, codeVerifier, scope), timeoutPromise]); } - private async handleCodeResponse(state: string, codeVerifier: string, scope: string): Promise { + private async handleCodeResponse(state: string, codeVerifier: string, scope: string): Promise { let uriEventListener: vscode.Disposable; - return new Promise((resolve: (value: vscode.AuthenticationSession2) => void, reject) => { + return new Promise((resolve: (value: vscode.AuthenticationSession) => void, reject) => { uriEventListener = this._uriHandler.event(async (uri: vscode.Uri) => { try { const query = parseQuery(uri); diff --git a/extensions/npm/README.md b/extensions/npm/README.md index f3707f85d32..144cdd27538 100644 --- a/extensions/npm/README.md +++ b/extensions/npm/README.md @@ -34,7 +34,7 @@ The extension fetches data from https://registry.npmjs.org and https://registry. - `npm.autoDetect` - Enable detecting scripts as tasks, the default is `on`. - `npm.runSilent` - Run npm script with the `--silent` option, the default is `false`. -- `npm.packageManager` - The package manager used to run the scripts: `npm` or `yarn`, the default is `npm`. +- `npm.packageManager` - The package manager used to run the scripts: `npm`, `yarn` or `pnpm`, the default is `npm`. - `npm.exclude` - Glob patterns for folders that should be excluded from automatic script detection. The pattern is matched against the **absolute path** of the package.json. For example, to exclude all test folders use '**/test/**'. - `npm.enableScriptExplorer` - Enable an explorer view for npm scripts. - `npm.scriptExplorerAction` - The default click action: `open` or `run`, the default is `open`. diff --git a/extensions/npm/extension-browser.webpack.config.js b/extensions/npm/extension-browser.webpack.config.js new file mode 100644 index 00000000000..b0c70c96d48 --- /dev/null +++ b/extensions/npm/extension-browser.webpack.config.js @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withBrowserDefaults = require('../shared.webpack.config').browser; + +module.exports = withBrowserDefaults({ + context: __dirname, + entry: { + extension: './src/npmBrowserMain.ts' + }, + output: { + filename: 'npmBrowserMain.js' + }, + node: { + 'child_process': 'empty' + } +}); diff --git a/extensions/npm/extension.webpack.config.js b/extensions/npm/extension.webpack.config.js index 56a1589f460..1c6d9493e33 100644 --- a/extensions/npm/extension.webpack.config.js +++ b/extensions/npm/extension.webpack.config.js @@ -14,12 +14,10 @@ const withDefaults = require('../shared.webpack.config'); module.exports = withDefaults({ context: __dirname, entry: { - extension: './src/main.ts', + extension: './src/npmMain.ts', }, output: { - filename: 'main.js', - path: path.join(__dirname, 'dist'), - libraryTarget: 'commonjs', + filename: 'npmMain.js', }, resolve: { mainFields: ['module', 'main'], diff --git a/extensions/npm/package.json b/extensions/npm/package.json index ed1e8bd9015..b4f8c69726f 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -20,14 +20,15 @@ "dependencies": { "jsonc-parser": "^2.2.1", "minimatch": "^3.0.4", - "request-light": "^0.2.5", + "request-light": "^0.4.0", "vscode-nls": "^4.1.1" }, "devDependencies": { "@types/minimatch": "^3.0.3", "@types/node": "^12.11.7" }, - "main": "./out/main", + "main": "./out/npmMain", + "browser": "./dist/browser/npmBrowserMain", "activationEvents": [ "onCommand:workbench.action.tasks.runTask", "onCommand:npm.runScriptFromFolder", @@ -127,7 +128,7 @@ "editor/context": [ { "command": "npm.runSelectedScript", - "when": "resourceFilename == 'package.json'", + "when": "resourceFilename == 'package.json' && resourceScheme == file", "group": "navigation@+1" } ], @@ -181,12 +182,12 @@ } ], "explorer/context": [ - { - "when": "config.npm.enableRunFromFolder && explorerViewletVisible && explorerResourceIsFolder", + { + "when": "config.npm.enableRunFromFolder && explorerViewletVisible && explorerResourceIsFolder && resourceScheme == file", "command": "npm.runScriptFromFolder", - "group": "2_workspace" - } - ] + "group": "2_workspace" + } + ] }, "configuration": { "id": "npm", @@ -214,7 +215,8 @@ "type": "string", "enum": [ "npm", - "yarn" + "yarn", + "pnpm" ], "default": "npm", "description": "%config.npm.packageManager%" @@ -266,11 +268,11 @@ "jsonValidation": [ { "fileMatch": "package.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/package.json" + "url": "https://json.schemastore.org/package" }, { "fileMatch": "bower.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/bower.json" + "url": "https://json.schemastore.org/bower" } ], "taskDefinitions": [ diff --git a/extensions/npm/src/features/bowerJSONContribution.ts b/extensions/npm/src/features/bowerJSONContribution.ts index 705e40d34e7..cd648732fc7 100644 --- a/extensions/npm/src/features/bowerJSONContribution.ts +++ b/extensions/npm/src/features/bowerJSONContribution.ts @@ -3,11 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MarkedString, CompletionItemKind, CompletionItem, DocumentSelector, SnippetString, workspace } from 'vscode'; +import { MarkdownString, CompletionItemKind, CompletionItem, DocumentSelector, SnippetString, workspace } from 'vscode'; import { IJSONContribution, ISuggestionsCollector } from './jsonContributions'; import { XHRRequest } from 'request-light'; import { Location } from 'jsonc-parser'; -import { textToMarkedString } from './markedTextUtil'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); @@ -181,13 +180,15 @@ export class BowerJSONContribution implements IJSONContribution { }); } - public getInfoContribution(_resource: string, location: Location): Thenable | null { + public getInfoContribution(_resource: string, location: Location): Thenable | null { if ((location.matches(['dependencies', '*']) || location.matches(['devDependencies', '*']))) { const pack = location.path[location.path.length - 1]; if (typeof pack === 'string') { return this.getInfo(pack).then(documentation => { if (documentation) { - return [textToMarkedString(documentation)]; + const str = new MarkdownString(); + str.appendText(documentation); + return [str]; } return null; }); diff --git a/extensions/npm/src/features/jsonContributions.ts b/extensions/npm/src/features/jsonContributions.ts index 4a255baf823..3873b2dc31a 100644 --- a/extensions/npm/src/features/jsonContributions.ts +++ b/extensions/npm/src/features/jsonContributions.ts @@ -30,8 +30,8 @@ export interface IJSONContribution { resolveSuggestion?(item: CompletionItem): Thenable | null; } -export function addJSONProviders(xhr: XHRRequest): Disposable { - const contributions = [new PackageJSONContribution(xhr), new BowerJSONContribution(xhr)]; +export function addJSONProviders(xhr: XHRRequest, canRunNPM: boolean): Disposable { + const contributions = [new PackageJSONContribution(xhr, canRunNPM), new BowerJSONContribution(xhr)]; const subscriptions: Disposable[] = []; contributions.forEach(contribution => { const selector = contribution.getDocumentSelector(); diff --git a/extensions/npm/src/features/packageJSONContribution.ts b/extensions/npm/src/features/packageJSONContribution.ts index 4789886891c..135b632071c 100644 --- a/extensions/npm/src/features/packageJSONContribution.ts +++ b/extensions/npm/src/features/packageJSONContribution.ts @@ -3,11 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MarkedString, CompletionItemKind, CompletionItem, DocumentSelector, SnippetString, workspace } from 'vscode'; +import { MarkedString, CompletionItemKind, CompletionItem, DocumentSelector, SnippetString, workspace, MarkdownString } from 'vscode'; import { IJSONContribution, ISuggestionsCollector } from './jsonContributions'; import { XHRRequest } from 'request-light'; import { Location } from 'jsonc-parser'; -import { textToMarkedString } from './markedTextUtil'; import * as cp from 'child_process'; import * as nls from 'vscode-nls'; @@ -28,14 +27,12 @@ export class PackageJSONContribution implements IJSONContribution { 'jsdom', 'stylus', 'when', 'readable-stream', 'aws-sdk', 'concat-stream', 'chai', 'Thenable', 'wrench']; private knownScopes = ['@types', '@angular', '@babel', '@nuxtjs', '@vue', '@bazel']; - private xhr: XHRRequest; public getDocumentSelector(): DocumentSelector { return [{ language: 'json', scheme: '*', pattern: '**/package.json' }]; } - public constructor(xhr: XHRRequest) { - this.xhr = xhr; + public constructor(private xhr: XHRRequest, private canRunNPM: boolean) { } public collectDefaultSuggestions(_fileName: string, result: ISuggestionsCollector): Thenable { @@ -191,23 +188,23 @@ export class PackageJSONContribution implements IJSONContribution { const currentKey = location.path[location.path.length - 1]; if (typeof currentKey === 'string') { const info = await this.fetchPackageInfo(currentKey); - if (info && info.distTagsLatest) { + if (info && info.version) { - let name = JSON.stringify(info.distTagsLatest); + let name = JSON.stringify(info.version); let proposal = new CompletionItem(name); proposal.kind = CompletionItemKind.Property; proposal.insertText = name; proposal.documentation = localize('json.npm.latestversion', 'The currently latest version of the package'); result.add(proposal); - name = JSON.stringify('^' + info.distTagsLatest); + name = JSON.stringify('^' + info.version); proposal = new CompletionItem(name); proposal.kind = CompletionItemKind.Property; proposal.insertText = name; proposal.documentation = localize('json.npm.majorversion', 'Matches the most recent major version (1.x.x)'); result.add(proposal); - name = JSON.stringify('~' + info.distTagsLatest); + name = JSON.stringify('~' + info.version); proposal = new CompletionItem(name); proposal.kind = CompletionItemKind.Property; proposal.insertText = name; @@ -219,14 +216,27 @@ export class PackageJSONContribution implements IJSONContribution { return null; } + private getDocumentation(description: string | undefined, version: string | undefined, homepage: string | undefined): MarkdownString { + const str = new MarkdownString(); + if (description) { + str.appendText(description); + } + if (version) { + str.appendText('\n\n'); + str.appendText(localize('json.npm.version.hover', 'Latest version: {0}', version)); + } + if (homepage) { + str.appendText('\n\n'); + str.appendText(homepage); + } + return str; + } + public resolveSuggestion(item: CompletionItem): Thenable | null { - if (item.kind === CompletionItemKind.Property && item.documentation === '') { - return this.getInfo(item.label).then(infos => { - if (infos.length > 0) { - item.documentation = infos[0]; - if (infos.length > 1) { - item.detail = infos[1]; - } + if (item.kind === CompletionItemKind.Property && !item.documentation) { + return this.fetchPackageInfo(item.label).then(info => { + if (info) { + item.documentation = this.getDocumentation(info.description, info.version, info.homepage); return item; } return null; @@ -235,21 +245,11 @@ export class PackageJSONContribution implements IJSONContribution { return null; } - private async getInfo(pack: string): Promise { - let info = await this.fetchPackageInfo(pack); - if (info) { - const result: string[] = []; - result.push(info.description || ''); - result.push(info.distTagsLatest ? localize('json.npm.version.hover', 'Latest version: {0}', info.distTagsLatest) : ''); - result.push(info.homepage || ''); - return result; - } - - return []; - } - private async fetchPackageInfo(pack: string): Promise { - let info = await this.npmView(pack); + let info: ViewPackageInfo | undefined; + if (this.canRunNPM) { + info = await this.npmView(pack); + } if (!info) { info = await this.npmjsView(pack); } @@ -259,14 +259,14 @@ export class PackageJSONContribution implements IJSONContribution { private npmView(pack: string): Promise { return new Promise((resolve, _reject) => { - const command = 'npm view --json ' + pack + ' description dist-tags.latest homepage'; + const command = 'npm view --json ' + pack + ' description dist-tags.latest homepage version'; cp.exec(command, (error, stdout) => { if (!error) { try { const content = JSON.parse(stdout); resolve({ description: content['description'], - distTagsLatest: content['dist-tags.latest'], + version: content['dist-tags.latest'] || content['version'], homepage: content['homepage'] }); return; @@ -280,22 +280,20 @@ export class PackageJSONContribution implements IJSONContribution { } private async npmjsView(pack: string): Promise { - const queryUrl = 'https://registry.npmjs.org/' + encodeURIComponent(pack).replace(/%40/g, '@'); + const queryUrl = 'https://api.npms.io/v2/package/' + encodeURIComponent(pack); try { const success = await this.xhr({ url: queryUrl, agent: USER_AGENT }); const obj = JSON.parse(success.responseText); - if (obj) { - const latest = obj && obj['dist-tags'] && obj['dist-tags']['latest']; - if (latest) { - return { - description: obj.description || '', - distTagsLatest: latest, - homepage: obj.homepage || '' - }; - } + const metadata = obj?.collected?.metadata; + if (metadata) { + return { + description: metadata.description || '', + version: metadata.version, + homepage: metadata.links?.homepage || '' + }; } } catch (e) { @@ -308,9 +306,9 @@ export class PackageJSONContribution implements IJSONContribution { if ((location.matches(['dependencies', '*']) || location.matches(['devDependencies', '*']) || location.matches(['optionalDependencies', '*']) || location.matches(['peerDependencies', '*']))) { const pack = location.path[location.path.length - 1]; if (typeof pack === 'string') { - return this.getInfo(pack).then(infos => { - if (infos.length) { - return [infos.map(textToMarkedString).join('\n\n')]; + return this.fetchPackageInfo(pack).then(info => { + if (info) { + return [this.getDocumentation(info.description, info.version, info.homepage)]; } return null; }); @@ -339,7 +337,7 @@ export class PackageJSONContribution implements IJSONContribution { proposal.kind = CompletionItemKind.Property; proposal.insertText = insertText; proposal.filterText = JSON.stringify(name); - proposal.documentation = pack.description || ''; + proposal.documentation = this.getDocumentation(pack.description, pack.version, pack?.links?.homepage); collector.add(proposal); } } @@ -349,10 +347,11 @@ interface SearchPackageInfo { name: string; description?: string; version?: string; + links?: { homepage?: string; }; } interface ViewPackageInfo { description: string; - distTagsLatest?: string; + version?: string; homepage?: string; } diff --git a/extensions/npm/src/npmBrowserMain.ts b/extensions/npm/src/npmBrowserMain.ts new file mode 100644 index 00000000000..96cfe579505 --- /dev/null +++ b/extensions/npm/src/npmBrowserMain.ts @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as httpRequest from 'request-light'; +import * as vscode from 'vscode'; +import { addJSONProviders } from './features/jsonContributions'; + +export async function activate(context: vscode.ExtensionContext): Promise { + context.subscriptions.push(addJSONProviders(httpRequest.xhr, false)); +} + +export function deactivate(): void { +} diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/npmMain.ts similarity index 86% rename from extensions/npm/src/main.ts rename to extensions/npm/src/npmMain.ts index b79638ed1f0..764be6ea0fc 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/npmMain.ts @@ -14,13 +14,19 @@ import { invalidateHoverScriptsCache, NpmScriptHoverProvider } from './scriptHov let treeDataProvider: NpmScriptsTreeDataProvider | undefined; export async function activate(context: vscode.ExtensionContext): Promise { - registerTaskProvider(context); - treeDataProvider = registerExplorer(context); - registerHoverProvider(context); - configureHttpRequest(); - let d = vscode.workspace.onDidChangeConfiguration((e) => { - configureHttpRequest(); + context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('http.proxy') || e.affectsConfiguration('http.proxyStrictSSL')) { + configureHttpRequest(); + } + })); + + const canRunNPM = canRunNpmInCurrentWorkspace(); + context.subscriptions.push(addJSONProviders(httpRequest.xhr, canRunNPM)); + + treeDataProvider = registerExplorer(context); + + context.subscriptions.push(vscode.workspace.onDidChangeConfiguration((e) => { if (e.affectsConfiguration('npm.exclude') || e.affectsConfiguration('npm.autoDetect')) { invalidateTasksCache(); if (treeDataProvider) { @@ -32,15 +38,12 @@ export async function activate(context: vscode.ExtensionContext): Promise treeDataProvider.refresh(); } } - }); - context.subscriptions.push(d); + })); + + registerTaskProvider(context); + registerHoverProvider(context); - d = vscode.workspace.onDidChangeTextDocument((e) => { - invalidateHoverScriptsCache(e.document); - }); - context.subscriptions.push(d); context.subscriptions.push(vscode.commands.registerCommand('npm.runSelectedScript', runSelectedScript)); - context.subscriptions.push(addJSONProviders(httpRequest.xhr)); if (await hasPackageJson()) { vscode.commands.executeCommand('setContext', 'npm:showScriptExplorer', true); @@ -49,6 +52,13 @@ export async function activate(context: vscode.ExtensionContext): Promise context.subscriptions.push(vscode.commands.registerCommand('npm.runScriptFromFolder', selectAndRunScriptFromFolder)); } +function canRunNpmInCurrentWorkspace() { + if (vscode.workspace.workspaceFolders) { + return vscode.workspace.workspaceFolders.some(f => f.uri.scheme === 'file'); + } + return false; +} + function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposable | undefined { function invalidateScriptCaches() { diff --git a/extensions/npm/src/scriptHover.ts b/extensions/npm/src/scriptHover.ts index 46992af2088..aa803dbc1d4 100644 --- a/extensions/npm/src/scriptHover.ts +++ b/extensions/npm/src/scriptHover.ts @@ -32,6 +32,9 @@ export class NpmScriptHoverProvider implements HoverProvider { constructor(context: ExtensionContext) { context.subscriptions.push(commands.registerCommand('npm.runScriptFromHover', this.runScriptFromHover, this)); context.subscriptions.push(commands.registerCommand('npm.debugScriptFromHover', this.debugScriptFromHover, this)); + context.subscriptions.push(workspace.onDidChangeTextDocument((e) => { + invalidateHoverScriptsCache(e.document); + })); } public provideHover(document: TextDocument, position: Position, _token: CancellationToken): ProviderResult { diff --git a/extensions/npm/yarn.lock b/extensions/npm/yarn.lock index 9b8a23c9264..5e85de9297e 100644 --- a/extensions/npm/yarn.lock +++ b/extensions/npm/yarn.lock @@ -71,7 +71,7 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" -https-proxy-agent@^2.2.3: +https-proxy-agent@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== @@ -96,16 +96,21 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -request-light@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.2.5.tgz#38a3da7b2e56f7af8cbba57e8a94930ee2380746" - integrity sha512-eBEh+GzJAftUnex6tcL6eV2JCifY0+sZMIUpUPOVXbs2nV5hla4ZMmO3icYKGuGVuQ2zHE9evh4OrRcH4iyYYw== +request-light@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.4.0.tgz#c6b91ef00b18cb0de75d2127e55b3a2c9f7f90f9" + integrity sha512-fimzjIVw506FBZLspTAXHdpvgvQebyjpNyLRd0e6drPPRq7gcrROeGWRyF81wLqFg5ijPgnOQbmfck5wdTqpSA== dependencies: http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.3" - vscode-nls "^4.1.1" + https-proxy-agent "^2.2.4" + vscode-nls "^4.1.2" vscode-nls@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.1.tgz#f9916b64e4947b20322defb1e676a495861f133c" integrity sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A== + +vscode-nls@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" + integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== diff --git a/extensions/package.json b/extensions/package.json index ce4a3480cca..7c668c9744a 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "3.9.4" + "typescript": "3.9.6" }, "scripts": { "postinstall": "node ./postinstall" diff --git a/extensions/php-language-features/package.json b/extensions/php-language-features/package.json index d301ca476ea..2856782f547 100644 --- a/extensions/php-language-features/package.json +++ b/extensions/php-language-features/package.json @@ -39,7 +39,7 @@ ], "default": null, "description": "%configuration.validate.executablePath%", - "scope": "machine" + "scope": "machine-overridable" }, "php.validate.run": { "type": "string", diff --git a/extensions/python/extension-browser.webpack.config.js b/extensions/python/extension-browser.webpack.config.js index cce20bf3da3..9ffa8d167e9 100644 --- a/extensions/python/extension-browser.webpack.config.js +++ b/extensions/python/extension-browser.webpack.config.js @@ -7,27 +7,14 @@ 'use strict'; -const withDefaults = require('../shared.webpack.config'); -const path = require('path'); +const withBrowserDefaults = require('../shared.webpack.config').browser; -const clientConfig = withDefaults({ - target: 'webworker', +module.exports = withBrowserDefaults({ context: __dirname, entry: { extension: './src/pythonMain.ts' }, output: { filename: 'pythonMain.js' - }, - performance: { - hints: false - }, - resolve: { - alias: { - 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') - } } }); -clientConfig.module.rules[0].use.shift(); // remove nls loader - -module.exports = clientConfig; diff --git a/extensions/python/package.json b/extensions/python/package.json index ab813f048d1..612fcf76504 100644 --- a/extensions/python/package.json +++ b/extensions/python/package.json @@ -8,7 +8,7 @@ "engines": { "vscode": "*" }, "activationEvents": ["onLanguage:python"], "main": "./out/pythonMain", - "browser": "./dist/pythonMain", + "browser": "./dist/browser/pythonMain", "extensionKind": [ "ui", "workspace" ], "contributes": { "languages": [{ diff --git a/extensions/shared.webpack.config.js b/extensions/shared.webpack.config.js index f9d93777c60..3548671829f 100644 --- a/extensions/shared.webpack.config.js +++ b/extensions/shared.webpack.config.js @@ -13,8 +13,9 @@ const fs = require('fs'); const merge = require('merge-options'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const { NLSBundlePlugin } = require('vscode-nls-dev/lib/webpack-bundler'); +const { DefinePlugin } = require('webpack'); -module.exports = function withDefaults(/**@type WebpackConfig*/extConfig) { +function withNodeDefaults(/**@type WebpackConfig*/extConfig) { // Need to find the top-most `package.json` file const folderName = path.relative(__dirname, extConfig.context).split(/[\\\/]/)[0]; const pkgPath = path.join(__dirname, folderName, 'package.json'); @@ -78,3 +79,66 @@ module.exports = function withDefaults(/**@type WebpackConfig*/extConfig) { return merge(defaultConfig, extConfig); }; + + +function withBrowserDefaults(/**@type WebpackConfig*/extConfig) { + /** @type WebpackConfig */ + let defaultConfig = { + mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + target: 'webworker', // extensions run in a webworker context + resolve: { + mainFields: ['module', 'main'], + extensions: ['.ts', '.js'], // support ts-files and js-files + alias: { + 'vscode-nls': path.resolve(__dirname, '../build/polyfills/vscode-nls.js'), + 'vscode-extension-telemetry': path.resolve(__dirname, '../build/polyfills/vscode-extension-telemetry.js') + } + }, + module: { + rules: [{ + test: /\.ts$/, + exclude: /node_modules/, + use: [{ + // configure TypeScript loader: + // * enable sources maps for end-to-end source maps + loader: 'ts-loader', + options: { + compilerOptions: { + 'sourceMap': true, + } + } + }] + }] + }, + externals: { + 'vscode': 'commonjs vscode', // ignored because it doesn't exist + }, + performance: { + hints: false + }, + output: { + // all output goes into `dist`. + // packaging depends on that and this must always be like it + filename: '[name].js', + path: path.join(extConfig.context, 'dist', 'browser'), + libraryTarget: 'commonjs', + }, + // yes, really source maps + devtool: 'source-map', + plugins: [ + // @ts-expect-error + new CopyWebpackPlugin([ + { from: 'src', to: '.', ignore: ['**/test/**', '*.ts'] } + ]), + new DefinePlugin({ WEBWORKER: JSON.stringify(true) }) + ] + }; + + return merge(defaultConfig, extConfig); +}; + + +module.exports = withNodeDefaults; +module.exports.node = withNodeDefaults; +module.exports.browser = withBrowserDefaults; + diff --git a/extensions/sql/cgmanifest.json b/extensions/sql/cgmanifest.json index 56b576cdc79..3ef90a09d14 100644 --- a/extensions/sql/cgmanifest.json +++ b/extensions/sql/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "Microsoft/vscode-mssql", "repositoryUrl": "https://github.com/Microsoft/vscode-mssql", - "commitHash": "37a22725186b5b481b2882a78c7b9fe024c13946" + "commitHash": "750d30dc48c4c0317b63bb5f1ed3e71487bb84a1" } }, "license": "MIT", diff --git a/extensions/sql/syntaxes/sql.tmLanguage.json b/extensions/sql/syntaxes/sql.tmLanguage.json index 778c35071fa..bc3b533bcb9 100644 --- a/extensions/sql/syntaxes/sql.tmLanguage.json +++ b/extensions/sql/syntaxes/sql.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/vscode-mssql/commit/37a22725186b5b481b2882a78c7b9fe024c13946", + "version": "https://github.com/Microsoft/vscode-mssql/commit/750d30dc48c4c0317b63bb5f1ed3e71487bb84a1", "name": "SQL", "scopeName": "source.sql", "patterns": [ @@ -404,7 +404,7 @@ } }, "comment": "this is faster than the next begin/end rule since sub-pattern will match till end-of-line and SQL files tend to have very long lines.", - "match": "(N)?(')(?:[^'\\\\]|\\\\.)*(')", + "match": "(N)?(')[^']*(')", "name": "string.quoted.single.sql" }, { @@ -437,7 +437,7 @@ } }, "comment": "this is faster than the next begin/end rule since sub-pattern will match till end-of-line and SQL files tend to have very long lines.", - "match": "(`)(?:[^`\\\\]|\\\\.)*(`)", + "match": "(`)[^`\\\\]*(`)", "name": "string.quoted.other.backtick.sql" }, { @@ -470,7 +470,7 @@ } }, "comment": "this is faster than the next begin/end rule since sub-pattern will match till end-of-line and SQL files tend to have very long lines.", - "match": "(\")(?:[^\"#\\\\]|\\\\.)*(\")", + "match": "(\")[^\"#]*(\")", "name": "string.quoted.double.sql" }, { diff --git a/extensions/theme-defaults/themes/dark_plus.json b/extensions/theme-defaults/themes/dark_plus.json index fdadd4e5c3c..4fd89793214 100644 --- a/extensions/theme-defaults/themes/dark_plus.json +++ b/extensions/theme-defaults/themes/dark_plus.json @@ -190,5 +190,11 @@ "foreground": "#C8C8C8" } } - ] + ], + "semanticTokenColors": { + "newOperator":"#C586C0", + "stringLiteral":"#ce9178", + "customLiteral": "#DCDCAA", + "numberLiteral": "#b5cea8", + } } diff --git a/extensions/theme-defaults/themes/dark_vs.json b/extensions/theme-defaults/themes/dark_vs.json index 6e5f4c25f80..1b4cf8b967e 100644 --- a/extensions/theme-defaults/themes/dark_vs.json +++ b/extensions/theme-defaults/themes/dark_vs.json @@ -45,7 +45,6 @@ { "scope": [ "constant.numeric", - "entity.name.operator.custom-literal.number", "variable.other.enummember", "keyword.operator.plus.exponent", "keyword.operator.minus.exponent" @@ -226,7 +225,6 @@ { "scope": [ "string", - "entity.name.operator.custom-literal.string", "meta.embedded.assembly" ], "settings": { @@ -364,5 +362,11 @@ "foreground": "#569cd6" } } - ] + ], + "semanticTokenColors": { + "newOperator": "#d4d4d4", + "stringLiteral": "#ce9178", + "customLiteral": "#D4D4D4", + "numberLiteral": "#b5cea8", + } } diff --git a/extensions/theme-defaults/themes/hc_black.json b/extensions/theme-defaults/themes/hc_black.json index 73309c34b44..436dfa52912 100644 --- a/extensions/theme-defaults/themes/hc_black.json +++ b/extensions/theme-defaults/themes/hc_black.json @@ -122,5 +122,11 @@ "foreground": "#CBEDCB", } } - ] + ], + "semanticTokenColors": { + "newOperator": "#FFFFFF", + "stringLiteral": "#ce9178", + "customLiteral": "#DCDCAA", + "numberLiteral": "#b5cea8", + } } diff --git a/extensions/theme-defaults/themes/light_defaults.json b/extensions/theme-defaults/themes/light_defaults.json index fa1e1dbc3c7..a22dd21b4a5 100644 --- a/extensions/theme-defaults/themes/light_defaults.json +++ b/extensions/theme-defaults/themes/light_defaults.json @@ -19,7 +19,11 @@ "statusBarItem.remoteForeground": "#FFF", "statusBarItem.remoteBackground": "#16825D", "sideBarSectionHeader.background": "#0000", - "sideBarSectionHeader.border": "#61616130" + "sideBarSectionHeader.border": "#61616130", + "notebook.cellFocusBackground": "#c8ddf150", + "notebook.cellBorderColor": "#dae3e9", + "notebook.outputContainerBackgroundColor": "#c8ddf150", + "notebook.focusedCellShadow": "#00315040" }, "semanticHighlighting": true } diff --git a/extensions/theme-defaults/themes/light_plus.json b/extensions/theme-defaults/themes/light_plus.json index a5ea49d4d36..b743b1b998a 100644 --- a/extensions/theme-defaults/themes/light_plus.json +++ b/extensions/theme-defaults/themes/light_plus.json @@ -190,5 +190,11 @@ "foreground": "#000000" } } - ] + ], + "semanticTokenColors": { + "newOperator": "#AF00DB", + "stringLiteral": "#a31515", + "customLiteral": "#795E26", + "numberLiteral": "#098658", + } } diff --git a/extensions/theme-defaults/themes/light_vs.json b/extensions/theme-defaults/themes/light_vs.json index cbf19b22988..3410551898b 100644 --- a/extensions/theme-defaults/themes/light_vs.json +++ b/extensions/theme-defaults/themes/light_vs.json @@ -45,7 +45,6 @@ { "scope": [ "constant.numeric", - "entity.name.operator.custom-literal.number", "variable.other.enummember", "keyword.operator.plus.exponent", "keyword.operator.minus.exponent" @@ -218,7 +217,6 @@ { "scope": [ "string", - "entity.name.operator.custom-literal.string", "meta.embedded.assembly" ], "settings": { @@ -388,5 +386,11 @@ "foreground": "#0000ff" } } - ] + ], + "semanticTokenColors": { + "newOperator": "#0000ff", + "stringLiteral": "#a31515", + "customLiteral": "#000000", + "numberLiteral": "#098658", + } } diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 70d4c45d3c5..23c4a4004d9 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -19,7 +19,7 @@ "jsonc-parser": "^2.2.1", "rimraf": "^2.6.3", "semver": "5.5.1", - "typescript-vscode-sh-plugin": "^0.6.13", + "typescript-vscode-sh-plugin": "^0.6.14", "vscode-extension-telemetry": "0.1.1", "vscode-nls": "^4.1.1" }, @@ -58,7 +58,7 @@ }, { "fileMatch": "tsconfig.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/tsconfig.json" + "url": "https://json.schemastore.org/tsconfig" }, { "fileMatch": "tsconfig.json", @@ -66,7 +66,7 @@ }, { "fileMatch": "tsconfig.*.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/tsconfig.json" + "url": "https://json.schemastore.org/tsconfig" }, { "fileMatch": "tsconfig-*.json", @@ -74,7 +74,7 @@ }, { "fileMatch": "tsconfig-*.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/tsconfig.json" + "url": "https://json.schemastore.org/tsconfig" }, { "fileMatch": "tsconfig.*.json", @@ -82,27 +82,27 @@ }, { "fileMatch": "typings.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/typings.json" + "url": "https://json.schemastore.org/typings" }, { "fileMatch": ".bowerrc", - "url": "https://schemastore.azurewebsites.net/schemas/json/bowerrc.json" + "url": "https://json.schemastore.org/bowerrc" }, { "fileMatch": ".babelrc", - "url": "https://schemastore.azurewebsites.net/schemas/json/babelrc.json" + "url": "https://json.schemastore.org/babelrc" }, { "fileMatch": ".babelrc.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/babelrc.json" + "url": "https://json.schemastore.org/babelrc" }, { "fileMatch": "babel.config.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/babelrc.json" + "url": "https://json.schemastore.org/babelrc" }, { "fileMatch": "jsconfig.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/jsconfig.json" + "url": "https://json.schemastore.org/jsconfig" }, { "fileMatch": "jsconfig.json", @@ -110,7 +110,7 @@ }, { "fileMatch": "jsconfig.*.json", - "url": "https://schemastore.azurewebsites.net/schemas/json/jsconfig.json" + "url": "https://json.schemastore.org/jsconfig" }, { "fileMatch": "jsconfig.*.json", diff --git a/extensions/typescript-language-features/src/features/callHierarchy.ts b/extensions/typescript-language-features/src/features/callHierarchy.ts index a76d8a6bea8..3e84d255ee5 100644 --- a/extensions/typescript-language-features/src/features/callHierarchy.ts +++ b/extensions/typescript-language-features/src/features/callHierarchy.ts @@ -11,6 +11,13 @@ import { VersionDependentRegistration } from '../utils/dependentRegistration'; import type * as Proto from '../protocol'; import * as path from 'path'; import * as PConst from '../protocol.const'; +import { parseKindModifier } from '../utils/modifiers'; + +namespace Experimental { + export interface CallHierarchyItem extends Proto.CallHierarchyItem { + readonly kindModifiers?: string; + } +} class TypeScriptCallHierarchySupport implements vscode.CallHierarchyProvider { public static readonly minVersion = API.v380; @@ -75,11 +82,11 @@ function isSourceFileItem(item: Proto.CallHierarchyItem) { return item.kind === PConst.Kind.script || item.kind === PConst.Kind.module && item.selectionSpan.start.line === 1 && item.selectionSpan.start.offset === 1; } -function fromProtocolCallHierarchyItem(item: Proto.CallHierarchyItem): vscode.CallHierarchyItem { +function fromProtocolCallHierarchyItem(item: Experimental.CallHierarchyItem): vscode.CallHierarchyItem { const useFileName = isSourceFileItem(item); const name = useFileName ? path.basename(item.file) : item.name; const detail = useFileName ? vscode.workspace.asRelativePath(path.dirname(item.file)) : ''; - return new vscode.CallHierarchyItem( + const result = new vscode.CallHierarchyItem( typeConverters.SymbolKind.fromProtocolScriptElementKind(item.kind), name, detail, @@ -87,6 +94,12 @@ function fromProtocolCallHierarchyItem(item: Proto.CallHierarchyItem): vscode.Ca typeConverters.Range.fromTextSpan(item.span), typeConverters.Range.fromTextSpan(item.selectionSpan) ); + + const kindModifiers = item.kindModifiers ? parseKindModifier(item.kindModifiers) : undefined; + if (kindModifiers?.has(PConst.KindModifiers.depreacted)) { + result.tags = [vscode.SymbolTag.Deprecated]; + } + return result; } function fromProtocolCallHierchyIncomingCall(item: Proto.CallHierarchyIncomingCall): vscode.CallHierarchyIncomingCall { diff --git a/extensions/typescript-language-features/src/features/completions.ts b/extensions/typescript-language-features/src/features/completions.ts index 97051395de9..79f617ba4d7 100644 --- a/extensions/typescript-language-features/src/features/completions.ts +++ b/extensions/typescript-language-features/src/features/completions.ts @@ -19,6 +19,7 @@ import { TelemetryReporter } from '../utils/telemetry'; import * as typeConverters from '../utils/typeConverters'; import TypingsStatus from '../utils/typingsStatus'; import FileConfigurationManager from './fileConfigurationManager'; +import { parseKindModifier } from '../utils/modifiers'; const localize = nls.loadMessageBundle(); @@ -90,8 +91,8 @@ class MyCompletionItem extends vscode.CompletionItem { } if (tsEntry.kindModifiers) { - const kindModifiers = tsEntry.kindModifiers.split(/,|\s+/g); - if (kindModifiers.includes(PConst.KindModifiers.optional)) { + const kindModifiers = parseKindModifier(tsEntry.kindModifiers); + if (kindModifiers.has(PConst.KindModifiers.optional)) { if (!this.insertText) { this.insertText = this.label; } @@ -101,14 +102,17 @@ class MyCompletionItem extends vscode.CompletionItem { } this.label += '?'; } + if (kindModifiers.has(PConst.KindModifiers.depreacted)) { + this.tags = [vscode.CompletionItemTag.Deprecated]; + } - if (kindModifiers.includes(PConst.KindModifiers.color)) { + if (kindModifiers.has(PConst.KindModifiers.color)) { this.kind = vscode.CompletionItemKind.Color; } if (tsEntry.kind === PConst.Kind.script) { for (const extModifier of PConst.KindModifiers.fileExtensionKindModifiers) { - if (kindModifiers.includes(extModifier)) { + if (kindModifiers.has(extModifier)) { if (tsEntry.name.toLowerCase().endsWith(extModifier)) { this.detail = tsEntry.name; } else { diff --git a/extensions/typescript-language-features/src/features/diagnostics.ts b/extensions/typescript-language-features/src/features/diagnostics.ts index 327573e8c18..ec0566d67cb 100644 --- a/extensions/typescript-language-features/src/features/diagnostics.ts +++ b/extensions/typescript-language-features/src/features/diagnostics.ts @@ -78,7 +78,7 @@ class FileDiagnostics { return this.get(DiagnosticKind.Suggestion).filter(x => { if (!enableSuggestions) { // Still show unused - return x.tags && x.tags.includes(vscode.DiagnosticTag.Unnecessary); + return x.tags && (x.tags.includes(vscode.DiagnosticTag.Unnecessary) || x.tags.includes(vscode.DiagnosticTag.Deprecated)); } return true; }); diff --git a/extensions/typescript-language-features/src/features/documentSymbol.ts b/extensions/typescript-language-features/src/features/documentSymbol.ts index e119b005bab..8b44581c6de 100644 --- a/extensions/typescript-language-features/src/features/documentSymbol.ts +++ b/extensions/typescript-language-features/src/features/documentSymbol.ts @@ -9,6 +9,7 @@ import * as PConst from '../protocol.const'; import { ITypeScriptServiceClient } from '../typescriptService'; import * as typeConverters from '../utils/typeConverters'; import { CachedResponse } from '../tsServer/cachedResponse'; +import { parseKindModifier } from '../utils/modifiers'; const getSymbolKind = (kind: string): vscode.SymbolKind => { switch (kind) { @@ -79,6 +80,12 @@ class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider range, range.contains(selectionRange) ? selectionRange : range); + + const kindModifiers = parseKindModifier(item.kindModifiers); + if (kindModifiers.has(PConst.KindModifiers.depreacted)) { + symbolInfo.tags = [vscode.SymbolTag.Deprecated]; + } + for (const child of children) { if (child.spans.some(span => !!range.intersection(typeConverters.Range.fromTextSpan(span)))) { const includedChild = TypeScriptDocumentSymbolProvider.convertNavTree(resource, symbolInfo.children, child); diff --git a/extensions/typescript-language-features/src/features/fileConfigurationManager.ts b/extensions/typescript-language-features/src/features/fileConfigurationManager.ts index 0d54ccea22a..55d5324469b 100644 --- a/extensions/typescript-language-features/src/features/fileConfigurationManager.ts +++ b/extensions/typescript-language-features/src/features/fileConfigurationManager.ts @@ -13,6 +13,13 @@ import { isTypeScriptDocument } from '../utils/languageModeIds'; import { equals } from '../utils/objects'; import { ResourceMap } from '../utils/resourceMap'; +namespace Experimental { + // https://github.com/microsoft/TypeScript/pull/37871/ + export interface UserPreferences extends Proto.UserPreferences { + readonly provideRefactorNotApplicableReason?: boolean; + } +} + interface FileConfiguration { readonly formatOptions: Proto.FormatCodeSettings; readonly preferences: Proto.UserPreferences; @@ -170,7 +177,7 @@ export default class FileConfigurationManager extends Disposable { isTypeScriptDocument(document) ? 'typescript.preferences' : 'javascript.preferences', document.uri); - const preferences: Proto.UserPreferences = { + const preferences: Experimental.UserPreferences = { quotePreference: this.getQuoteStylePreference(preferencesConfig), importModuleSpecifierPreference: getImportModuleSpecifierPreference(preferencesConfig), importModuleSpecifierEnding: getImportModuleSpecifierEndingPreference(preferencesConfig), @@ -178,6 +185,7 @@ export default class FileConfigurationManager extends Disposable { providePrefixAndSuffixTextForRename: preferencesConfig.get('renameShorthandProperties', true) === false ? false : preferencesConfig.get('useAliasesForRenames', true), allowRenameOfImportPath: true, includeAutomaticOptionalChainCompletions: config.get('suggest.includeAutomaticOptionalChainCompletions', true), + provideRefactorNotApplicableReason: true, }; return preferences; diff --git a/extensions/typescript-language-features/src/features/languageConfiguration.ts b/extensions/typescript-language-features/src/features/languageConfiguration.ts index 91cb4a36c91..e7f0af0ff9c 100644 --- a/extensions/typescript-language-features/src/features/languageConfiguration.ts +++ b/extensions/typescript-language-features/src/features/languageConfiguration.ts @@ -31,7 +31,7 @@ const jsTsLanguageConfiguration: vscode.LanguageConfiguration = { }, { // e.g. * ...| beforeText: /^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/, - oneLineAboveText: /^(\s*(\/\*\*|\*)).*/, + oneLineAboveText: /(?=^(\s*(\/\*\*|\*)).*)(?=(?!(\s*\*\/)))/, action: { indentAction: vscode.IndentAction.None, appendText: '* ' }, }, { // e.g. */| diff --git a/extensions/typescript-language-features/src/features/refactor.ts b/extensions/typescript-language-features/src/features/refactor.ts index b3b9376af20..ca56c6d6902 100644 --- a/extensions/typescript-language-features/src/features/refactor.ts +++ b/extensions/typescript-language-features/src/features/refactor.ts @@ -22,7 +22,7 @@ const localize = nls.loadMessageBundle(); namespace Experimental { export interface RefactorActionInfo extends Proto.RefactorActionInfo { - readonly error?: string + readonly notApplicableReason?: string; } export type RefactorTriggerReason = 'implicit' | 'invoked'; @@ -312,16 +312,16 @@ class TypeScriptRefactorProvider implements vscode.CodeActionProvider { const codeAction = new vscode.CodeAction(action.description, TypeScriptRefactorProvider.getKind(action)); // https://github.com/microsoft/TypeScript/pull/37871 - if (action.error) { - codeAction.disabled = { reason: action.error }; - return codeAction; + if (action.notApplicableReason) { + codeAction.disabled = { reason: action.notApplicableReason }; + } else { + codeAction.command = { + title: action.description, + command: ApplyRefactoringCommand.ID, + arguments: [document, info.name, action.name, rangeOrSelection], + }; } - codeAction.command = { - title: action.description, - command: ApplyRefactoringCommand.ID, - arguments: [document, info.name, action.name, rangeOrSelection], - }; codeAction.isPreferred = TypeScriptRefactorProvider.isPreferred(action, allActions); return codeAction; } diff --git a/extensions/typescript-language-features/src/features/workspaceSymbols.ts b/extensions/typescript-language-features/src/features/workspaceSymbols.ts index be269a8ec41..73a142440e5 100644 --- a/extensions/typescript-language-features/src/features/workspaceSymbols.ts +++ b/extensions/typescript-language-features/src/features/workspaceSymbols.ts @@ -11,6 +11,7 @@ import API from '../utils/api'; import * as fileSchemes from '../utils/fileSchemes'; import { doesResourceLookLikeAJavaScriptFile, doesResourceLookLikeATypeScriptFile } from '../utils/languageDescription'; import * as typeConverters from '../utils/typeConverters'; +import { parseKindModifier } from '../utils/modifiers'; function getSymbolKind(item: Proto.NavtoItem): vscode.SymbolKind { switch (item.kind) { @@ -90,11 +91,16 @@ class TypeScriptWorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvide private toSymbolInformation(item: Proto.NavtoItem) { const label = TypeScriptWorkspaceSymbolProvider.getLabel(item); - return new vscode.SymbolInformation( + const info = new vscode.SymbolInformation( label, getSymbolKind(item), item.containerName || '', typeConverters.Location.fromTextSpan(this.client.toResource(item.file), item)); + const kindModifiers = item.kindModifiers ? parseKindModifier(item.kindModifiers) : undefined; + if (kindModifiers?.has(PConst.KindModifiers.depreacted)) { + info.tags = [vscode.SymbolTag.Deprecated]; + } + return info; } private static getLabel(item: Proto.NavtoItem) { diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index 644eed40441..ee040667b68 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -122,16 +122,22 @@ export default class LanguageProvider extends Disposable { this.client.bufferSyncSupport.requestAllDiagnostics(); } - public diagnosticsReceived(diagnosticsKind: DiagnosticKind, file: vscode.Uri, diagnostics: (vscode.Diagnostic & { reportUnnecessary: any })[]): void { + public diagnosticsReceived(diagnosticsKind: DiagnosticKind, file: vscode.Uri, diagnostics: (vscode.Diagnostic & { reportUnnecessary: any, reportDeprecated: any })[]): void { const config = vscode.workspace.getConfiguration(this.id, file); const reportUnnecessary = config.get('showUnused', true); + const reportDeprecated = config.get('showDeprecated', true); this.client.diagnosticsManager.updateDiagnostics(file, this._diagnosticLanguage, diagnosticsKind, diagnostics.filter(diag => { + // Don't both reporting diagnostics we know will not be rendered if (!reportUnnecessary) { - diag.tags = undefined; if (diag.reportUnnecessary && diag.severity === vscode.DiagnosticSeverity.Hint) { return false; } } + if (!reportDeprecated) { + if (diag.reportDeprecated && diag.severity === vscode.DiagnosticSeverity.Hint) { + return false; + } + } return true; })); } diff --git a/extensions/typescript-language-features/src/protocol.const.ts b/extensions/typescript-language-features/src/protocol.const.ts index ff2bfece14f..210e962c9aa 100644 --- a/extensions/typescript-language-features/src/protocol.const.ts +++ b/extensions/typescript-language-features/src/protocol.const.ts @@ -45,6 +45,7 @@ export class DiagnosticCategory { export class KindModifiers { public static readonly optional = 'optional'; + public static readonly depreacted = 'deprecated'; public static readonly color = 'color'; public static readonly dtsFile = '.d.ts'; diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 7faff5b6d71..0ac92ca7a42 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -379,75 +379,6 @@ class RequestRouter { } } - -const syntaxAlwaysCommands: ReadonlySet = new Set([ - 'navtree', - 'getOutliningSpans', - 'jsxClosingTag', - 'selectionRange', - 'format', - 'formatonkey', - 'docCommentTemplate', -]); - -export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServer { - - private readonly syntaxServer: ITypeScriptServer; - private readonly semanticServer: ITypeScriptServer; - private readonly router: RequestRouter; - - public constructor( - servers: { syntax: ITypeScriptServer, semantic: ITypeScriptServer }, - delegate: TsServerDelegate, - ) { - super(); - - this.syntaxServer = servers.syntax; - this.semanticServer = servers.semantic; - - this.router = new RequestRouter( - [ - { server: this.syntaxServer, canRun: (command) => syntaxAlwaysCommands.has(command) }, - { server: this.semanticServer, canRun: undefined /* gets all other commands */ } - ], - delegate); - - this._register(this.syntaxServer.onEvent(e => this._onEvent.fire(e))); - this._register(this.semanticServer.onEvent(e => this._onEvent.fire(e))); - - this._register(this.semanticServer.onExit(e => { - this._onExit.fire(e); - this.syntaxServer.kill(); - })); - this._register(this.semanticServer.onError(e => this._onError.fire(e))); - } - - private readonly _onEvent = this._register(new vscode.EventEmitter()); - public readonly onEvent = this._onEvent.event; - - private readonly _onExit = this._register(new vscode.EventEmitter()); - public readonly onExit = this._onExit.event; - - private readonly _onError = this._register(new vscode.EventEmitter()); - public readonly onError = this._onError.event; - - public get onReaderError() { return this.semanticServer.onReaderError; } - - public get tsServerLogFile() { return this.semanticServer.tsServerLogFile; } - - public kill(): void { - this.syntaxServer.kill(); - this.semanticServer.kill(); - } - - public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: false, lowPriority?: boolean }): undefined; - public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise>; - public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean }): Promise> | undefined { - return this.router.execute(command, args, executeInfo); - } -} - - export class GetErrRoutingTsServer extends Disposable implements ITypeScriptServer { private static readonly diagnosticEvents = new Set([ @@ -525,7 +456,20 @@ export class GetErrRoutingTsServer extends Disposable implements ITypeScriptServ } -export class ProjectLoadingRoutingSyntaxTsServer extends Disposable implements ITypeScriptServer { +export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServer { + + /** + * Commands that should always be run on the syntax server. + */ + private static readonly syntaxAlwaysCommands = new Set([ + 'navtree', + 'getOutliningSpans', + 'jsxClosingTag', + 'selectionRange', + 'format', + 'formatonkey', + 'docCommentTemplate', + ]); /** * Commands that should always be run on the semantic server. @@ -539,7 +483,7 @@ export class ProjectLoadingRoutingSyntaxTsServer extends Disposable implements I /** * Commands that can be run on the syntax server but would benefit from being upgraded to the semantic server. */ - private syntaxAllowedCommands = new Set([ + private static readonly syntaxAllowedCommands = new Set([ 'completions', 'completionEntryDetails', 'completionInfo', @@ -563,6 +507,7 @@ export class ProjectLoadingRoutingSyntaxTsServer extends Disposable implements I public constructor( servers: { syntax: ITypeScriptServer, semantic: ITypeScriptServer }, delegate: TsServerDelegate, + enableDynamicRouting: boolean, ) { super(); @@ -574,13 +519,13 @@ export class ProjectLoadingRoutingSyntaxTsServer extends Disposable implements I { server: this.syntaxServer, canRun: (command) => { - if (syntaxAlwaysCommands.has(command)) { + if (SyntaxRoutingTsServer.syntaxAlwaysCommands.has(command)) { return true; } - if (ProjectLoadingRoutingSyntaxTsServer.semanticCommands.has(command)) { + if (SyntaxRoutingTsServer.semanticCommands.has(command)) { return false; } - if (this.projectLoading && this.syntaxAllowedCommands.has(command)) { + if (enableDynamicRouting && this.projectLoading && SyntaxRoutingTsServer.syntaxAllowedCommands.has(command)) { return true; } return false; diff --git a/extensions/typescript-language-features/src/tsServer/serverError.ts b/extensions/typescript-language-features/src/tsServer/serverError.ts index ace77d8a903..643998cd4ec 100644 --- a/extensions/typescript-language-features/src/tsServer/serverError.ts +++ b/extensions/typescript-language-features/src/tsServer/serverError.ts @@ -79,7 +79,7 @@ export class TypeScriptServerError extends Error { if (!message) { return ''; } - const regex = /(tsserver)?(\.(?:ts|tsx|js|jsx)(?::\d+(?::\d+)?)?)\)?$/igm; + const regex = /(\btsserver)?(\.(?:ts|tsx|js|jsx)(?::\d+(?::\d+)?)?)\)?$/igm; let serverStack = ''; while (true) { const match = regex.exec(message); diff --git a/extensions/typescript-language-features/src/tsServer/spawner.ts b/extensions/typescript-language-features/src/tsServer/spawner.ts index 292e3d42f4b..eefd944d70e 100644 --- a/extensions/typescript-language-features/src/tsServer/spawner.ts +++ b/extensions/typescript-language-features/src/tsServer/spawner.ts @@ -9,7 +9,7 @@ import * as stream from 'stream'; import * as vscode from 'vscode'; import type * as Proto from '../protocol'; import API from '../utils/api'; -import { TsServerLogLevel, TypeScriptServiceConfiguration, SeparateSyntaxServerConfigration } from '../utils/configuration'; +import { SeparateSyntaxServerConfiguration, TsServerLogLevel, TypeScriptServiceConfiguration } from '../utils/configuration'; import * as electron from '../utils/electron'; import LogDirectoryProvider from '../utils/logDirectoryProvider'; import Logger from '../utils/logger'; @@ -18,7 +18,7 @@ import { PluginManager } from '../utils/plugins'; import { TelemetryReporter } from '../utils/telemetry'; import Tracer from '../utils/tracer'; import { TypeScriptVersion, TypeScriptVersionProvider } from '../utils/versionProvider'; -import { ITypeScriptServer, PipeRequestCanceller, ProcessBasedTsServer, SyntaxRoutingTsServer, TsServerProcess, TsServerDelegate, GetErrRoutingTsServer, ProjectLoadingRoutingSyntaxTsServer } from './server'; +import { GetErrRoutingTsServer, ITypeScriptServer, PipeRequestCanceller, ProcessBasedTsServer, SyntaxRoutingTsServer, TsServerDelegate, TsServerProcess } from './server'; const enum ServerKind { Main = 'main', @@ -34,7 +34,7 @@ const enum CompositeServerType { /** Run a separate server for syntax commands */ SeparateSyntax, - /** Use a separate suntax server while the project is loading */ + /** Use a separate syntax server while the project is loading */ DynamicSeparateSyntax, } @@ -55,21 +55,16 @@ export class TypeScriptServerSpawner { delegate: TsServerDelegate, ): ITypeScriptServer { let primaryServer: ITypeScriptServer; - switch (this.getCompositeServerType(version, configuration)) { + const serverType = this.getCompositeServerType(version, configuration); + switch (serverType) { case CompositeServerType.SeparateSyntax: + case CompositeServerType.DynamicSeparateSyntax: { + const enableDynamicRouting = serverType === CompositeServerType.DynamicSeparateSyntax; primaryServer = new SyntaxRoutingTsServer({ syntax: this.spawnTsServer(ServerKind.Syntax, version, configuration, pluginManager), semantic: this.spawnTsServer(ServerKind.Semantic, version, configuration, pluginManager) - }, delegate); - break; - } - case CompositeServerType.DynamicSeparateSyntax: - { - primaryServer = new ProjectLoadingRoutingSyntaxTsServer({ - syntax: this.spawnTsServer(ServerKind.Syntax, version, configuration, pluginManager), - semantic: this.spawnTsServer(ServerKind.Semantic, version, configuration, pluginManager) - }, delegate); + }, delegate, enableDynamicRouting); break; } case CompositeServerType.Single: @@ -94,14 +89,16 @@ export class TypeScriptServerSpawner { configuration: TypeScriptServiceConfiguration, ): CompositeServerType { switch (configuration.separateSyntaxServer) { - case SeparateSyntaxServerConfigration.Disabled: + case SeparateSyntaxServerConfiguration.Disabled: return CompositeServerType.Single; - case SeparateSyntaxServerConfigration.Enabled: - return version.apiVersion?.gte(API.v340) ? CompositeServerType.SeparateSyntax : CompositeServerType.Single; - - case SeparateSyntaxServerConfigration.Dynamic: - return version.apiVersion?.gte(API.v400) ? CompositeServerType.DynamicSeparateSyntax : CompositeServerType.Single; + case SeparateSyntaxServerConfiguration.Enabled: + if (version.apiVersion?.gte(API.v340)) { + return version.apiVersion?.gte(API.v400) + ? CompositeServerType.DynamicSeparateSyntax + : CompositeServerType.SeparateSyntax; + } + return CompositeServerType.Single; } } diff --git a/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts b/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts index 32f0e47609a..ff06c82b96c 100644 --- a/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts +++ b/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts @@ -26,6 +26,12 @@ import * as typeConverters from './utils/typeConverters'; import TypingsStatus, { AtaProgressReporter } from './utils/typingsStatus'; import VersionStatus from './utils/versionStatus'; +namespace Experimental { + export interface Diagnostic extends Proto.Diagnostic { + readonly reportsDeprecated?: {} + } +} + // Style check diagnostics that can be reported as warnings const styleCheckDiagnostics = new Set([ ...errorCodes.variableDeclaredButNeverUsed, @@ -44,7 +50,6 @@ export default class TypeScriptServiceClientHost extends Disposable { private readonly languagePerId = new Map(); private readonly typingsStatus: TypingsStatus; - private readonly versionStatus: VersionStatus; private readonly fileConfigurationManager: FileConfigurationManager; @@ -63,7 +68,6 @@ export default class TypeScriptServiceClientHost extends Disposable { const allModeIds = this.getAllModeIds(descriptions, pluginManager); this.client = this._register(new TypeScriptServiceClient( workspaceState, - version => this.versionStatus.onDidChangeTypeScriptVersion(version), pluginManager, logDirectoryProvider, allModeIds)); @@ -75,8 +79,7 @@ export default class TypeScriptServiceClientHost extends Disposable { this.client.onConfigDiagnosticsReceived(diag => this.configFileDiagnosticsReceived(diag), null, this._disposables); this.client.onResendModelsRequested(() => this.populateService(), null, this._disposables); - this.versionStatus = this._register(new VersionStatus(this.client, commandManager)); - + this._register(new VersionStatus(this.client, commandManager)); this._register(new AtaProgressReporter(this.client)); this.typingsStatus = this._register(new TypingsStatus(this.client)); this.fileConfigurationManager = this._register(new FileConfigurationManager(this.client)); @@ -233,11 +236,11 @@ export default class TypeScriptServiceClientHost extends Disposable { private createMarkerDatas( diagnostics: Proto.Diagnostic[], source: string - ): (vscode.Diagnostic & { reportUnnecessary: any })[] { + ): (vscode.Diagnostic & { reportUnnecessary: any, reportDeprecated: any })[] { return diagnostics.map(tsDiag => this.tsDiagnosticToVsDiagnostic(tsDiag, source)); } - private tsDiagnosticToVsDiagnostic(diagnostic: Proto.Diagnostic, source: string): vscode.Diagnostic & { reportUnnecessary: any } { + private tsDiagnosticToVsDiagnostic(diagnostic: Experimental.Diagnostic, source: string): vscode.Diagnostic & { reportUnnecessary: any, reportDeprecated: any } { const { start, end, text } = diagnostic; const range = new vscode.Range(typeConverters.Position.fromLocation(start), typeConverters.Position.fromLocation(end)); const converted = new vscode.Diagnostic(range, text, this.getDiagnosticSeverity(diagnostic)); @@ -255,11 +258,19 @@ export default class TypeScriptServiceClientHost extends Disposable { return new vscode.DiagnosticRelatedInformation(typeConverters.Location.fromTextSpan(this.client.toResource(span.file), span), info.message); })); } + const tags: vscode.DiagnosticTag[] = []; if (diagnostic.reportsUnnecessary) { - converted.tags = [vscode.DiagnosticTag.Unnecessary]; + tags.push(vscode.DiagnosticTag.Unnecessary); } - (converted as vscode.Diagnostic & { reportUnnecessary: any }).reportUnnecessary = diagnostic.reportsUnnecessary; - return converted as vscode.Diagnostic & { reportUnnecessary: any }; + if (diagnostic.reportsDeprecated) { + tags.push(vscode.DiagnosticTag.Deprecated); + } + converted.tags = tags.length ? tags : undefined; + + const resultConverted = converted as vscode.Diagnostic & { reportUnnecessary: any, reportDeprecated: any }; + resultConverted.reportUnnecessary = diagnostic.reportsUnnecessary; + resultConverted.reportDeprecated = diagnostic.reportsDeprecated; + return resultConverted; } private getDiagnosticSeverity(diagnostic: Proto.Diagnostic): vscode.DiagnosticSeverity { diff --git a/extensions/typescript-language-features/src/typescriptService.ts b/extensions/typescript-language-features/src/typescriptService.ts index eb6ff651b30..e3d89eb2bc7 100644 --- a/extensions/typescript-language-features/src/typescriptService.ts +++ b/extensions/typescript-language-features/src/typescriptService.ts @@ -9,6 +9,7 @@ import * as Proto from './protocol'; import API from './utils/api'; import { TypeScriptServiceConfiguration } from './utils/configuration'; import { PluginManager } from './utils/plugins'; +import { TypeScriptVersion } from './utils/versionProvider'; export namespace ServerResponse { @@ -32,7 +33,7 @@ interface StandardTsServerRequests { 'completions': [Proto.CompletionsRequestArgs, Proto.CompletionsResponse]; 'configure': [Proto.ConfigureRequestArguments, Proto.ConfigureResponse]; 'definition': [Proto.FileLocationRequestArgs, Proto.DefinitionResponse]; - 'definitionAndBoundSpan': [Proto.FileLocationRequestArgs, Proto.DefinitionInfoAndBoundSpanReponse]; + 'definitionAndBoundSpan': [Proto.FileLocationRequestArgs, Proto.DefinitionInfoAndBoundSpanResponse]; 'docCommentTemplate': [Proto.FileLocationRequestArgs, Proto.DocCommandTemplateResponse]; 'documentHighlights': [Proto.DocumentHighlightsRequestArgs, Proto.DocumentHighlightsResponse]; 'format': [Proto.FormatRequestArgs, Proto.FormatResponse]; @@ -113,7 +114,7 @@ export interface ITypeScriptServiceClient { getWorkspaceRootForResource(resource: vscode.Uri): string | undefined; - readonly onTsServerStarted: vscode.Event; + readonly onTsServerStarted: vscode.Event<{ version: TypeScriptVersion, usedApiVersion: API }>; readonly onProjectLanguageServiceStateChanged: vscode.Event; readonly onDidBeginInstallTypings: vscode.Event; readonly onDidEndInstallTypings: vscode.Event; diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 43002c897ba..38db0f2d757 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -66,7 +66,7 @@ namespace ServerState { * Version reported by currently-running tsserver. */ public tsserverVersion: string | undefined, - public langaugeServiceEnabled: boolean, + public languageServiceEnabled: boolean, ) { } public readonly toCancelOnResourceChange = new Set(); @@ -75,8 +75,8 @@ namespace ServerState { this.tsserverVersion = tsserverVersion; } - updateLangaugeServiceEnabled(enabled: boolean) { - this.langaugeServiceEnabled = enabled; + updateLanguageServiceEnabled(enabled: boolean) { + this.languageServiceEnabled = enabled; } } @@ -84,6 +84,7 @@ namespace ServerState { readonly type = Type.Errored; constructor( public readonly error: Error, + public readonly tsServerLogFile: string | undefined, ) { } } @@ -121,7 +122,6 @@ export default class TypeScriptServiceClient extends Disposable implements IType constructor( private readonly workspaceState: vscode.Memento, - private readonly onDidChangeTypeScriptVersion: (version: TypeScriptVersion) => void, public readonly pluginManager: PluginManager, private readonly logDirectoryProvider: LogDirectoryProvider, allModeIds: readonly string[] @@ -239,7 +239,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType this.serverState = this.startService(true); } - private readonly _onTsServerStarted = this._register(new vscode.EventEmitter()); + private readonly _onTsServerStarted = this._register(new vscode.EventEmitter<{ version: TypeScriptVersion, usedApiVersion: API }>()); public readonly onTsServerStarted = this._onTsServerStarted.event; private readonly _onDiagnosticsReceived = this._register(new vscode.EventEmitter()); @@ -339,7 +339,6 @@ export default class TypeScriptServiceClient extends Disposable implements IType onFatalError: (command, err) => this.fatalError(command, err), }); this.serverState = new ServerState.Running(handle, apiVersion, undefined, true); - this.onDidChangeTypeScriptVersion(version); this.lastStart = Date.now(); /* __GDPR__ @@ -366,7 +365,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType vscode.window.showErrorMessage(localize('serverExitedWithError', 'TypeScript language server exited with error. Error message is: {0}', err.message || err.name)); } - this.serverState = new ServerState.Errored(err); + this.serverState = new ServerState.Errored(err, handle.tsServerLogFile); this.error('TSServer errored with error.', err); if (handle.tsServerLogFile) { this.error(`TSServer log file: ${handle.tsServerLogFile}`); @@ -416,15 +415,15 @@ export default class TypeScriptServiceClient extends Disposable implements IType handle.onReaderError(error => this.error('ReaderError', error)); handle.onEvent(event => this.dispatchEvent(event)); - this._onReady!.resolve(); - this._onTsServerStarted.fire(apiVersion); - if (apiVersion.gte(API.v300)) { this.loadingIndicator.startedLoadingProject(undefined /* projectName */); } this.serviceStarted(resendModels); + this._onReady!.resolve(); + this._onTsServerStarted.fire({ version: version, usedApiVersion: apiVersion }); + return this.serverState; } @@ -582,7 +581,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType if (item === reportIssueItem) { const args = previousState.type === ServerState.Type.Errored && previousState.error instanceof TypeScriptServerError - ? getReportIssueArgsForError(previousState.error) + ? getReportIssueArgsForError(previousState.error, previousState.tsServerLogFile) : undefined; vscode.commands.executeCommand('workbench.action.openIssueReporter', args); } @@ -752,9 +751,10 @@ export default class TypeScriptServiceClient extends Disposable implements IType if (this.serverState.type === ServerState.Type.Running) { this.info('Killing TS Server'); + const logfile = this.serverState.server.tsServerLogFile; this.serverState.server.kill(); if (error instanceof TypeScriptServerError) { - this.serverState = new ServerState.Errored(error); + this.serverState = new ServerState.Errored(error, logfile); } } } @@ -791,7 +791,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType { const body = (event as Proto.ProjectLanguageServiceStateEvent).body!; if (this.serverState.type === ServerState.Type.Running) { - this.serverState.updateLangaugeServiceEnabled(body.languageServiceEnabled); + this.serverState.updateLanguageServiceEnabled(body.languageServiceEnabled); } this._onProjectLanguageServiceStateChanged.fire(body); break; @@ -885,30 +885,60 @@ export default class TypeScriptServiceClient extends Disposable implements IType } } -function getReportIssueArgsForError(error: TypeScriptServerError): { extensionId: string, issueTitle: string, issueBody: string } | undefined { +function getReportIssueArgsForError( + error: TypeScriptServerError, + logPath: string | undefined, +): { extensionId: string, issueTitle: string, issueBody: string } | undefined { if (!error.serverStack || !error.serverMessage) { return undefined; } // Note these strings are intentionally not localized // as we want users to file issues in english + + const sections = [ + `❗️❗️❗️ Please fill in the sections below to help us diagnose the issue ❗️❗️❗️`, + `**TypeScript Version:** ${error.version.apiVersion?.fullVersionString}`, + `**Steps to reproduce crash** + +1. +2. +3.`, + ]; + + if (logPath) { + sections.push(`**TS Server Log** + +❗️ Please review and upload this log file to help us diagnose this crash: + +\`${logPath}\` + +The log file may contain personal data, including full paths and source code from your workspace. You can scrub the log file to remove paths or other personal information. +`); + } else { + + sections.push(`**TS Server Log** + +Server logging disabled. To help us fix crashes like this, please enable logging by setting: + +\`\`\`json +"typescript.tsserver.log": "verbose" +\`\`\` + +After enabling this setting, future crash reports will include the server log.`); + } + + sections.push(`**TS Server Error Stack** + +\`\`\` +${error.serverStack} +\`\`\``); + return { extensionId: 'vscode.typescript-language-features', issueTitle: `TS Server fatal error: ${error.serverMessage}`, - issueBody: `**TypeScript Version:** ${error.version.apiVersion?.fullVersionString} - -**Steps to reproduce crash** - -1. -2. -3. - -**TS Server Error Stack** - -\`\`\` -${error.serverStack} -\`\`\``, + issueBody: sections.join('\n\n') }; } diff --git a/extensions/typescript-language-features/src/utils/configuration.ts b/extensions/typescript-language-features/src/utils/configuration.ts index caa38efe842..adeccbb8efc 100644 --- a/extensions/typescript-language-features/src/utils/configuration.ts +++ b/extensions/typescript-language-features/src/utils/configuration.ts @@ -46,10 +46,9 @@ export namespace TsServerLogLevel { } } -export const enum SeparateSyntaxServerConfigration { +export const enum SeparateSyntaxServerConfiguration { Disabled, Enabled, - Dynamic, } export class TypeScriptServiceConfiguration { @@ -62,7 +61,7 @@ export class TypeScriptServiceConfiguration { public readonly checkJs: boolean; public readonly experimentalDecorators: boolean; public readonly disableAutomaticTypeAcquisition: boolean; - public readonly separateSyntaxServer: SeparateSyntaxServerConfigration; + public readonly separateSyntaxServer: SeparateSyntaxServerConfiguration; public readonly enableProjectDiagnostics: boolean; public readonly maxTsServerMemory: number; public readonly enablePromptUseWorkspaceTsdk: boolean; @@ -163,15 +162,12 @@ export class TypeScriptServiceConfiguration { return configuration.get('typescript.locale', null); } - private static readUseSeparateSyntaxServer(configuration: vscode.WorkspaceConfiguration): SeparateSyntaxServerConfigration { + private static readUseSeparateSyntaxServer(configuration: vscode.WorkspaceConfiguration): SeparateSyntaxServerConfiguration { const value = configuration.get('typescript.tsserver.useSeparateSyntaxServer', true); if (value === true) { - return SeparateSyntaxServerConfigration.Enabled; + return SeparateSyntaxServerConfiguration.Enabled; } - if (value === 'dynamic') { - return SeparateSyntaxServerConfigration.Dynamic; - } - return SeparateSyntaxServerConfigration.Disabled; + return SeparateSyntaxServerConfiguration.Disabled; } private static readEnableProjectDiagnostics(configuration: vscode.WorkspaceConfiguration): boolean { diff --git a/extensions/typescript-language-features/src/utils/dependentRegistration.ts b/extensions/typescript-language-features/src/utils/dependentRegistration.ts index 434379f57e1..75dac667204 100644 --- a/extensions/typescript-language-features/src/utils/dependentRegistration.ts +++ b/extensions/typescript-language-features/src/utils/dependentRegistration.ts @@ -45,18 +45,14 @@ export class VersionDependentRegistration extends Disposable { register: () => vscode.Disposable, ) { super(); - this._registration = new ConditionalRegistration(register); + + this._registration = this._register(new ConditionalRegistration(register)); + + this._register(this.client.onTsServerStarted(() => { + this.update(this.client.apiVersion); + })); this.update(client.apiVersion); - - this.client.onTsServerStarted(() => { - this.update(this.client.apiVersion); - }, null, this._disposables); - } - - public dispose() { - super.dispose(); - this._registration.dispose(); } private update(api: API) { @@ -74,14 +70,11 @@ export class ConfigurationDependentRegistration extends Disposable { register: () => vscode.Disposable, ) { super(); - this._registration = new ConditionalRegistration(register); - this.update(); - vscode.workspace.onDidChangeConfiguration(this.update, this, this._disposables); - } + this._registration = this._register(new ConditionalRegistration(register)); - public dispose() { - super.dispose(); - this._registration.dispose(); + this._register(vscode.workspace.onDidChangeConfiguration(this.update, this)); + + this.update(); } private update() { diff --git a/extensions/typescript-language-features/src/utils/modifiers.ts b/extensions/typescript-language-features/src/utils/modifiers.ts new file mode 100644 index 00000000000..589b5da3d52 --- /dev/null +++ b/extensions/typescript-language-features/src/utils/modifiers.ts @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export function parseKindModifier(kindModifiers: string): Set { + return new Set(kindModifiers.split(/,|\s+/g)); +} diff --git a/extensions/typescript-language-features/src/utils/versionStatus.ts b/extensions/typescript-language-features/src/utils/versionStatus.ts index e0b388e9eb1..5f61eb23cc4 100644 --- a/extensions/typescript-language-features/src/utils/versionStatus.ts +++ b/extensions/typescript-language-features/src/utils/versionStatus.ts @@ -151,9 +151,11 @@ export default class VersionStatus extends Disposable { this._ready = true; this.updateStatus(); }); + + this._register(this._client.onTsServerStarted(({ version }) => this.onDidChangeTypeScriptVersion(version))); } - public onDidChangeTypeScriptVersion(version: TypeScriptVersion) { + private onDidChangeTypeScriptVersion(version: TypeScriptVersion) { this._statusBarEntry.text = version.displayName; this._statusBarEntry.tooltip = version.path; this.updateStatus(); diff --git a/extensions/typescript-language-features/yarn.lock b/extensions/typescript-language-features/yarn.lock index 57e8c4c5f7d..14df7e9f12c 100644 --- a/extensions/typescript-language-features/yarn.lock +++ b/extensions/typescript-language-features/yarn.lock @@ -626,10 +626,10 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -typescript-vscode-sh-plugin@^0.6.13: - version "0.6.13" - resolved "https://registry.yarnpkg.com/typescript-vscode-sh-plugin/-/typescript-vscode-sh-plugin-0.6.13.tgz#96d92976c25d36dfa5761230a02f1b217046e947" - integrity sha512-hl6EkNtH90Cn6c5xAmvCn5YpvMzVedqMhUxxe+FWxX/xE0qT8ef1q2vyNlRnUGW95Q6A//5Yl07p9xkSrZi5hw== +typescript-vscode-sh-plugin@^0.6.14: + version "0.6.14" + resolved "https://registry.yarnpkg.com/typescript-vscode-sh-plugin/-/typescript-vscode-sh-plugin-0.6.14.tgz#a81031b502f6346a26ea49ce082438c3e353bb38" + integrity sha512-AkNlRBbI6K7gk29O92qthNSvc6jjmNQ6isVXoYxkFwPa8D04tIv2SOPd+sd+mNpso4tNdL2gy7nVtrd5yFqvlA== uri-js@^4.2.2: version "4.2.2" diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index 194fdd3b7f6..8b2f8c057e0 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -22,6 +22,8 @@ import { doesNotThrow, equal, ok, deepEqual, throws } from 'assert'; await config.update('windowsEnableConpty', false, ConfigurationTarget.Global); // Disable exit alerts as tests may trigger then and we're not testing the notifications await config.update('showExitAlert', false, ConfigurationTarget.Global); + // Canvas may cause problems when running in a container + await config.update('rendererType', 'dom', ConfigurationTarget.Global); }); suite('Terminal', () => { @@ -47,7 +49,7 @@ import { doesNotThrow, equal, ok, deepEqual, throws } from 'assert'; doesNotThrow(terminal.sendText.bind(terminal, 'echo "foo"')); }); - test('echo works in the default shell', (done) => { + (process.platform === 'linux' ? test.skip : test)('echo works in the default shell', (done) => { disposables.push(window.onDidOpenTerminal(term => { try { equal(terminal, term); @@ -67,7 +69,9 @@ import { doesNotThrow, equal, ok, deepEqual, throws } from 'assert'; if (data.indexOf(expected) !== 0) { dataDisposable.dispose(); terminal.dispose(); - disposables.push(window.onDidCloseTerminal(() => done())); + disposables.push(window.onDidCloseTerminal(() => { + done(); + })); } }); disposables.push(dataDisposable); diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts index d1d6f3e7fb4..ecc319f4106 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts @@ -4,10 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { workspace, window, commands, ViewColumn, TextEditorViewColumnChangeEvent, Uri, Selection, Position, CancellationTokenSource, TextEditorSelectionChangeKind } from 'vscode'; +import { workspace, window, commands, ViewColumn, TextEditorViewColumnChangeEvent, Uri, Selection, Position, CancellationTokenSource, TextEditorSelectionChangeKind, QuickPickItem, TextEditor } from 'vscode'; import { join } from 'path'; import { closeAllEditors, pathEquals, createRandomFile } from '../utils'; + suite('vscode API - window', () => { teardown(closeAllEditors); @@ -146,6 +147,20 @@ suite('vscode API - window', () => { }); test('active editor not always correct... #49125', async function () { + + function assertActiveEditor(editor: TextEditor) { + if (window.activeTextEditor === editor) { + assert.ok(true); + return; + } + function printEditor(editor: TextEditor): string { + return `doc: ${editor.document.uri.toString()}, column: ${editor.viewColumn}, active: ${editor === window.activeTextEditor}`; + } + const visible = window.visibleTextEditors.map(editor => printEditor(editor)); + assert.ok(false, `ACTIVE editor should be ${printEditor(editor)}, BUT HAVING ${visible.join(', ')}`); + + } + const randomFile1 = await createRandomFile(); const randomFile2 = await createRandomFile(); @@ -155,10 +170,10 @@ suite('vscode API - window', () => { ]); for (let c = 0; c < 4; c++) { let editorA = await window.showTextDocument(docA, ViewColumn.One); - assert.equal(window.activeTextEditor, editorA); + assertActiveEditor(editorA); let editorB = await window.showTextDocument(docB, ViewColumn.Two); - assert.equal(window.activeTextEditor, editorB); + assertActiveEditor(editorB); } }); @@ -383,33 +398,31 @@ suite('vscode API - window', () => { assert.equal(await two, 'notempty'); }); - // TODO@chrmarti Disabled due to flaky behaviour (https://github.com/Microsoft/vscode/issues/70887) - // test('showQuickPick, accept first', async function () { - // const pick = window.showQuickPick(['eins', 'zwei', 'drei']); - // await new Promise(resolve => setTimeout(resolve, 10)); // Allow UI to update. - // await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); - // assert.equal(await pick, 'eins'); - // }); - - test('showQuickPick, accept second', async function () { - const resolves: ((value: string) => void)[] = []; - let done: () => void; - const unexpected = new Promise((resolve, reject) => { - done = () => resolve(); - resolves.push(reject); - }); - const first = new Promise(resolve => resolves.push(resolve)); + test('showQuickPick, accept first', async function () { + const tracker = createQuickPickTracker(); + const first = tracker.nextItem(); const pick = window.showQuickPick(['eins', 'zwei', 'drei'], { - onDidSelectItem: item => resolves.pop()!(item as string) + onDidSelectItem: tracker.onDidSelectItem }); assert.equal(await first, 'eins'); - const second = new Promise(resolve => resolves.push(resolve)); + await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + assert.equal(await pick, 'eins'); + return tracker.done(); + }); + + test('showQuickPick, accept second', async function () { + const tracker = createQuickPickTracker(); + const first = tracker.nextItem(); + const pick = window.showQuickPick(['eins', 'zwei', 'drei'], { + onDidSelectItem: tracker.onDidSelectItem + }); + assert.equal(await first, 'eins'); + const second = tracker.nextItem(); await commands.executeCommand('workbench.action.quickOpenSelectNext'); assert.equal(await second, 'zwei'); await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); assert.equal(await pick, 'zwei'); - done!(); - return unexpected; + return tracker.done(); }); test('showQuickPick, select first two', async function () { @@ -438,19 +451,27 @@ suite('vscode API - window', () => { return unexpected; }); - // TODO@chrmarti Disabled due to flaky behaviour (https://github.com/Microsoft/vscode/issues/70887) - // test('showQuickPick, keep selection (Microsoft/vscode-azure-account#67)', async function () { - // const picks = window.showQuickPick([ - // { label: 'eins' }, - // { label: 'zwei', picked: true }, - // { label: 'drei', picked: true } - // ], { - // canPickMany: true - // }); - // await new Promise(resolve => setTimeout(resolve, 10)); // Allow UI to update. - // await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); - // assert.deepStrictEqual((await picks)!.map(pick => pick.label), ['zwei', 'drei']); - // }); + test('showQuickPick, keep selection (Microsoft/vscode-azure-account#67)', async function () { + const picks = window.showQuickPick([ + { label: 'eins' }, + { label: 'zwei', picked: true }, + { label: 'drei', picked: true } + ], { + canPickMany: true + }); + await new Promise(resolve => setTimeout(() => resolve(), 100)); + await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + if (await Promise.race([picks, new Promise(resolve => setTimeout(() => resolve(false), 100))]) === false) { + await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + if (await Promise.race([picks, new Promise(resolve => setTimeout(() => resolve(false), 1000))]) === false) { + await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + if (await Promise.race([picks, new Promise(resolve => setTimeout(() => resolve(false), 1000))]) === false) { + assert.ok(false, 'Picks not resolved!'); + } + } + } + assert.deepStrictEqual((await picks)!.map(pick => pick.label), ['zwei', 'drei']); + }); test('showQuickPick, undefined on cancel', function () { const source = new CancellationTokenSource(); @@ -521,20 +542,24 @@ suite('vscode API - window', () => { return Promise.all([a, b]); }); - // TODO@chrmarti Disabled due to flaky behaviour (https://github.com/Microsoft/vscode/issues/70887) - // test('showWorkspaceFolderPick', async function () { - // const p = window.showWorkspaceFolderPick(undefined); + test('showWorkspaceFolderPick', async function () { + const p = window.showWorkspaceFolderPick(undefined); - // await timeout(10); - // await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); - // try { - // await p; - // assert.ok(true); - // } - // catch (_error) { - // assert.ok(false); - // } - // }); + await new Promise(resolve => setTimeout(resolve, 10)); + await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + const r1 = await Promise.race([p, new Promise(resolve => setTimeout(() => resolve(false), 100))]); + if (r1 !== false) { + return; + } + await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + const r2 = await Promise.race([p, new Promise(resolve => setTimeout(() => resolve(false), 1000))]); + if (r2 !== false) { + return; + } + await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + const r3 = await Promise.race([p, new Promise(resolve => setTimeout(() => resolve(false), 1000))]); + assert.ok(r3 !== false); + }); test('Default value for showInput Box not accepted when it fails validateInput, reversing #33691', async function () { const result = window.showInputBox({ @@ -551,6 +576,23 @@ suite('vscode API - window', () => { assert.equal(await result, undefined); }); + function createQuickPickTracker() { + const resolves: ((value: T) => void)[] = []; + let done: () => void; + const unexpected = new Promise((resolve, reject) => { + done = () => resolve(); + resolves.push(reject); + }); + return { + onDidSelectItem: (item: T) => resolves.pop()!(item), + nextItem: () => new Promise(resolve => resolves.push(resolve)), + done: () => { + done!(); + return unexpected; + }, + }; + } + test('editor, selection change kind', () => { return workspace.openTextDocument(join(workspace.rootPath || '', './far.js')).then(doc => window.showTextDocument(doc)).then(editor => { diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts index 766a070138f..4ec107c23be 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { window, tasks, Disposable, TaskDefinition, Task, EventEmitter, CustomExecution, Pseudoterminal, TaskScope, commands, Task2, env, UIKind, ShellExecution } from 'vscode'; +import { window, tasks, Disposable, TaskDefinition, Task, EventEmitter, CustomExecution, Pseudoterminal, TaskScope, commands, Task2, env, UIKind, ShellExecution, TaskExecution, Terminal, Event } from 'vscode'; // Disable tasks tests: // - Web https://github.com/microsoft/vscode/issues/90528 @@ -28,26 +28,55 @@ import { window, tasks, Disposable, TaskDefinition, Task, EventEmitter, CustomEx const taskType: string = 'customTesting'; const taskName = 'First custom task'; let isPseudoterminalClosed = false; + let terminal: Terminal | undefined; + // There's a strict order that should be observed here: + // 1. The terminal opens + // 2. The terminal is written to. + // 3. The terminal is closed. + enum TestOrder { + Start, + TerminalOpened, + TerminalWritten, + TerminalClosed + } + + let testOrder = TestOrder.Start; + disposables.push(window.onDidOpenTerminal(term => { - disposables.push(window.onDidWriteTerminalData(e => { - try { - assert.equal(e.data, 'testing\r\n'); - } catch (e) { - done(e); - } - disposables.push(window.onDidCloseTerminal(() => { - try { - // Pseudoterminal.close should have fired by now, additionally we want - // to make sure all events are flushed before continuing with more tests - assert.ok(isPseudoterminalClosed); - } catch (e) { - done(e); - return; - } - done(); - })); - term.dispose(); - })); + try { + assert.equal(testOrder, TestOrder.Start); + } catch (e) { + done(e); + } + testOrder = TestOrder.TerminalOpened; + terminal = term; + })); + disposables.push(window.onDidWriteTerminalData(e => { + try { + assert.equal(testOrder, TestOrder.TerminalOpened); + testOrder = TestOrder.TerminalWritten; + assert.notEqual(terminal, undefined); + assert.equal(e.data, 'testing\r\n'); + } catch (e) { + done(e); + } + + if (terminal) { + terminal.dispose(); + } + })); + disposables.push(window.onDidCloseTerminal(() => { + try { + assert.equal(testOrder, TestOrder.TerminalWritten); + testOrder = TestOrder.TerminalClosed; + // Pseudoterminal.close should have fired by now, additionally we want + // to make sure all events are flushed before continuing with more tests + assert.ok(isPseudoterminalClosed); + } catch (e) { + done(e); + return; + } + done(); })); disposables.push(tasks.registerTaskProvider(taskType, { provideTasks: () => { @@ -138,35 +167,106 @@ import { window, tasks, Disposable, TaskDefinition, Task, EventEmitter, CustomEx commands.executeCommand('workbench.action.tasks.runTask', `${taskType}: ${taskName}`); }); - test('Execution from event is equal to original', () => { + test('Execution from onDidEndTaskProcess is equal to original', () => { return new Promise(async (resolve, reject) => { const task = new Task({ type: 'testTask' }, TaskScope.Workspace, 'echo', 'testTask', new ShellExecution('echo', ['hello test'])); - const taskExecution = await tasks.executeTask(task); - let equalCount = 2; - function checkEqualCount() { - equalCount--; - if (equalCount === 0) { - resolve(); - } else if (equalCount < 0) { - reject('Unexpected extra task events.'); - } - } + let taskExecution: TaskExecution | undefined; - tasks.onDidStartTaskProcess(e => { - if (e.execution === taskExecution) { - checkEqualCount(); - } else { + disposables.push(tasks.onDidStartTaskProcess(e => { + if (taskExecution === undefined) { + reject('taskExecution is still undefined when process started.'); + } else if (e.execution !== taskExecution) { reject('Unexpected task execution value in start process.'); } - }); + })); - tasks.onDidEndTaskProcess(e => { - if (e.execution === taskExecution) { - checkEqualCount(); + disposables.push(tasks.onDidEndTaskProcess(e => { + if (taskExecution === undefined) { + reject('taskExecution is still undefined when process ended.'); + } else if (e.execution === taskExecution) { + resolve(); } else { reject('Unexpected task execution value in end process.'); } - }); + })); + + taskExecution = await tasks.executeTask(task); + }); + }); + + test('Execution from onDidStartTaskProcess is equal to original', () => { + return new Promise(async (resolve, reject) => { + const task = new Task({ type: 'testTask' }, TaskScope.Workspace, 'echo', 'testTask', new ShellExecution('echo', ['hello test'])); + let taskExecution: TaskExecution | undefined; + + disposables.push(tasks.onDidStartTaskProcess(e => { + if (taskExecution === undefined) { + reject('taskExecution is still undefined when process started.'); + } else if (e.execution === taskExecution) { + resolve(); + } else { + reject('Unexpected task execution value in start process.'); + } + })); + + disposables.push(tasks.onDidEndTaskProcess(e => { + if (taskExecution === undefined) { + reject('taskExecution is still undefined when process ended.'); + } else if (e.execution !== taskExecution) { + reject('Unexpected task execution value in end process.'); + } + })); + + taskExecution = await tasks.executeTask(task); + }); + }); + + // https://github.com/microsoft/vscode/issues/100577 + test('A CustomExecution task can be fetched and executed', () => { + return new Promise(async (resolve, reject) => { + class CustomTerminal implements Pseudoterminal { + private readonly writeEmitter = new EventEmitter(); + public readonly onDidWrite: Event = this.writeEmitter.event; + public async close(): Promise { } + public open(): void { + this.close(); + resolve(); + } + } + + function buildTask(): Task { + const task = new Task( + { + type: 'customTesting', + }, + TaskScope.Workspace, + 'Test Task', + 'customTesting', + new CustomExecution( + async (): Promise => { + return new CustomTerminal(); + } + ) + ); + return task; + } + + disposables.push(tasks.registerTaskProvider('customTesting', { + provideTasks: () => { + return [buildTask()]; + }, + resolveTask(_task: Task): undefined { + return undefined; + } + })); + + const task = await tasks.fetchTasks({ type: 'customTesting' }); + + if (task && task.length > 0) { + await tasks.executeTask(task[0]); + } else { + reject('fetched task can\'t be undefined'); + } }); }); }); diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts index ff6a2418f4d..31b471570a1 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts @@ -60,12 +60,19 @@ suite('vscode API - workspace', () => { } }); - test('openTextDocument', () => { - let len = vscode.workspace.textDocuments.length; - return vscode.workspace.openTextDocument(join(vscode.workspace.rootPath || '', './simple.txt')).then(doc => { - assert.ok(doc); - assert.equal(vscode.workspace.textDocuments.length, len + 1); - }); + test('openTextDocument', async () => { + const uri = await createRandomFile(); + + // not yet there + const existing1 = vscode.workspace.textDocuments.find(doc => doc.uri.toString() === uri.toString()); + assert.equal(existing1, undefined); + + // open and assert its there + const doc = await vscode.workspace.openTextDocument(uri); + assert.ok(doc); + assert.equal(doc.uri.toString(), uri.toString()); + const existing2 = vscode.workspace.textDocuments.find(doc => doc.uri.toString() === uri.toString()); + assert.equal(existing2 === doc, true); }); test('openTextDocument, illegal path', () => { diff --git a/extensions/vscode-notebook-tests/src/notebook.test.ts b/extensions/vscode-notebook-tests/src/notebook.test.ts index 24485b62826..a7947d60224 100644 --- a/extensions/vscode-notebook-tests/src/notebook.test.ts +++ b/extensions/vscode-notebook-tests/src/notebook.test.ts @@ -56,7 +56,32 @@ async function splitEditor() { await once; } -suite('API tests', () => { +suite('Notebook API tests', () => { + // test.only('crash', async function () { + // for (let i = 0; i < 200; i++) { + // let resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); + // await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + // await vscode.commands.executeCommand('workbench.action.revertAndCloseActiveEditor'); + + // resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './empty.vsctestnb')); + // await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + // await vscode.commands.executeCommand('workbench.action.revertAndCloseActiveEditor'); + // } + // }); + + // test.only('crash', async function () { + // for (let i = 0; i < 200; i++) { + // let resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); + // await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + // await vscode.commands.executeCommand('workbench.action.files.save'); + // await vscode.commands.executeCommand('workbench.action.closeAllEditors'); + // resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './empty.vsctestnb')); + // await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + // await vscode.commands.executeCommand('workbench.action.files.save'); + // await vscode.commands.executeCommand('workbench.action.closeAllEditors'); + // } + // }); + test('document open/close event', async function () { const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); const firstDocumentOpen = getEventOncePromise(vscode.notebook.onDidOpenNotebookDocument); @@ -222,6 +247,13 @@ suite('API tests', () => { await vscode.commands.executeCommand('workbench.action.files.save'); await vscode.commands.executeCommand('workbench.action.closeAllEditors'); + + await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + const firstEditor = vscode.notebook.activeNotebookEditor; + assert.equal(firstEditor?.document.cells.length, 1); + + await vscode.commands.executeCommand('workbench.action.files.save'); + await vscode.commands.executeCommand('workbench.action.closeAllEditors'); }); test('notebook editor active/visible', async function () { @@ -290,7 +322,7 @@ suite('API tests', () => { assert.equal(cellChangeEventRet.changes[0].items[0], vscode.notebook.activeNotebookEditor!.document.cells[1]); await vscode.commands.executeCommand('workbench.action.files.save'); - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); + await vscode.commands.executeCommand('workbench.action.closeAllEditors'); }); test('initialzation should not emit cell change events.', async function () { @@ -568,49 +600,113 @@ suite('notebook undo redo', () => { await vscode.commands.executeCommand('workbench.action.files.save'); await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); }); + + test.skip('execute and then undo redo', async function () { + const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); + await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + + const cellsChangeEvent = getEventOncePromise(vscode.notebook.onDidChangeNotebookCells); + await vscode.commands.executeCommand('notebook.cell.insertCodeCellBelow'); + const cellChangeEventRet = await cellsChangeEvent; + assert.equal(cellChangeEventRet.document, vscode.notebook.activeNotebookEditor?.document); + assert.equal(cellChangeEventRet.changes.length, 1); + assert.deepEqual(cellChangeEventRet.changes[0], { + start: 1, + deletedCount: 0, + deletedItems: [], + items: [ + vscode.notebook.activeNotebookEditor!.document.cells[1] + ] + }); + + const secondCell = vscode.notebook.activeNotebookEditor!.document.cells[1]; + + const moveCellEvent = getEventOncePromise(vscode.notebook.onDidChangeNotebookCells); + await vscode.commands.executeCommand('notebook.cell.moveUp'); + const moveCellEventRet = await moveCellEvent; + assert.deepEqual(moveCellEventRet, { + document: vscode.notebook.activeNotebookEditor!.document, + changes: [ + { + start: 1, + deletedCount: 1, + deletedItems: [secondCell], + items: [] + }, + { + start: 0, + deletedCount: 0, + deletedItems: [], + items: [vscode.notebook.activeNotebookEditor?.document.cells[0]] + } + ] + }); + + const cellOutputChange = getEventOncePromise(vscode.notebook.onDidChangeCellOutputs); + await vscode.commands.executeCommand('notebook.cell.execute'); + const cellOutputsAddedRet = await cellOutputChange; + assert.deepEqual(cellOutputsAddedRet, { + document: vscode.notebook.activeNotebookEditor!.document, + cells: [vscode.notebook.activeNotebookEditor!.document.cells[0]] + }); + assert.equal(cellOutputsAddedRet.cells[0].outputs.length, 1); + + const cellOutputClear = getEventOncePromise(vscode.notebook.onDidChangeCellOutputs); + await vscode.commands.executeCommand('notebook.undo'); + const cellOutputsCleardRet = await cellOutputClear; + assert.deepEqual(cellOutputsCleardRet, { + document: vscode.notebook.activeNotebookEditor!.document, + cells: [vscode.notebook.activeNotebookEditor!.document.cells[0]] + }); + assert.equal(cellOutputsAddedRet.cells[0].outputs.length, 0); + + await vscode.commands.executeCommand('workbench.action.files.save'); + await vscode.commands.executeCommand('workbench.action.closeAllEditors'); + }); + }); suite('notebook working copy', () => { - test('notebook revert on close', async function () { - const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); - await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); - await vscode.commands.executeCommand('notebook.cell.insertCodeCellBelow'); - assert.equal(vscode.notebook.activeNotebookEditor!.selection?.document.getText(), ''); + // test('notebook revert on close', async function () { + // const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); + // await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + // await vscode.commands.executeCommand('notebook.cell.insertCodeCellBelow'); + // assert.equal(vscode.notebook.activeNotebookEditor!.selection?.document.getText(), ''); - await vscode.commands.executeCommand('notebook.cell.insertCodeCellAbove'); - await vscode.commands.executeCommand('default:type', { text: 'var abc = 0;' }); + // await vscode.commands.executeCommand('notebook.cell.insertCodeCellAbove'); + // await vscode.commands.executeCommand('default:type', { text: 'var abc = 0;' }); - // close active editor from command will revert the file - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); - await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); - assert.equal(vscode.notebook.activeNotebookEditor !== undefined, true); - assert.equal(vscode.notebook.activeNotebookEditor?.selection !== undefined, true); - assert.deepEqual(vscode.notebook.activeNotebookEditor?.document.cells[0], vscode.notebook.activeNotebookEditor?.selection); - assert.equal(vscode.notebook.activeNotebookEditor?.selection?.document.getText(), 'test'); + // // close active editor from command will revert the file + // await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); + // await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + // assert.equal(vscode.notebook.activeNotebookEditor !== undefined, true); + // assert.equal(vscode.notebook.activeNotebookEditor?.selection !== undefined, true); + // assert.deepEqual(vscode.notebook.activeNotebookEditor?.document.cells[0], vscode.notebook.activeNotebookEditor?.selection); + // assert.equal(vscode.notebook.activeNotebookEditor?.selection?.document.getText(), 'test'); - await vscode.commands.executeCommand('workbench.action.files.save'); - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); - }); + // await vscode.commands.executeCommand('workbench.action.files.save'); + // await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); + // }); - test('notebook revert', async function () { - const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); - await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); - await vscode.commands.executeCommand('notebook.cell.insertCodeCellBelow'); - assert.equal(vscode.notebook.activeNotebookEditor!.selection?.document.getText(), ''); + // test('notebook revert', async function () { + // const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); + // await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + // await vscode.commands.executeCommand('notebook.cell.insertCodeCellBelow'); + // assert.equal(vscode.notebook.activeNotebookEditor!.selection?.document.getText(), ''); - await vscode.commands.executeCommand('notebook.cell.insertCodeCellAbove'); - await vscode.commands.executeCommand('default:type', { text: 'var abc = 0;' }); - await vscode.commands.executeCommand('workbench.action.files.revert'); + // await vscode.commands.executeCommand('notebook.cell.insertCodeCellAbove'); + // await vscode.commands.executeCommand('default:type', { text: 'var abc = 0;' }); + // await vscode.commands.executeCommand('workbench.action.files.revert'); - assert.equal(vscode.notebook.activeNotebookEditor !== undefined, true); - assert.equal(vscode.notebook.activeNotebookEditor?.selection !== undefined, true); - assert.deepEqual(vscode.notebook.activeNotebookEditor?.document.cells[0], vscode.notebook.activeNotebookEditor?.selection); - assert.deepEqual(vscode.notebook.activeNotebookEditor?.document.cells.length, 1); - assert.equal(vscode.notebook.activeNotebookEditor?.selection?.document.getText(), 'test'); + // assert.equal(vscode.notebook.activeNotebookEditor !== undefined, true); + // assert.equal(vscode.notebook.activeNotebookEditor?.selection !== undefined, true); + // assert.deepEqual(vscode.notebook.activeNotebookEditor?.document.cells[0], vscode.notebook.activeNotebookEditor?.selection); + // assert.deepEqual(vscode.notebook.activeNotebookEditor?.document.cells.length, 1); + // assert.equal(vscode.notebook.activeNotebookEditor?.selection?.document.getText(), 'test'); - await vscode.commands.executeCommand('workbench.action.files.saveAll'); - await vscode.commands.executeCommand('workbench.action.closeAllEditors'); - }); + // await vscode.commands.executeCommand('workbench.action.files.saveAll'); + // await vscode.commands.executeCommand('workbench.action.closeAllEditors'); + // }); test('multiple tabs: dirty + clean', async function () { const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); @@ -702,6 +798,9 @@ suite('metadata', () => { assert.equal(vscode.notebook.activeNotebookEditor!.document.metadata.custom!['testMetadata'] as boolean, false); assert.equal(vscode.notebook.activeNotebookEditor!.selection?.metadata.custom!['testCellMetadata'] as number, 123); assert.equal(vscode.notebook.activeNotebookEditor!.selection?.language, 'typescript'); + + await vscode.commands.executeCommand('workbench.action.files.saveAll'); + await vscode.commands.executeCommand('workbench.action.closeAllEditors'); }); @@ -713,10 +812,14 @@ suite('metadata', () => { assert.equal(vscode.notebook.activeNotebookEditor!.selection?.metadata.custom!['testCellMetadata'] as number, 123); assert.equal(vscode.notebook.activeNotebookEditor!.selection?.language, 'typescript'); - await vscode.commands.executeCommand('notebook.cell.copyDown'); - const activeCell = vscode.notebook.activeNotebookEditor!.selection; - assert.equal(vscode.notebook.activeNotebookEditor!.document.cells.indexOf(activeCell!), 1); - assert.equal(activeCell?.metadata.custom!['testCellMetadata'] as number, 123); + // TODO see #101462 + // await vscode.commands.executeCommand('notebook.cell.copyDown'); + // const activeCell = vscode.notebook.activeNotebookEditor!.selection; + // assert.equal(vscode.notebook.activeNotebookEditor!.document.cells.indexOf(activeCell!), 1); + // assert.equal(activeCell?.metadata.custom!['testCellMetadata'] as number, 123); + + await vscode.commands.executeCommand('workbench.action.files.saveAll'); + await vscode.commands.executeCommand('workbench.action.closeAllEditors'); }); }); @@ -744,7 +847,7 @@ suite('regression', () => { await vscode.commands.executeCommand('vscode.openWith', resource, 'default'); assert.equal(vscode.window.activeTextEditor?.document.uri.path, resource.path); - await vscode.commands.executeCommand('workbench.action.files.saveAll'); + await vscode.commands.executeCommand('workbench.action.revertAndCloseActiveEditor'); await vscode.commands.executeCommand('workbench.action.closeAllEditors'); }); @@ -760,7 +863,7 @@ suite('regression', () => { assert.notEqual(vscode.notebook.activeNotebookEditor, undefined, 'notebook first'); assert.notEqual(vscode.window.activeTextEditor, undefined); - // await vscode.commands.executeCommand('workbench.action.files.saveAll'); + await vscode.commands.executeCommand('workbench.action.revertAndCloseActiveEditor'); await vscode.commands.executeCommand('workbench.action.closeAllEditors'); }); diff --git a/extensions/vscode-notebook-tests/src/notebookSmokeTestMain.ts b/extensions/vscode-notebook-tests/src/notebookSmokeTestMain.ts index 0a8c4a3d105..05c87a16687 100644 --- a/extensions/vscode-notebook-tests/src/notebookSmokeTestMain.ts +++ b/extensions/vscode-notebook-tests/src/notebookSmokeTestMain.ts @@ -50,11 +50,20 @@ export function smokeTestActivate(context: vscode.ExtensionContext): any { return dto; }, + resolveNotebook: async (_document: vscode.NotebookDocument) => { + return; + }, saveNotebook: async (_document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => { return; }, saveNotebookAs: async (_targetResource: vscode.Uri, _document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => { return; + }, + backupNotebook: async (_document: vscode.NotebookDocument, _context: vscode.NotebookDocumentBackupContext, _cancellation: vscode.CancellationToken) => { + return { + id: '1', + delete: () => { } + }; } })); diff --git a/extensions/vscode-notebook-tests/src/notebookTestMain.ts b/extensions/vscode-notebook-tests/src/notebookTestMain.ts index 059f998acae..33dd2960fda 100644 --- a/extensions/vscode-notebook-tests/src/notebookTestMain.ts +++ b/extensions/vscode-notebook-tests/src/notebookTestMain.ts @@ -10,8 +10,10 @@ import { smokeTestActivate } from './notebookSmokeTestMain'; export function activate(context: vscode.ExtensionContext): any { smokeTestActivate(context); + const _onDidChangeNotebook = new vscode.EventEmitter(); + context.subscriptions.push(_onDidChangeNotebook); context.subscriptions.push(vscode.notebook.registerNotebookContentProvider('notebookCoreTest', { - onDidChangeNotebook: new vscode.EventEmitter().event, + onDidChangeNotebook: _onDidChangeNotebook.event, openNotebook: async (_resource: vscode.Uri) => { if (_resource.path.endsWith('empty.vsctestnb')) { return { @@ -41,11 +43,20 @@ export function activate(context: vscode.ExtensionContext): any { return dto; }, + resolveNotebook: async (_document: vscode.NotebookDocument) => { + return; + }, saveNotebook: async (_document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => { return; }, saveNotebookAs: async (_targetResource: vscode.Uri, _document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => { return; + }, + backupNotebook: async (_document: vscode.NotebookDocument, _context: vscode.NotebookDocumentBackupContext, _cancellation: vscode.CancellationToken) => { + return { + id: '1', + delete: () => { } + }; } })); @@ -62,13 +73,13 @@ export function activate(context: vscode.ExtensionContext): any { }]; return; }, - executeCell: async (_document: vscode.NotebookDocument, _cell: vscode.NotebookCell | undefined, _token: vscode.CancellationToken) => { - if (!_cell) { - _cell = _document.cells[0]; + executeCell: async (document: vscode.NotebookDocument, cell: vscode.NotebookCell | undefined, _token: vscode.CancellationToken) => { + if (!cell) { + cell = document.cells[0]; } - if (_document.uri.path.endsWith('customRenderer.vsctestnb')) { - _cell.outputs = [{ + if (document.uri.path.endsWith('customRenderer.vsctestnb')) { + cell.outputs = [{ outputKind: vscode.CellOutputKind.Rich, data: { 'text/custom': 'test' @@ -78,26 +89,41 @@ export function activate(context: vscode.ExtensionContext): any { return; } - _cell.outputs = [{ + const previousOutputs = cell.outputs; + const newOutputs: vscode.CellOutput[] = [{ outputKind: vscode.CellOutputKind.Rich, data: { 'text/plain': ['my output'] } }]; + cell.outputs = newOutputs; + + _onDidChangeNotebook.fire({ + document: document, + undo: () => { + if (cell) { + cell.outputs = previousOutputs; + } + }, + redo: () => { + if (cell) { + cell.outputs = newOutputs; + } + } + }); return; } })); const preloadUri = vscode.Uri.file(path.resolve(__dirname, '../src/customRenderer.js')); context.subscriptions.push(vscode.notebook.registerNotebookOutputRenderer('notebookCoreTestRenderer', { - type: 'display_data', - subTypes: [ + mimeTypes: [ 'text/custom' ] }, { preloads: [preloadUri], - render(_document: vscode.NotebookDocument, _output: vscode.CellDisplayOutput, _mimeType: string): string { + render(_document: vscode.NotebookDocument, _request: vscode.NotebookRenderRequest): string { return '
test
'; } })); diff --git a/extensions/vscode-web-playground/extension-browser.webpack.config.js b/extensions/vscode-web-playground/extension-browser.webpack.config.js index 0ade8d79e31..dfd50aeff96 100644 --- a/extensions/vscode-web-playground/extension-browser.webpack.config.js +++ b/extensions/vscode-web-playground/extension-browser.webpack.config.js @@ -7,11 +7,10 @@ 'use strict'; const path = require('path'); -const withDefaults = require('../shared.webpack.config'); +const withBrowserDefaults = require('../shared.webpack.config').browser; -module.exports = withDefaults({ +module.exports = withBrowserDefaults({ context: __dirname, - target: 'webworker', node: false, entry: { extension: './src/extension.ts', diff --git a/extensions/vscode-web-playground/package.json b/extensions/vscode-web-playground/package.json index 7d48eca66c9..954aec0fae9 100644 --- a/extensions/vscode-web-playground/package.json +++ b/extensions/vscode-web-playground/package.json @@ -11,7 +11,7 @@ "onFileSystem:github", "onDebug" ], - "browser": "./dist/extension", + "browser": "./dist/browser/extension", "main": "./out/extension", "engines": { "vscode": "^1.25.0" diff --git a/extensions/vscode-web-playground/src/extension.ts b/extensions/vscode-web-playground/src/extension.ts index 7b8b293f3a5..1d5df92bbcc 100644 --- a/extensions/vscode-web-playground/src/extension.ts +++ b/extensions/vscode-web-playground/src/extension.ts @@ -15,10 +15,10 @@ import * as vscode from 'vscode'; import { MemFS } from './memfs'; -declare const window: unknown; +declare const navigator: unknown; export function activate(context: vscode.ExtensionContext) { - if (typeof window !== 'undefined') { // do not run under node.js + if (typeof navigator === 'object') { // do not run under node.js const memFs = enableFs(context); if (vscode.workspace.workspaceFolders?.some(f => f.uri.scheme === MemFS.scheme)) { diff --git a/extensions/yarn.lock b/extensions/yarn.lock index f2c40c9f91f..d41a4ab48b5 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -76,10 +76,10 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -typescript@3.9.4: - version "3.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.4.tgz#5aa0a54904b51b96dfd67870ce2db70251802f10" - integrity sha512-9OL+r0KVHqsYVH7K18IBR9hhC82YwLNlpSZfQDupGcfg8goB9p/s/9Okcy+ztnTeHR2U68xq21/igW9xpoGTgA== +typescript@3.9.6: + version "3.9.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" + integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== wrappy@1: version "1.0.2" diff --git a/package.json b/package.json index bd9b3997a67..19c54d9f9c7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", - "version": "1.47.0", - "distro": "4eca5644666fe6fde9d765e71d0ca870f3c076a6", + "version": "1.48.0", + "distro": "805dcb641373964d569e29bb3ff662f8d3cda469", "author": { "name": "Microsoft Corporation" }, @@ -14,11 +14,15 @@ "preinstall": "node build/npm/preinstall.js", "postinstall": "node build/npm/postinstall.js", "compile": "gulp compile --max_old_space_size=4095", - "watch": "gulp watch --max_old_space_size=4095", + "watch": "concurrently \"npm:watch-client\" \"npm:watch-extensions\"", "watchd": "deemon yarn watch", + "watch-webd": "deemon yarn watch-web", "kill-watchd": "deemon --kill yarn watch", + "kill-watch-webd": "deemon --kill yarn watch-web", "restart-watchd": "deemon --restart yarn watch", + "restart-watch-webd": "deemon --restart yarn watch-web", "watch-client": "gulp watch-client --max_old_space_size=4095", + "watch-extensions": "gulp watch-extensions --max_old_space_size=4095", "mocha": "mocha test/unit/node/all.js --delay", "precommit": "node build/gulpfile.hygiene.js", "gulp": "gulp --max_old_space_size=8192", @@ -33,6 +37,8 @@ "strict-function-types-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictFunctionTypes", "update-distro": "node build/npm/update-distro.js", "web": "node resources/serverless/code-web.js", + "compile-web": "gulp compile-web --max_old_space_size=4095", + "watch-web": "gulp watch-web --max_old_space_size=4095", "eslint": "eslint -c .eslintrc.json --rulesdir ./build/lib/eslint --ext .ts --ext .js ./src/vs ./extensions" }, "dependencies": { @@ -41,24 +47,24 @@ "graceful-fs": "4.2.3", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.3", - "iconv-lite": "0.5.0", - "jschardet": "2.1.1", + "iconv-lite-umd": "0.6.5", + "jschardet": "2.2.1", "keytar": "^5.5.0", "minimist": "^1.2.5", "native-is-elevated": "0.4.1", "native-keymap": "2.1.2", "native-watchdog": "1.3.0", "node-pty": "0.10.0-beta8", - "semver-umd": "^5.5.6", + "semver-umd": "^5.5.7", "spdlog": "^0.11.1", "sudo-prompt": "9.1.1", "v8-inspect-profiler": "^0.0.20", "vscode-nsfw": "1.2.8", "vscode-oniguruma": "1.3.1", "vscode-proxy-agent": "^0.5.2", - "vscode-ripgrep": "^1.5.8", + "vscode-ripgrep": "^1.7.0", "vscode-sqlite3": "4.0.10", - "vscode-textmate": "5.1.1", + "vscode-textmate": "5.2.0", "xterm": "4.7.0-beta.3", "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", @@ -74,7 +80,6 @@ "@types/debug": "^4.1.5", "@types/graceful-fs": "4.1.2", "@types/http-proxy-agent": "^2.0.1", - "@types/iconv-lite": "0.0.1", "@types/keytar": "^4.4.0", "@types/minimist": "^1.2.0", "@types/mocha": "2.2.39", @@ -88,18 +93,18 @@ "@types/winreg": "^1.2.30", "@types/yauzl": "^2.9.1", "@types/yazl": "^2.4.2", - "@typescript-eslint/eslint-plugin": "3.1.0", - "@typescript-eslint/parser": "^3.1.0", + "@typescript-eslint/eslint-plugin": "3.2.0", + "@typescript-eslint/parser": "^3.3.0", "ansi-colors": "^3.2.3", "asar": "^0.14.0", "chromium-pickle-js": "^0.2.0", + "concurrently": "^5.2.0", "copy-webpack-plugin": "^4.5.2", - "coveralls": "^2.11.11", "cson-parser": "^1.3.3", "css-loader": "^3.2.0", "debounce": "^1.0.0", "deemon": "^1.4.0", - "electron": "7.3.1", + "electron": "7.3.2", "eslint": "6.8.0", "eslint-plugin-jsdoc": "^19.1.0", "event-stream": "3.3.4", @@ -154,7 +159,7 @@ "source-map": "^0.4.4", "style-loader": "^1.0.0", "ts-loader": "^4.4.2", - "typescript": "^3.9.3", + "typescript": "^4.0.0-dev.20200629", "typescript-formatter": "7.1.0", "underscore": "^1.8.2", "vinyl": "^2.0.0", @@ -162,9 +167,9 @@ "vsce": "1.48.0", "vscode-debugprotocol": "1.41.0", "vscode-nls-dev": "^3.3.1", - "webpack": "^4.16.5", - "webpack-cli": "^3.3.8", - "webpack-stream": "^5.1.1", + "webpack": "^4.43.0", + "webpack-cli": "^3.3.12", + "webpack-stream": "^5.2.1", "yaserver": "^0.2.0" }, "repository": { diff --git a/product.json b/product.json index d586d2fc067..79affc51286 100644 --- a/product.json +++ b/product.json @@ -30,7 +30,7 @@ "builtInExtensions": [ { "name": "ms-vscode.node-debug", - "version": "1.44.6", + "version": "1.44.7", "repo": "https://github.com/Microsoft/vscode-node-debug", "metadata": { "id": "b6ded8fb-a0a0-4c1c-acbd-ab2a3bc995a6", @@ -45,7 +45,7 @@ }, { "name": "ms-vscode.node-debug2", - "version": "1.42.4", + "version": "1.42.5", "repo": "https://github.com/Microsoft/vscode-node-debug2", "metadata": { "id": "36d19e17-7569-4841-a001-947eb18602b2", @@ -60,7 +60,7 @@ }, { "name": "ms-vscode.references-view", - "version": "0.0.57", + "version": "0.0.60", "repo": "https://github.com/Microsoft/vscode-reference-view", "metadata": { "id": "dc489f46-520d-4556-ae85-1f9eab3c412d", @@ -90,7 +90,7 @@ }, { "name": "ms-vscode.js-debug", - "version": "1.46.1", + "version": "1.47.2", "repo": "https://github.com/Microsoft/vscode-js-debug", "metadata": { "id": "25629058-ddac-4e17-abba-74678e126c5d", diff --git a/remote/package.json b/remote/package.json index cba584d935d..69dd3eda9b0 100644 --- a/remote/package.json +++ b/remote/package.json @@ -8,18 +8,18 @@ "graceful-fs": "4.2.3", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.3", - "iconv-lite": "0.5.0", - "jschardet": "2.1.1", + "iconv-lite-umd": "0.6.5", + "jschardet": "2.2.1", "minimist": "^1.2.5", "native-watchdog": "1.3.0", "node-pty": "0.10.0-beta8", - "semver-umd": "^5.5.6", + "semver-umd": "^5.5.7", "spdlog": "^0.11.1", "vscode-nsfw": "1.2.8", "vscode-oniguruma": "1.3.1", "vscode-proxy-agent": "^0.5.2", - "vscode-ripgrep": "^1.5.8", - "vscode-textmate": "5.1.1", + "vscode-ripgrep": "^1.7.0", + "vscode-textmate": "5.2.0", "xterm": "4.7.0-beta.3", "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", diff --git a/remote/web/package.json b/remote/web/package.json index 5a4ef271910..7bc429e56fb 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -2,9 +2,11 @@ "name": "vscode-web", "version": "0.0.0", "dependencies": { - "semver-umd": "^5.5.6", + "iconv-lite-umd": "0.6.5", + "jschardet": "2.2.1", + "semver-umd": "^5.5.7", "vscode-oniguruma": "1.3.1", - "vscode-textmate": "5.1.1", + "vscode-textmate": "5.2.0", "xterm": "4.7.0-beta.3", "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", diff --git a/remote/web/yarn.lock b/remote/web/yarn.lock index fa3681e1a98..fc0ba030177 100644 --- a/remote/web/yarn.lock +++ b/remote/web/yarn.lock @@ -2,20 +2,30 @@ # yarn lockfile v1 -semver-umd@^5.5.6: - version "5.5.6" - resolved "https://registry.yarnpkg.com/semver-umd/-/semver-umd-5.5.6.tgz#1d185bbd2caec825c564b54907cd09e14083f228" - integrity sha512-6ARYXVi4Y4VO5HfyCjT/6xyykBtJwEXSGQ8ON4UPQSFOjZUDsbAE0J614QcBBsLTTyQMEqvsXN804vAqpydjzw== +iconv-lite-umd@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.5.tgz#6a1f621a3b4d125f72feff813a9839e1ebd6c722" + integrity sha512-WDegH4al+e3n3jTOStRvm+jzDA3JMUQGgzdAsMxAgcgB0Oi72HjfdsoX08ieKsy3rKexXVjWZr41aOIUaCZnMg== + +jschardet@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.2.1.tgz#03b0264669a90c7a5c436a68c5a7d4e4cb0c9823" + integrity sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw== + +semver-umd@^5.5.7: + version "5.5.7" + resolved "https://registry.yarnpkg.com/semver-umd/-/semver-umd-5.5.7.tgz#966beb5e96c7da6fbf09c3da14c2872d6836c528" + integrity sha512-XgjPNlD0J6aIc8xoTN6GQGwWc2Xg0kq8NzrqMVuKG/4Arl6ab1F8+Am5Y/XKKCR+FceFr2yN/Uv5ZJBhRyRqKg== vscode-oniguruma@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.3.1.tgz#e2383879c3485b19f533ec34efea9d7a2b14be8f" integrity sha512-gz6ZBofA7UXafVA+m2Yt2zHKgXC2qedArprIsHAPKByTkwq9l5y/izAGckqxYml7mSbYxTRTfdRwsFq3cwF4LQ== -vscode-textmate@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.1.1.tgz#d88dbf271bee7cede455a21bd4894ba5724a4a7e" - integrity sha512-5VHjF+Fglf9d2JI5OyQ7FHutK6/29G0qYyD920K0SWO7uY8JTWbqyKAHEtfB/ZDk2fOe/E23n3wz9fHXKi63yg== +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== xterm-addon-search@0.7.0: version "0.7.0" diff --git a/remote/yarn.lock b/remote/yarn.lock index 7ba3b88854f..53550b20fc6 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -9,6 +9,11 @@ agent-base@4: dependencies: es6-promisify "^5.0.0" +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -91,6 +96,13 @@ debug@3.1.0, debug@^3.1.0: dependencies: ms "2.0.0" +debug@4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + diagnostic-channel-publishers@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3" @@ -176,12 +188,18 @@ https-proxy-agent@^2.2.3: agent-base "^4.3.0" debug "^3.1.0" -iconv-lite@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550" - integrity sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw== +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== dependencies: - safer-buffer ">= 2.1.2 < 3" + agent-base "5" + debug "4" + +iconv-lite-umd@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.5.tgz#6a1f621a3b4d125f72feff813a9839e1ebd6c722" + integrity sha512-WDegH4al+e3n3jTOStRvm+jzDA3JMUQGgzdAsMxAgcgB0Oi72HjfdsoX08ieKsy3rKexXVjWZr41aOIUaCZnMg== ip@^1.1.5: version "1.1.5" @@ -212,10 +230,10 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -jschardet@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.1.1.tgz#af6f8fd0b3b0f5d46a8fd9614a4fce490575c184" - integrity sha512-pA5qG9Zwm8CBpGlK/lo2GE9jPxwqRgMV7Lzc/1iaPccw6v4Rhj8Zg2BTyrdmHmxlJojnbLupLeRnaPLsq03x6Q== +jschardet@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.2.1.tgz#03b0264669a90c7a5c436a68c5a7d4e4cb0c9823" + integrity sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw== jsonfile@^4.0.0: version "4.0.0" @@ -256,6 +274,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + nan@^2.10.0, nan@^2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -293,6 +316,11 @@ picomatch@^2.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + readdirp@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" @@ -300,15 +328,10 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver-umd@^5.5.6: - version "5.5.6" - resolved "https://registry.yarnpkg.com/semver-umd/-/semver-umd-5.5.6.tgz#1d185bbd2caec825c564b54907cd09e14083f228" - integrity sha512-6ARYXVi4Y4VO5HfyCjT/6xyykBtJwEXSGQ8ON4UPQSFOjZUDsbAE0J614QcBBsLTTyQMEqvsXN804vAqpydjzw== +semver-umd@^5.5.7: + version "5.5.7" + resolved "https://registry.yarnpkg.com/semver-umd/-/semver-umd-5.5.7.tgz#966beb5e96c7da6fbf09c3da14c2872d6836c528" + integrity sha512-XgjPNlD0J6aIc8xoTN6GQGwWc2Xg0kq8NzrqMVuKG/4Arl6ab1F8+Am5Y/XKKCR+FceFr2yN/Uv5ZJBhRyRqKg== semver@^5.3.0: version "5.6.0" @@ -382,15 +405,18 @@ vscode-proxy-agent@^0.5.2: https-proxy-agent "^2.2.3" socks-proxy-agent "^4.0.1" -vscode-ripgrep@^1.5.8: - version "1.5.8" - resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.5.8.tgz#32cb33da6d1a9ca8f5de8c2813ed5114fd55fc11" - integrity sha512-l6Pv/t1Jk63RU+kEkMO04XxnNRYdyzuesizj9AzFpcfrUxxpAjEJBK1qO9Mov30UUGZl7uDUBn+uCv9koaHPPA== +vscode-ripgrep@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.7.0.tgz#ec912e04aa29f7d73bcef04b7576b792f12c9b38" + integrity sha512-sQY/u0ymc9YMiPaSsMmdZSFQ6PTS2UxcGuiQkF7aoIezDxZcGE1sMarqftWEl9wYWYc9hElYm00WpoFgzj1oUg== + dependencies: + https-proxy-agent "^4.0.0" + proxy-from-env "^1.1.0" -vscode-textmate@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.1.1.tgz#d88dbf271bee7cede455a21bd4894ba5724a4a7e" - integrity sha512-5VHjF+Fglf9d2JI5OyQ7FHutK6/29G0qYyD920K0SWO7uY8JTWbqyKAHEtfB/ZDk2fOe/E23n3wz9fHXKi63yg== +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== vscode-windows-ca-certs@0.2.0: version "0.2.0" diff --git a/resources/linux/bin/code.sh b/resources/linux/bin/code.sh index e85625efd2d..06973937f14 100755 --- a/resources/linux/bin/code.sh +++ b/resources/linux/bin/code.sh @@ -1,28 +1,36 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh # # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # test that VSCode wasn't installed inside WSL if grep -qi Microsoft /proc/version && [ -z "$DONT_PROMPT_WSL_INSTALL" ]; then - echo "To use VS Code with the Windows Subsystem for Linux, please install VS Code in Windows and uninstall the Linux version in WSL. You can then use the '@@PRODNAME@@' command in a WSL terminal just as you would in a normal command prompt." 1>&2 - read -e -p "Do you want to continue anyways ? [y/N] " YN - - [[ $YN == "n" || $YN == "N" || $YN == "" ]] && exit 1 - echo "To no longer see this prompt, start @@PRODNAME@@ with the environment variable DONT_PROMPT_WSL_INSTALL defined." + echo "To use @@PRODNAME@@ with the Windows Subsystem for Linux, please install @@PRODNAME@@ in Windows and uninstall the Linux version in WSL. You can then use the \`@@NAME@@\` command in a WSL terminal just as you would in a normal command prompt." 1>&2 + printf "Do you want to continue anyway? [y/N] " 1>&2 + read -r YN + YN=$(printf '%s' "$YN" | tr '[:upper:]' '[:lower:]') + case "$YN" in + y | yes ) + ;; + * ) + exit 1 + ;; + esac + echo "To no longer see this prompt, start @@PRODNAME@@ with the environment variable DONT_PROMPT_WSL_INSTALL defined." 1>&2 fi - # If root, ensure that --user-data-dir or --file-write is specified if [ "$(id -u)" = "0" ]; then - for i in $@ + for i in "$@" do - if [[ $i == --user-data-dir || $i == --user-data-dir=* || $i == --file-write ]]; then - CAN_LAUNCH_AS_ROOT=1 - fi + case "$i" in + --user-data-dir | --user-data-dir=* | --file-write ) + CAN_LAUNCH_AS_ROOT=1 + ;; + esac done if [ -z $CAN_LAUNCH_AS_ROOT ]; then - echo "You are trying to start vscode as a super user which is not recommended. If you really want to, you must specify an alternate user data directory using the --user-data-dir argument." 1>&2 + echo "You are trying to start @@PRODNAME@@ as a super user which isn't recommended. If this was intended, please specify an alternate user data directory using the \`--user-data-dir\` argument." 1>&2 exit 1 fi fi @@ -33,7 +41,7 @@ if [ ! -L "$0" ]; then else if command -v readlink >/dev/null; then # if readlink exists, follow the symlink and find relatively - VSCODE_PATH="$(dirname $(readlink -f "$0"))/.." + VSCODE_PATH="$(dirname "$(readlink -f "$0")")/.." else # else use the standard install location VSCODE_PATH="/usr/share/@@NAME@@" diff --git a/resources/linux/snap/snapcraft.yaml b/resources/linux/snap/snapcraft.yaml index c39e5f4f849..7dbc1680ba2 100644 --- a/resources/linux/snap/snapcraft.yaml +++ b/resources/linux/snap/snapcraft.yaml @@ -24,6 +24,7 @@ parts: plugin: dump source: . stage-packages: + - ibus-gtk3 - fcitx-frontend-gtk3 - gvfs-libs - libasound2 diff --git a/resources/serverless/code-web.js b/resources/serverless/code-web.js index d4314c5c3f0..4345136b625 100644 --- a/resources/serverless/code-web.js +++ b/resources/serverless/code-web.js @@ -6,17 +6,18 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check -/** @typedef {import('../../src/vs/workbench/workbench.web.api').IWorkbenchConstructionOptions} WebConfiguration **/ const http = require('http'); const url = require('url'); const fs = require('fs'); const path = require('path'); const util = require('util'); -const glob = require('glob'); const opn = require('opn'); const minimist = require('minimist'); -const webpack = require('webpack'); +const fancyLog = require('fancy-log'); +const ansiColors = require('ansi-colors'); + +const extensions = require('../../build/lib/extensions'); const APP_ROOT = path.join(__dirname, '..', '..'); const EXTENSIONS_ROOT = path.join(APP_ROOT, 'extensions'); @@ -60,20 +61,35 @@ const AUTHORITY = process.env.VSCODE_AUTHORITY || `${HOST}:${PORT}`; const exists = (path) => util.promisify(fs.exists)(path); const readFile = (path) => util.promisify(fs.readFile)(path); -const CharCode_PC = '%'.charCodeAt(0); + +let unbuiltExensions = []; async function initialize() { - const extensionFolders = await util.promisify(fs.readdir)(EXTENSIONS_ROOT); + const builtinExtensions = []; - const staticExtensions = []; + const children = await util.promisify(fs.readdir)(EXTENSIONS_ROOT, { withFileTypes: true }); + const folders = children.filter(c => !c.isFile()); + await Promise.all(folders.map(async folder => { + const folderName = folder.name; + const extensionPath = path.join(EXTENSIONS_ROOT, folderName); - const webpackConfigs = []; + let children = []; + try { + children = await util.promisify(fs.readdir)(extensionPath); + } catch (error) { + console.log(error); + return; + } - await Promise.all(extensionFolders.map(async extensionFolder => { - const packageJSONPath = path.join(EXTENSIONS_ROOT, extensionFolder, 'package.json'); + const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0]; + const readmePath = readme ? path.join(extensionPath, readme) : undefined; + const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; + const changelogPath = changelog ? path.join(extensionPath, changelog) : undefined; + + const packageJSONPath = path.join(EXTENSIONS_ROOT, folderName, 'package.json'); if (await exists(packageJSONPath)) { try { - const packageJSON = JSON.parse((await readFile(packageJSONPath)).toString()); + let packageJSON = JSON.parse((await readFile(packageJSONPath)).toString()); if (packageJSON.main && !packageJSON.browser) { return; // unsupported } @@ -81,82 +97,40 @@ async function initialize() { if (packageJSON.browser) { packageJSON.main = packageJSON.browser; - const webpackConfigLocations = await util.promisify(glob)( - path.join(EXTENSIONS_ROOT, extensionFolder, '**', 'extension-browser.webpack.config.js'), - { ignore: ['**/node_modules'] } - ); - - for (const webpackConfigPath of webpackConfigLocations) { - const configOrFnOrArray = require(webpackConfigPath); - function addConfig(configOrFn) { - if (typeof configOrFn === 'function') { - webpackConfigs.push(configOrFn({}, {})); - } else { - webpackConfigs.push(configOrFn); - } - } - addConfig(configOrFnOrArray); + let mainFilePath = path.join(EXTENSIONS_ROOT, folderName, packageJSON.browser); + if (path.extname(mainFilePath) !== '.js') { + mainFilePath += '.js'; + } + if (!await exists(mainFilePath)) { + unbuiltExensions.push(path.relative(EXTENSIONS_ROOT, mainFilePath)); } } - - const packageNlsPath = path.join(EXTENSIONS_ROOT, extensionFolder, 'package.nls.json'); - if (await exists(packageNlsPath)) { - const packageNls = JSON.parse((await readFile(packageNlsPath)).toString()); - const translate = (obj) => { - for (let key in obj) { - const val = obj[key]; - if (Array.isArray(val)) { - val.forEach(translate); - } else if (val && typeof val === 'object') { - translate(val); - } else if (typeof val === 'string' && val.charCodeAt(0) === CharCode_PC && val.charCodeAt(val.length - 1) === CharCode_PC) { - const translated = packageNls[val.substr(1, val.length - 2)]; - if (translated) { - obj[key] = translated; - } - } - } - }; - translate(packageJSON); - } packageJSON.extensionKind = ['web']; // enable for Web - staticExtensions.push({ + + const packageNLSPath = path.join(folderName, 'package.nls.json'); + const packageNLSExists = await exists(path.join(EXTENSIONS_ROOT, packageNLSPath)); + if (packageNLSExists) { + packageJSON = extensions.translatePackageJSON(packageJSON, path.join(EXTENSIONS_ROOT, packageNLSPath)); // temporary, until fixed in core + } + builtinExtensions.push({ + extensionPath: folderName, packageJSON, - extensionLocation: { scheme: SCHEME, authority: AUTHORITY, path: `/static-extension/${extensionFolder}` }, - isBuiltin: true + packageNLSPath: packageNLSExists ? packageNLSPath : undefined, + readmePath, + changelogPath }); } catch (e) { console.log(e); } } })); - - return new Promise((resolve, reject) => { - if (args.watch) { - webpack(webpackConfigs).watch({}, (err, stats) => { - if (err) { - console.log(err); - reject(); - } else { - console.log(stats.toString()); - resolve(staticExtensions); - } - }); - } else { - webpack(webpackConfigs).run((err, stats) => { - if (err) { - console.log(err); - reject(); - } else { - console.log(stats.toString()); - resolve(staticExtensions); - } - }); - } - }); + if (unbuiltExensions.length) { + fancyLog(`${ansiColors.yellow('Warning')}: Make sure to run ${ansiColors.cyan('yarn gulp watch-web')}\nCould not find the following browser main files: \n${unbuiltExensions.join('\n')}`); + } + return builtinExtensions; } -const staticExtensionsPromise = initialize(); +const builtinExtensionsPromise = initialize(); const mapCallbackUriToRequestId = new Map(); @@ -252,31 +226,43 @@ function handleStaticExtension(req, res, parsedUrl) { * @param {import('http').ServerResponse} res */ async function handleRoot(req, res) { + let folderUri = { scheme: 'memfs', path: `/sample-folder` }; + const match = req.url && req.url.match(/\?([^#]+)/); - let ghPath; if (match) { const qs = new URLSearchParams(match[1]); - ghPath = qs.get('gh'); - if (ghPath && !ghPath.startsWith('/')) { - ghPath = '/' + ghPath; + + let gh = qs.get('gh'); + if (gh) { + if (gh.startsWith('/')) { + gh = gh.substr(1); + } + + const [owner, repo, ...branch] = gh.split('/', 3); + folderUri = { scheme: 'github', authority: branch.join('/') || 'HEAD', path: `/${owner}/${repo}` }; + } else { + let cs = qs.get('cs'); + if (cs) { + if (cs.startsWith('/')) { + cs = cs.substr(1); + } + + const [owner, repo, ...branch] = cs.split('/'); + folderUri = { scheme: 'codespace', authority: branch.join('/') || 'HEAD', path: `/${owner}/${repo}` }; + } } } - const staticExtensions = await staticExtensionsPromise; - /** @type {WebConfiguration} */ - const webConfig = { - staticExtensions: staticExtensions, - }; + const builtinExtensions = await builtinExtensionsPromise; const webConfigJSON = escapeAttribute(JSON.stringify({ - ...webConfig, - folderUri: ghPath - ? { scheme: 'github', authority: 'HEAD', path: ghPath } - : { scheme: 'memfs', path: `/sample-folder` }, + folderUri: folderUri, + builtinExtensionsServiceUrl: `${SCHEME}://${AUTHORITY}/static-extension` })); const data = (await util.promisify(fs.readFile)(WEB_MAIN)).toString() .replace('{{WORKBENCH_WEB_CONFIGURATION}}', () => webConfigJSON) // use a replace function to avoid that regexp replace patterns ($&, $0, ...) are applied + .replace('{{WORKBENCH_BUILTIN_EXTENSIONS}}', () => escapeAttribute(JSON.stringify(builtinExtensions))) .replace('{{WEBVIEW_ENDPOINT}}', '') .replace('{{REMOTE_USER_DATA_URI}}', ''); diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index c751647f2ec..9f029e5522a 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -13,48 +13,46 @@ NAME="@@NAME@@" DATAFOLDER="@@DATAFOLDER@@" VSCODE_PATH="$(dirname "$(dirname "$(realpath "$0")")")" ELECTRON="$VSCODE_PATH/$NAME.exe" -if grep -qi Microsoft /proc/version; then - # in a wsl shell - WSL_BUILD=$(uname -r | sed -E 's/^[0-9.]+-([0-9]+)-Microsoft.*|([0-9]+).([0-9]+).([0-9]+)-microsoft-standard.*|.*/\1\2\3\4/') - if [ -z "$WSL_BUILD" ]; then - WSL_BUILD=0 - fi - if [ $WSL_BUILD -ge 17063 ]; then - # $WSL_DISTRO_NAME is available since WSL builds 18362, also for WSL2 - # WSLPATH is available since WSL build 17046 - # WSLENV is available since WSL build 17063 - export WSLENV=ELECTRON_RUN_AS_NODE/w:$WSLENV - CLI=$(wslpath -m "$VSCODE_PATH/resources/app/out/cli.js") - - # use the Remote WSL extension if installed - WSL_EXT_ID="ms-vscode-remote.remote-wsl" - - if [ $WSL_BUILD -ge 41955 -a $WSL_BUILD -lt 41959 ]; then - # WSL2 workaround for https://github.com/microsoft/WSL/issues/4337 - CWD="$(pwd)" - cd "$VSCODE_PATH" - cmd.exe /C ".\\bin\\$APP_NAME.cmd --locate-extension $WSL_EXT_ID >%TEMP%\\remote-wsl-loc.txt" - WSL_EXT_WLOC=$(cmd.exe /C type %TEMP%\\remote-wsl-loc.txt) - cd "$CWD" +IN_WSL=false +if [ -n "$WSL_DISTRO_NAME" ]; then + # $WSL_DISTRO_NAME is available since WSL builds 18362, also for WSL2 + IN_WSL=true +else + WSL_BUILD=$(uname -r | sed -E 's/^[0-9.]+-([0-9]+)-Microsoft.*|.*/\1/') + if [ -n "$WSL_BUILD" ]; then + if [ "$WSL_BUILD" -ge 17063 ]; then + # WSLPATH is available since WSL build 17046 + # WSLENV is available since WSL build 17063 + IN_WSL=true else - ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" --locate-extension $WSL_EXT_ID >/tmp/remote-wsl-loc.txt 2>/dev/null - WSL_EXT_WLOC=$(cat /tmp/remote-wsl-loc.txt) - fi - if [ -n "$WSL_EXT_WLOC" ]; then - # replace \r\n with \n in WSL_EXT_WLOC - WSL_CODE=$(wslpath -u "${WSL_EXT_WLOC%%[[:cntrl:]]}")/scripts/wslCode.sh - "$WSL_CODE" "$COMMIT" "$QUALITY" "$ELECTRON" "$APP_NAME" "$DATAFOLDER" "$@" + # If running under older WSL, don't pass cli.js to Electron as + # environment vars cannot be transferred from WSL to Windows + # See: https://github.com/Microsoft/BashOnWindows/issues/1363 + # https://github.com/Microsoft/BashOnWindows/issues/1494 + "$ELECTRON" "$@" exit $? fi - else - # If running under older WSL, don't pass cli.js to Electron as - # environment vars cannot be transferred from WSL to Windows - # See: https://github.com/Microsoft/BashOnWindows/issues/1363 - # https://github.com/Microsoft/BashOnWindows/issues/1494 - "$ELECTRON" "$@" + fi +fi +if [ $IN_WSL = true ]; then + + export WSLENV=ELECTRON_RUN_AS_NODE/w:$WSLENV + CLI=$(wslpath -m "$VSCODE_PATH/resources/app/out/cli.js") + + # use the Remote WSL extension if installed + WSL_EXT_ID="ms-vscode-remote.remote-wsl" + + ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" --locate-extension $WSL_EXT_ID >/tmp/remote-wsl-loc.txt 2>/dev/null + WSL_EXT_WLOC=$(cat /tmp/remote-wsl-loc.txt) + + if [ -n "$WSL_EXT_WLOC" ]; then + # replace \r\n with \n in WSL_EXT_WLOC + WSL_CODE=$(wslpath -u "${WSL_EXT_WLOC%%[[:cntrl:]]}")/scripts/wslCode.sh + "$WSL_CODE" "$COMMIT" "$QUALITY" "$ELECTRON" "$APP_NAME" "$DATAFOLDER" "$@" exit $? fi + elif [ -x "$(command -v cygpath)" ]; then CLI=$(cygpath -m "$VSCODE_PATH/resources/app/out/cli.js") else diff --git a/scripts/code.sh b/scripts/code.sh index d0f79b53a97..390aa4b201d 100755 --- a/scripts/code.sh +++ b/scripts/code.sh @@ -7,7 +7,8 @@ if [[ "$OSTYPE" == "darwin"* ]]; then ROOT=$(dirname "$(dirname "$(realpath "$0")")") else ROOT=$(dirname "$(dirname "$(readlink -f $0)")") - if grep -qi Microsoft /proc/version; then + # If the script is running in Docker using the WSL2 engine, powershell.exe won't exist + if grep -qi Microsoft /proc/version && type powershell.exe > /dev/null 2>&1; then IN_WSL=true fi fi diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index f879f17703c..2c50bff7c77 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -43,8 +43,8 @@ if %errorlevel% neq 0 exit /b %errorlevel% :: Tests in the extension host -call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-notebook-tests\test --enable-proposed-api=vscode.vscode-notebook-tests --extensionDevelopmentPath=%~dp0\..\extensions\vscode-notebook-tests --extensionTestsPath=%~dp0\..\extensions\vscode-notebook-tests\out --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% -if %errorlevel% neq 0 exit /b %errorlevel% +:: call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-notebook-tests\test --enable-proposed-api=vscode.vscode-notebook-tests --extensionDevelopmentPath=%~dp0\..\extensions\vscode-notebook-tests --extensionTestsPath=%~dp0\..\extensions\vscode-notebook-tests\out --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +:: if %errorlevel% neq 0 exit /b %errorlevel% call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-api-tests\testWorkspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\singlefolder-tests --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% if %errorlevel% neq 0 exit /b %errorlevel% diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index 3db8513654c..97a4d9934cd 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -7,15 +7,16 @@ 'use strict'; const bootstrap = require('./bootstrap'); +const bootstrapNode = require('./bootstrap-node'); // Remove global paths from the node module lookup -bootstrap.removeGlobalNodeModuleLookupPaths(); +bootstrapNode.removeGlobalNodeModuleLookupPaths(); // Enable ASAR in our forked processes bootstrap.enableASARSupport(); if (process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']) { - bootstrap.injectNodeModuleLookupPath(process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']); + bootstrapNode.injectNodeModuleLookupPath(process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']); } // Configure: pipe logging to parent process @@ -39,6 +40,7 @@ configureCrashReporter(); // Load AMD entry point require('./bootstrap-amd').load(process.env['AMD_ENTRYPOINT']); + //#region Helpers function pipeLoggingToParent() { @@ -49,8 +51,6 @@ function pipeLoggingToParent() { const seen = []; const argsArray = []; - let res; - // Massage some arguments with special treatment if (args.length) { for (let i = 0; i < args.length; i++) { @@ -85,7 +85,7 @@ function pipeLoggingToParent() { } try { - res = JSON.stringify(argsArray, function (key, value) { + const res = JSON.stringify(argsArray, function (key, value) { // Objects get special treatment to prevent circles if (isObject(value) || Array.isArray(value)) { @@ -98,15 +98,15 @@ function pipeLoggingToParent() { return value; }); + + if (res.length > MAX_LENGTH) { + return 'Output omitted for a large object that exceeds the limits'; + } + + return res; } catch (error) { - return 'Output omitted for an object that cannot be inspected (' + error.toString() + ')'; + return `Output omitted for an object that cannot be inspected ('${error.toString()}')`; } - - if (res && res.length > MAX_LENGTH) { - return 'Output omitted for a large object that exceeds the limits'; - } - - return res; } /** diff --git a/src/bootstrap-node.js b/src/bootstrap-node.js new file mode 100644 index 00000000000..2686249978d --- /dev/null +++ b/src/bootstrap-node.js @@ -0,0 +1,60 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check +'use strict'; + +/** + * Add support for redirecting the loading of node modules + * + * @param {string} injectPath + */ +exports.injectNodeModuleLookupPath = function (injectPath) { + if (!injectPath) { + throw new Error('Missing injectPath'); + } + + const Module = require('module'); + const path = require('path'); + + const nodeModulesPath = path.join(__dirname, '../node_modules'); + + // @ts-ignore + const originalResolveLookupPaths = Module._resolveLookupPaths; + + // @ts-ignore + Module._resolveLookupPaths = function (moduleName, parent) { + const paths = originalResolveLookupPaths(moduleName, parent); + if (Array.isArray(paths)) { + for (let i = 0, len = paths.length; i < len; i++) { + if (paths[i] === nodeModulesPath) { + paths.splice(i, 0, injectPath); + break; + } + } + } + + return paths; + }; +}; + +exports.removeGlobalNodeModuleLookupPaths = function () { + const Module = require('module'); + // @ts-ignore + const globalPaths = Module.globalPaths; + + // @ts-ignore + const originalResolveLookupPaths = Module._resolveLookupPaths; + + // @ts-ignore + Module._resolveLookupPaths = function (moduleName, parent) { + const paths = originalResolveLookupPaths(moduleName, parent); + let commonSuffixLength = 0; + while (commonSuffixLength < paths.length && paths[paths.length - 1 - commonSuffixLength] === globalPaths[globalPaths.length - 1 - commonSuffixLength]) { + commonSuffixLength++; + } + return paths.slice(0, paths.length - commonSuffixLength); + }; +}; diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index 3140e2b2522..d5c0091a504 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -3,215 +3,213 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/// + //@ts-check 'use strict'; -const bootstrap = require('./bootstrap'); +// Simple module style to support node.js and browser environments +(function (globalThis, factory) { -/** - * @param {object} destination - * @param {object} source - * @returns {object} - */ -exports.assign = function assign(destination, source) { - return Object.keys(source).reduce(function (r, key) { r[key] = source[key]; return r; }, destination); -}; + // Node.js + if (typeof exports === 'object') { + module.exports = factory(); + } -/** - * @param {string[]} modulePaths - * @param {(result, configuration: object) => any} resultCallback - * @param {{ forceEnableDeveloperKeybindings?: boolean, disallowReloadKeybinding?: boolean, removeDeveloperKeybindingsAfterLoad?: boolean, canModifyDOM?: (config: object) => void, beforeLoaderConfig?: (config: object, loaderConfig: object) => void, beforeRequire?: () => void }=} options - */ -exports.load = function (modulePaths, resultCallback, options) { + // Browser + else { + globalThis.MonacoBootstrapWindow = factory(); + } +}(this, function () { + const path = require.__$__nodeRequire('path'); + const webFrame = require.__$__nodeRequire('electron').webFrame; + const ipc = require.__$__nodeRequire('electron').ipcRenderer; + const bootstrap = globalThis.MonacoBootstrap; - const webFrame = require('electron').webFrame; - const path = require('path'); - - const args = parseURLQueryArgs(); /** - * // configuration: INativeWindowConfiguration - * @type {{ - * zoomLevel?: number, - * extensionDevelopmentPath?: string[], - * extensionTestsPath?: string, - * userEnv?: { [key: string]: string | undefined }, - * appRoot?: string, - * nodeCachedDataDir?: string - * }} */ - const configuration = JSON.parse(args['config'] || '{}') || {}; + * @param {string[]} modulePaths + * @param {(result, configuration: object) => any} resultCallback + * @param {{ forceEnableDeveloperKeybindings?: boolean, disallowReloadKeybinding?: boolean, removeDeveloperKeybindingsAfterLoad?: boolean, canModifyDOM?: (config: object) => void, beforeLoaderConfig?: (config: object, loaderConfig: object) => void, beforeRequire?: () => void }=} options + */ + function load(modulePaths, resultCallback, options) { + const args = parseURLQueryArgs(); + /** + * // configuration: INativeWindowConfiguration + * @type {{ + * zoomLevel?: number, + * extensionDevelopmentPath?: string[], + * extensionTestsPath?: string, + * userEnv?: { [key: string]: string | undefined }, + * appRoot?: string, + * nodeCachedDataDir?: string + * }} */ + const configuration = JSON.parse(args['config'] || '{}') || {}; - // Apply zoom level early to avoid glitches - const zoomLevel = configuration.zoomLevel; - if (typeof zoomLevel === 'number' && zoomLevel !== 0) { - webFrame.setZoomLevel(zoomLevel); + // Apply zoom level early to avoid glitches + const zoomLevel = configuration.zoomLevel; + if (typeof zoomLevel === 'number' && zoomLevel !== 0) { + webFrame.setZoomLevel(zoomLevel); + } + + // Error handler + process.on('uncaughtException', function (error) { + onUnexpectedError(error, enableDeveloperTools); + }); + + // Developer tools + const enableDeveloperTools = (process.env['VSCODE_DEV'] || !!configuration.extensionDevelopmentPath) && !configuration.extensionTestsPath; + let developerToolsUnbind; + if (enableDeveloperTools || (options && options.forceEnableDeveloperKeybindings)) { + developerToolsUnbind = registerDeveloperKeybindings(options && options.disallowReloadKeybinding); + } + + // Correctly inherit the parent's environment + Object.assign(process.env, configuration.userEnv); + + // Enable ASAR support + bootstrap.enableASARSupport(path.join(configuration.appRoot, 'node_modules')); + + if (options && typeof options.canModifyDOM === 'function') { + options.canModifyDOM(configuration); + } + + // Get the nls configuration into the process.env as early as possible. + const nlsConfig = bootstrap.setupNLS(); + + let locale = nlsConfig.availableLanguages['*'] || 'en'; + if (locale === 'zh-tw') { + locale = 'zh-Hant'; + } else if (locale === 'zh-cn') { + locale = 'zh-Hans'; + } + + window.document.documentElement.setAttribute('lang', locale); + + // do not advertise AMD to avoid confusing UMD modules loaded with nodejs + window['define'] = undefined; + + // replace the patched electron fs with the original node fs for all AMD code + require.define('fs', ['original-fs'], function (originalFS) { return originalFS; }); + + window['MonacoEnvironment'] = {}; + + const loaderConfig = { + baseUrl: `${bootstrap.uriFromPath(configuration.appRoot)}/out`, + 'vs/nls': nlsConfig, + nodeModules: [/*BUILD->INSERT_NODE_MODULES*/] + }; + + // cached data config + if (configuration.nodeCachedDataDir) { + loaderConfig.nodeCachedData = { + path: configuration.nodeCachedDataDir, + seed: modulePaths.join('') + }; + } + + if (options && typeof options.beforeLoaderConfig === 'function') { + options.beforeLoaderConfig(configuration, loaderConfig); + } + + require.config(loaderConfig); + + if (nlsConfig.pseudo) { + require(['vs/nls'], function (nlsPlugin) { + nlsPlugin.setPseudoTranslation(nlsConfig.pseudo); + }); + } + + if (options && typeof options.beforeRequire === 'function') { + options.beforeRequire(); + } + + require(modulePaths, result => { + try { + const callbackResult = resultCallback(result, configuration); + if (callbackResult && typeof callbackResult.then === 'function') { + callbackResult.then(() => { + if (developerToolsUnbind && options && options.removeDeveloperKeybindingsAfterLoad) { + developerToolsUnbind(); + } + }, error => { + onUnexpectedError(error, enableDeveloperTools); + }); + } + } catch (error) { + onUnexpectedError(error, enableDeveloperTools); + } + }, onUnexpectedError); } - // Error handler - process.on('uncaughtException', function (error) { - onUnexpectedError(error, enableDeveloperTools); - }); + /** + * @returns {{[param: string]: string }} + */ + function parseURLQueryArgs() { + const search = window.location.search || ''; - // Developer tools - const enableDeveloperTools = (process.env['VSCODE_DEV'] || !!configuration.extensionDevelopmentPath) && !configuration.extensionTestsPath; - let developerToolsUnbind; - if (enableDeveloperTools || (options && options.forceEnableDeveloperKeybindings)) { - developerToolsUnbind = registerDeveloperKeybindings(options && options.disallowReloadKeybinding); + return search.split(/[?&]/) + .filter(function (param) { return !!param; }) + .map(function (param) { return param.split('='); }) + .filter(function (param) { return param.length === 2; }) + .reduce(function (r, param) { r[param[0]] = decodeURIComponent(param[1]); return r; }, {}); } - // Correctly inherit the parent's environment - exports.assign(process.env, configuration.userEnv); + /** + * @param {boolean} disallowReloadKeybinding + * @returns {() => void} + */ + function registerDeveloperKeybindings(disallowReloadKeybinding) { + const extractKey = function (e) { + return [ + e.ctrlKey ? 'ctrl-' : '', + e.metaKey ? 'meta-' : '', + e.altKey ? 'alt-' : '', + e.shiftKey ? 'shift-' : '', + e.keyCode + ].join(''); + }; - // Enable ASAR support - bootstrap.enableASARSupport(path.join(configuration.appRoot, 'node_modules')); + // Devtools & reload support + const TOGGLE_DEV_TOOLS_KB = (process.platform === 'darwin' ? 'meta-alt-73' : 'ctrl-shift-73'); // mac: Cmd-Alt-I, rest: Ctrl-Shift-I + const TOGGLE_DEV_TOOLS_KB_ALT = '123'; // F12 + const RELOAD_KB = (process.platform === 'darwin' ? 'meta-82' : 'ctrl-82'); // mac: Cmd-R, rest: Ctrl-R - if (options && typeof options.canModifyDOM === 'function') { - options.canModifyDOM(configuration); - } + let listener = function (e) { + const key = extractKey(e); + if (key === TOGGLE_DEV_TOOLS_KB || key === TOGGLE_DEV_TOOLS_KB_ALT) { + ipc.send('vscode:toggleDevTools'); + } else if (key === RELOAD_KB && !disallowReloadKeybinding) { + ipc.send('vscode:reloadWindow'); + } + }; - // Get the nls configuration into the process.env as early as possible. - const nlsConfig = bootstrap.setupNLS(); + window.addEventListener('keydown', listener); - let locale = nlsConfig.availableLanguages['*'] || 'en'; - if (locale === 'zh-tw') { - locale = 'zh-Hant'; - } else if (locale === 'zh-cn') { - locale = 'zh-Hans'; - } - - window.document.documentElement.setAttribute('lang', locale); - - // Load the loader - const amdLoader = require(configuration.appRoot + '/out/vs/loader.js'); - const amdRequire = amdLoader.require; - const amdDefine = amdLoader.require.define; - const nodeRequire = amdLoader.require.nodeRequire; - - window['nodeRequire'] = nodeRequire; - window['require'] = amdRequire; - - // replace the patched electron fs with the original node fs for all AMD code - amdDefine('fs', ['original-fs'], function (originalFS) { return originalFS; }); - - window['MonacoEnvironment'] = {}; - - const loaderConfig = { - baseUrl: bootstrap.uriFromPath(configuration.appRoot) + '/out', - 'vs/nls': nlsConfig, - nodeModules: [/*BUILD->INSERT_NODE_MODULES*/] - }; - - // cached data config - if (configuration.nodeCachedDataDir) { - loaderConfig.nodeCachedData = { - path: configuration.nodeCachedDataDir, - seed: modulePaths.join('') + return function () { + if (listener) { + window.removeEventListener('keydown', listener); + listener = undefined; + } }; } - if (options && typeof options.beforeLoaderConfig === 'function') { - options.beforeLoaderConfig(configuration, loaderConfig); - } - - amdRequire.config(loaderConfig); - - if (nlsConfig.pseudo) { - amdRequire(['vs/nls'], function (nlsPlugin) { - nlsPlugin.setPseudoTranslation(nlsConfig.pseudo); - }); - } - - if (options && typeof options.beforeRequire === 'function') { - options.beforeRequire(); - } - - amdRequire(modulePaths, result => { - try { - const callbackResult = resultCallback(result, configuration); - if (callbackResult && typeof callbackResult.then === 'function') { - callbackResult.then(() => { - if (developerToolsUnbind && options && options.removeDeveloperKeybindingsAfterLoad) { - developerToolsUnbind(); - } - }, error => { - onUnexpectedError(error, enableDeveloperTools); - }); - } - } catch (error) { - onUnexpectedError(error, enableDeveloperTools); + /** + * @param {string | Error} error + * @param {boolean} [enableDeveloperTools] + */ + function onUnexpectedError(error, enableDeveloperTools) { + if (enableDeveloperTools) { + ipc.send('vscode:openDevTools'); } - }, onUnexpectedError); -}; -/** - * @returns {{[param: string]: string }} - */ -function parseURLQueryArgs() { - const search = window.location.search || ''; + console.error(`[uncaught exception]: ${error}`); - return search.split(/[?&]/) - .filter(function (param) { return !!param; }) - .map(function (param) { return param.split('='); }) - .filter(function (param) { return param.length === 2; }) - .reduce(function (r, param) { r[param[0]] = decodeURIComponent(param[1]); return r; }, {}); -} - -/** - * @param {boolean} disallowReloadKeybinding - * @returns {() => void} - */ -function registerDeveloperKeybindings(disallowReloadKeybinding) { - - const ipc = require('electron').ipcRenderer; - - const extractKey = function (e) { - return [ - e.ctrlKey ? 'ctrl-' : '', - e.metaKey ? 'meta-' : '', - e.altKey ? 'alt-' : '', - e.shiftKey ? 'shift-' : '', - e.keyCode - ].join(''); - }; - - // Devtools & reload support - const TOGGLE_DEV_TOOLS_KB = (process.platform === 'darwin' ? 'meta-alt-73' : 'ctrl-shift-73'); // mac: Cmd-Alt-I, rest: Ctrl-Shift-I - const TOGGLE_DEV_TOOLS_KB_ALT = '123'; // F12 - const RELOAD_KB = (process.platform === 'darwin' ? 'meta-82' : 'ctrl-82'); // mac: Cmd-R, rest: Ctrl-R - - let listener = function (e) { - const key = extractKey(e); - if (key === TOGGLE_DEV_TOOLS_KB || key === TOGGLE_DEV_TOOLS_KB_ALT) { - ipc.send('vscode:toggleDevTools'); - } else if (key === RELOAD_KB && !disallowReloadKeybinding) { - ipc.send('vscode:reloadWindow'); + if (error && typeof error !== 'string' && error.stack) { + console.error(error.stack); } - }; - - window.addEventListener('keydown', listener); - - return function () { - if (listener) { - window.removeEventListener('keydown', listener); - listener = undefined; - } - }; -} - -/** - * @param {string | Error} error - * @param {boolean} enableDeveloperTools - */ -function onUnexpectedError(error, enableDeveloperTools) { - - const ipc = require('electron').ipcRenderer; - - if (enableDeveloperTools) { - ipc.send('vscode:openDevTools'); } - console.error('[uncaught exception]: ' + error); - - if (error && typeof error !== 'string' && error.stack) { - console.error(error.stack); - } -} + return { + load + }; +})); diff --git a/src/bootstrap.js b/src/bootstrap.js index a04f0d72f20..f1f579c7b7c 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -6,316 +6,254 @@ //@ts-check 'use strict'; -//#region global bootstrapping +// Simple module style to support node.js and browser environments +(function (globalThis, factory) { -// increase number of stack frames(from 10, https://github.com/v8/v8/wiki/Stack-Trace-API) -Error.stackTraceLimit = 100; - -// Workaround for Electron not installing a handler to ignore SIGPIPE -// (https://github.com/electron/electron/issues/13254) -process.on('SIGPIPE', () => { - console.error(new Error('Unexpected SIGPIPE')); -}); - -//#endregion - -//#region Add support for redirecting the loading of node modules - -exports.injectNodeModuleLookupPath = function (injectPath) { - if (!injectPath) { - throw new Error('Missing injectPath'); + // Node.js + if (typeof exports === 'object') { + module.exports = factory(); } + // Browser + else { + globalThis.MonacoBootstrap = factory(); + } +}(this, function () { const Module = require('module'); const path = require('path'); - - const nodeModulesPath = path.join(__dirname, '../node_modules'); - - // @ts-ignore - const originalResolveLookupPaths = Module._resolveLookupPaths; - - // @ts-ignore - Module._resolveLookupPaths = function (moduleName, parent) { - const paths = originalResolveLookupPaths(moduleName, parent); - if (Array.isArray(paths)) { - for (let i = 0, len = paths.length; i < len; i++) { - if (paths[i] === nodeModulesPath) { - paths.splice(i, 0, injectPath); - break; - } - } - } - - return paths; - }; -}; - -//#endregion - -//#region Remove global paths from the node lookup paths - -exports.removeGlobalNodeModuleLookupPaths = function () { - const Module = require('module'); - // @ts-ignore - const globalPaths = Module.globalPaths; - - // @ts-ignore - const originalResolveLookupPaths = Module._resolveLookupPaths; - - // @ts-ignore - Module._resolveLookupPaths = function (moduleName, parent) { - const paths = originalResolveLookupPaths(moduleName, parent); - let commonSuffixLength = 0; - while (commonSuffixLength < paths.length && paths[paths.length - 1 - commonSuffixLength] === globalPaths[globalPaths.length - 1 - commonSuffixLength]) { - commonSuffixLength++; - } - return paths.slice(0, paths.length - commonSuffixLength); - }; -}; - -//#endregion - -//#region Add support for using node_modules.asar - -/** - * @param {string=} nodeModulesPath - */ -exports.enableASARSupport = function (nodeModulesPath) { - const Module = require('module'); - const path = require('path'); - - let NODE_MODULES_PATH = nodeModulesPath; - if (!NODE_MODULES_PATH) { - NODE_MODULES_PATH = path.join(__dirname, '../node_modules'); - } - - const NODE_MODULES_ASAR_PATH = NODE_MODULES_PATH + '.asar'; - - // @ts-ignore - const originalResolveLookupPaths = Module._resolveLookupPaths; - - // @ts-ignore - Module._resolveLookupPaths = function (request, parent) { - const paths = originalResolveLookupPaths(request, parent); - if (Array.isArray(paths)) { - for (let i = 0, len = paths.length; i < len; i++) { - if (paths[i] === NODE_MODULES_PATH) { - paths.splice(i, 0, NODE_MODULES_ASAR_PATH); - break; - } - } - } - - return paths; - }; -}; - -//#endregion - -//#region URI helpers - -/** - * @param {string} _path - * @returns {string} - */ -exports.uriFromPath = function (_path) { - const path = require('path'); - - let pathName = path.resolve(_path).replace(/\\/g, '/'); - if (pathName.length > 0 && pathName.charAt(0) !== '/') { - pathName = '/' + pathName; - } - - /** @type {string} */ - let uri; - if (process.platform === 'win32' && pathName.startsWith('//')) { // specially handle Windows UNC paths - uri = encodeURI('file:' + pathName); - } else { - uri = encodeURI('file://' + pathName); - } - - return uri.replace(/#/g, '%23'); -}; - -//#endregion - -//#region FS helpers - -/** - * @param {string} file - * @returns {Promise} - */ -exports.readFile = function (file) { const fs = require('fs'); - return new Promise(function (resolve, reject) { - fs.readFile(file, 'utf8', function (err, data) { - if (err) { - reject(err); - return; - } - resolve(data); - }); + //#region global bootstrapping + + // increase number of stack frames(from 10, https://github.com/v8/v8/wiki/Stack-Trace-API) + Error.stackTraceLimit = 100; + + // Workaround for Electron not installing a handler to ignore SIGPIPE + // (https://github.com/electron/electron/issues/13254) + process.on('SIGPIPE', () => { + console.error(new Error('Unexpected SIGPIPE')); }); -}; -/** - * @param {string} file - * @param {string} content - * @returns {Promise} - */ -exports.writeFile = function (file, content) { - const fs = require('fs'); + //#endregion - return new Promise(function (resolve, reject) { - fs.writeFile(file, content, 'utf8', function (err) { - if (err) { - reject(err); - return; + + //#region Add support for using node_modules.asar + + /** + * @param {string=} nodeModulesPath + */ + function enableASARSupport(nodeModulesPath) { + let NODE_MODULES_PATH = nodeModulesPath; + if (!NODE_MODULES_PATH) { + NODE_MODULES_PATH = path.join(__dirname, '../node_modules'); + } else { + // use the drive letter casing of __dirname + if (process.platform === 'win32') { + NODE_MODULES_PATH = __dirname.substr(0, 1) + NODE_MODULES_PATH.substr(1); } - resolve(); - }); - }); -}; - -/** - * @param {string} dir - * @returns {Promise} - */ -exports.mkdirp = function mkdirp(dir) { - const fs = require('fs'); - - return new Promise((c, e) => fs.mkdir(dir, { recursive: true }, err => (err && err.code !== 'EEXIST') ? e(err) : c(dir))); -}; - -//#endregion - -//#region NLS helpers - -/** - * @returns {{locale?: string, availableLanguages: {[lang: string]: string;}, pseudo?: boolean }} - */ -exports.setupNLS = function () { - const path = require('path'); - - // Get the nls configuration into the process.env as early as possible. - let nlsConfig = { availableLanguages: {} }; - if (process.env['VSCODE_NLS_CONFIG']) { - try { - nlsConfig = JSON.parse(process.env['VSCODE_NLS_CONFIG']); - } catch (e) { - // Ignore } - } - if (nlsConfig._resolvedLanguagePackCoreLocation) { - const bundles = Object.create(null); + const NODE_MODULES_ASAR_PATH = `${NODE_MODULES_PATH}.asar`; - nlsConfig.loadBundle = function (bundle, language, cb) { - const result = bundles[bundle]; - if (result) { - cb(undefined, result); + // @ts-ignore + const originalResolveLookupPaths = Module._resolveLookupPaths; - return; - } - - const bundleFile = path.join(nlsConfig._resolvedLanguagePackCoreLocation, bundle.replace(/\//g, '!') + '.nls.json'); - exports.readFile(bundleFile).then(function (content) { - const json = JSON.parse(content); - bundles[bundle] = json; - - cb(undefined, json); - }).catch((error) => { - try { - if (nlsConfig._corruptedFile) { - exports.writeFile(nlsConfig._corruptedFile, 'corrupted').catch(function (error) { console.error(error); }); + // @ts-ignore + Module._resolveLookupPaths = function (request, parent) { + const paths = originalResolveLookupPaths(request, parent); + if (Array.isArray(paths)) { + for (let i = 0, len = paths.length; i < len; i++) { + if (paths[i] === NODE_MODULES_PATH) { + paths.splice(i, 0, NODE_MODULES_ASAR_PATH); + break; } - } finally { - cb(error, undefined); } - }); + } + + return paths; }; } - return nlsConfig; -}; + //#endregion -//#endregion -//#region Portable helpers + //#region URI helpers -/** - * @returns {{ portableDataPath: string, isPortable: boolean }} - */ -exports.configurePortable = function () { - const product = require('../product.json'); - const path = require('path'); - const fs = require('fs'); - - const appRoot = path.dirname(__dirname); - - function getApplicationPath() { - if (process.env['VSCODE_DEV']) { - return appRoot; + /** + * @param {string} _path + * @returns {string} + */ + function uriFromPath(_path) { + let pathName = path.resolve(_path).replace(/\\/g, '/'); + if (pathName.length > 0 && pathName.charAt(0) !== '/') { + pathName = `/${pathName}`; } - if (process.platform === 'darwin') { - return path.dirname(path.dirname(path.dirname(appRoot))); - } - - return path.dirname(path.dirname(appRoot)); - } - - function getPortableDataPath() { - if (process.env['VSCODE_PORTABLE']) { - return process.env['VSCODE_PORTABLE']; - } - - if (process.platform === 'win32' || process.platform === 'linux') { - return path.join(getApplicationPath(), 'data'); - } - - // @ts-ignore - const portableDataName = product.portable || `${product.applicationName}-portable-data`; - return path.join(path.dirname(getApplicationPath()), portableDataName); - } - - const portableDataPath = getPortableDataPath(); - const isPortable = !('target' in product) && fs.existsSync(portableDataPath); - const portableTempPath = path.join(portableDataPath, 'tmp'); - const isTempPortable = isPortable && fs.existsSync(portableTempPath); - - if (isPortable) { - process.env['VSCODE_PORTABLE'] = portableDataPath; - } else { - delete process.env['VSCODE_PORTABLE']; - } - - if (isTempPortable) { - if (process.platform === 'win32') { - process.env['TMP'] = portableTempPath; - process.env['TEMP'] = portableTempPath; + /** @type {string} */ + let uri; + if (process.platform === 'win32' && pathName.startsWith('//')) { // specially handle Windows UNC paths + uri = encodeURI(`file:${pathName}`); } else { - process.env['TMPDIR'] = portableTempPath; + uri = encodeURI(`file://${pathName}`); } + + return uri.replace(/#/g, '%23'); } + //#endregion + + + //#region NLS helpers + + /** + * @returns {{locale?: string, availableLanguages: {[lang: string]: string;}, pseudo?: boolean }} + */ + function setupNLS() { + + // Get the nls configuration into the process.env as early as possible. + let nlsConfig = { availableLanguages: {} }; + if (process.env['VSCODE_NLS_CONFIG']) { + try { + nlsConfig = JSON.parse(process.env['VSCODE_NLS_CONFIG']); + } catch (e) { + // Ignore + } + } + + if (nlsConfig._resolvedLanguagePackCoreLocation) { + const bundles = Object.create(null); + + nlsConfig.loadBundle = function (bundle, language, cb) { + const result = bundles[bundle]; + if (result) { + cb(undefined, result); + + return; + } + + const bundleFile = path.join(nlsConfig._resolvedLanguagePackCoreLocation, `${bundle.replace(/\//g, '!')}.nls.json`); + readFile(bundleFile).then(function (content) { + const json = JSON.parse(content); + bundles[bundle] = json; + + cb(undefined, json); + }).catch((error) => { + try { + if (nlsConfig._corruptedFile) { + writeFile(nlsConfig._corruptedFile, 'corrupted').catch(function (error) { console.error(error); }); + } + } finally { + cb(error, undefined); + } + }); + }; + } + + return nlsConfig; + } + + /** + * @param {string} file + * @returns {Promise} + */ + function readFile(file) { + return fs.promises.readFile(file, 'utf8'); + } + + /** + * @param {string} file + * @param {string} content + * @returns {Promise} + */ + function writeFile(file, content) { + return fs.promises.writeFile(file, content, 'utf8'); + } + + //#endregion + + + //#region Portable helpers + + /** + * @param {{ portable: string; applicationName: string; }} product + * @returns {{portableDataPath: string;isPortable: boolean;}} + */ + function configurePortable(product) { + const appRoot = path.dirname(__dirname); + + function getApplicationPath() { + if (process.env['VSCODE_DEV']) { + return appRoot; + } + + if (process.platform === 'darwin') { + return path.dirname(path.dirname(path.dirname(appRoot))); + } + + return path.dirname(path.dirname(appRoot)); + } + + function getPortableDataPath() { + if (process.env['VSCODE_PORTABLE']) { + return process.env['VSCODE_PORTABLE']; + } + + if (process.platform === 'win32' || process.platform === 'linux') { + return path.join(getApplicationPath(), 'data'); + } + + // @ts-ignore + const portableDataName = product.portable || `${product.applicationName}-portable-data`; + return path.join(path.dirname(getApplicationPath()), portableDataName); + } + + const portableDataPath = getPortableDataPath(); + const isPortable = !('target' in product) && fs.existsSync(portableDataPath); + const portableTempPath = path.join(portableDataPath, 'tmp'); + const isTempPortable = isPortable && fs.existsSync(portableTempPath); + + if (isPortable) { + process.env['VSCODE_PORTABLE'] = portableDataPath; + } else { + delete process.env['VSCODE_PORTABLE']; + } + + if (isTempPortable) { + if (process.platform === 'win32') { + process.env['TMP'] = portableTempPath; + process.env['TEMP'] = portableTempPath; + } else { + process.env['TMPDIR'] = portableTempPath; + } + } + + return { + portableDataPath, + isPortable + }; + } + + //#endregion + + + //#region ApplicationInsights + + // Prevents appinsights from monkey patching modules. + // This should be called before importing the applicationinsights module + function avoidMonkeyPatchFromAppInsights() { + // @ts-ignore + process.env['APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL'] = true; // Skip monkey patching of 3rd party modules by appinsights + global['diagnosticsSource'] = {}; // Prevents diagnostic channel (which patches "require") from initializing entirely + } + + //#endregion + + return { - portableDataPath, - isPortable + enableASARSupport, + avoidMonkeyPatchFromAppInsights, + configurePortable, + setupNLS, + uriFromPath }; -}; - -//#endregion - -//#region ApplicationInsights - -// Prevents appinsights from monkey patching modules. -// This should be called before importing the applicationinsights module -exports.avoidMonkeyPatchFromAppInsights = function () { - // @ts-ignore - process.env['APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL'] = true; // Skip monkey patching of 3rd party modules by appinsights - global['diagnosticsSource'] = {}; // Prevents diagnostic channel (which patches "require") from initializing entirely -}; - -//#endregion +})); diff --git a/src/cli.js b/src/cli.js index 4be0bad61d8..872cd66733d 100644 --- a/src/cli.js +++ b/src/cli.js @@ -7,15 +7,16 @@ 'use strict'; const bootstrap = require('./bootstrap'); +const product = require('../product.json'); // Avoid Monkey Patches from Application Insights bootstrap.avoidMonkeyPatchFromAppInsights(); // Enable portable support -bootstrap.configurePortable(); +bootstrap.configurePortable(product); // Enable ASAR support bootstrap.enableASARSupport(); // Load CLI through AMD loader -require('./bootstrap-amd').load('vs/code/node/cli'); \ No newline at end of file +require('./bootstrap-amd').load('vs/code/node/cli'); diff --git a/src/main.js b/src/main.js index 3ce8dcbe443..369d5f8ce62 100644 --- a/src/main.js +++ b/src/main.js @@ -21,7 +21,7 @@ const product = require('../product.json'); const { app, protocol } = require('electron'); // Enable portable support -const portable = bootstrap.configurePortable(); +const portable = bootstrap.configurePortable(product); // Enable ASAR support bootstrap.enableASARSupport(); @@ -86,8 +86,9 @@ setCurrentWorkingDirectory(); // Register custom schemes with privileges protocol.registerSchemesAsPrivileged([ { - scheme: 'vscode-resource', + scheme: 'vscode-webview', privileges: { + standard: true, secure: true, supportFetchAPI: true, corsEnabled: true, @@ -466,7 +467,7 @@ function getNodeCachedDir() { async ensureExists() { try { - await bootstrap.mkdirp(this.value); + await mkdirp(this.value); return this.value; } catch (error) { @@ -495,6 +496,18 @@ function getNodeCachedDir() { }; } +/** + * @param {string} dir + * @returns {Promise} + */ +function mkdirp(dir) { + const fs = require('fs'); + + return new Promise((resolve, reject) => { + fs.mkdir(dir, { recursive: true }, err => (err && err.code !== 'EEXIST') ? reject(err) : resolve(dir)); + }); +} + //#region NLS Support /** diff --git a/src/typings/require.d.ts b/src/typings/require.d.ts index dfffac43e56..cc4a4043ce1 100644 --- a/src/typings/require.d.ts +++ b/src/typings/require.d.ts @@ -47,6 +47,7 @@ interface NodeRequire { onError: Function; __$__nodeRequire(moduleName: string): T; getStats(): ReadonlyArray; + define(amdModuleId: string, dependencies: string[], callback: (...args: any[]) => any): any; } declare var require: NodeRequire; diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 3e5eaeaa4fa..d5622349ff0 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -820,6 +820,7 @@ export function isHTMLElement(o: any): o is HTMLElement { export const EventType = { // Mouse CLICK: 'click', + AUXCLICK: 'auxclick', DBLCLICK: 'dblclick', MOUSE_UP: 'mouseup', MOUSE_DOWN: 'mousedown', diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index 2b7638770aa..2f71307a362 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -88,9 +88,13 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende if (href) { ({ href, dimensions } = parseHrefAndDimensions(href)); href = _href(href, true); - if (options.baseUrl) { - href = resolvePath(options.baseUrl, href).toString(); - } + try { + const hrefAsUri = URI.parse(href); + if (options.baseUrl && hrefAsUri.scheme === Schemas.file) { // absolute or relative local path, or file: uri + href = resolvePath(options.baseUrl, href).toString(); + } + } catch (err) { } + attributes.push(`src="${href}"`); } if (text) { diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index 89e837d0eaa..5c23c3ad316 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -696,7 +696,8 @@ export class ActionBar extends Disposable implements IActionRunner { } clear(): void { - this.viewItems = dispose(this.viewItems); + dispose(this.viewItems); + this.viewItems = []; DOM.clearNode(this.actionsList); } diff --git a/src/vs/base/browser/ui/aria/aria.ts b/src/vs/base/browser/ui/aria/aria.ts index a971f2f4ce3..641e5f339a3 100644 --- a/src/vs/base/browser/ui/aria/aria.ts +++ b/src/vs/base/browser/ui/aria/aria.ts @@ -11,50 +11,78 @@ import * as dom from 'vs/base/browser/dom'; const MAX_MESSAGE_LENGTH = 20000; let ariaContainer: HTMLElement; let alertContainer: HTMLElement; +let alertContainer2: HTMLElement; let statusContainer: HTMLElement; +let statusContainer2: HTMLElement; export function setARIAContainer(parent: HTMLElement) { ariaContainer = document.createElement('div'); ariaContainer.className = 'monaco-aria-container'; - alertContainer = document.createElement('div'); - alertContainer.className = 'monaco-alert'; - alertContainer.setAttribute('role', 'alert'); - alertContainer.setAttribute('aria-atomic', 'true'); - ariaContainer.appendChild(alertContainer); + const createAlertContainer = () => { + const element = document.createElement('div'); + element.className = 'monaco-alert'; + element.setAttribute('role', 'alert'); + element.setAttribute('aria-atomic', 'true'); + ariaContainer.appendChild(element); + return element; + }; + alertContainer = createAlertContainer(); + alertContainer2 = createAlertContainer(); - statusContainer = document.createElement('div'); - statusContainer.className = 'monaco-status'; - statusContainer.setAttribute('role', 'complementary'); - statusContainer.setAttribute('aria-live', 'polite'); - statusContainer.setAttribute('aria-atomic', 'true'); - ariaContainer.appendChild(statusContainer); + const createStatusContainer = () => { + const element = document.createElement('div'); + element.className = 'monaco-status'; + element.setAttribute('role', 'complementary'); + element.setAttribute('aria-live', 'polite'); + element.setAttribute('aria-atomic', 'true'); + ariaContainer.appendChild(element); + return element; + }; + statusContainer = createStatusContainer(); + statusContainer2 = createStatusContainer(); parent.appendChild(ariaContainer); } - /** * Given the provided message, will make sure that it is read as alert to screen readers. */ export function alert(msg: string): void { - insertMessage(alertContainer, msg); + if (!ariaContainer) { + return; + } + + // Use alternate containers such that duplicated messages get read out by screen readers #99466 + if (alertContainer.textContent !== msg) { + dom.clearNode(alertContainer2); + insertMessage(alertContainer, msg); + } else { + dom.clearNode(alertContainer); + insertMessage(alertContainer2, msg); + } } /** * Given the provided message, will make sure that it is read as status to screen readers. */ export function status(msg: string): void { - if (isMacintosh) { - alert(msg); // VoiceOver does not seem to support status role - } else { - insertMessage(statusContainer, msg); - } -} - -function insertMessage(target: HTMLElement, msg: string): void { if (!ariaContainer) { return; } + if (isMacintosh) { + alert(msg); // VoiceOver does not seem to support status role + } else { + if (statusContainer.textContent !== msg) { + dom.clearNode(statusContainer2); + insertMessage(statusContainer, msg); + } else { + dom.clearNode(statusContainer); + insertMessage(statusContainer2, msg); + } + } +} + +function insertMessage(target: HTMLElement, msg: string): void { dom.clearNode(target); if (msg.length > MAX_MESSAGE_LENGTH) { msg = msg.substr(0, MAX_MESSAGE_LENGTH); diff --git a/src/vs/base/browser/ui/button/button.ts b/src/vs/base/browser/ui/button/button.ts index bfadf3dbe83..592586c718c 100644 --- a/src/vs/base/browser/ui/button/button.ts +++ b/src/vs/base/browser/ui/button/button.ts @@ -18,12 +18,16 @@ import { escape } from 'vs/base/common/strings'; export interface IButtonOptions extends IButtonStyles { readonly title?: boolean | string; readonly supportCodicons?: boolean; + readonly secondary?: boolean; } export interface IButtonStyles { buttonBackground?: Color; buttonHoverBackground?: Color; buttonForeground?: Color; + buttonSecondaryBackground?: Color; + buttonSecondaryHoverBackground?: Color; + buttonSecondaryForeground?: Color; buttonBorder?: Color; } @@ -41,6 +45,9 @@ export class Button extends Disposable { private buttonBackground: Color | undefined; private buttonHoverBackground: Color | undefined; private buttonForeground: Color | undefined; + private buttonSecondaryBackground: Color | undefined; + private buttonSecondaryHoverBackground: Color | undefined; + private buttonSecondaryForeground: Color | undefined; private buttonBorder: Color | undefined; private _onDidClick = this._register(new Emitter()); @@ -54,9 +61,14 @@ export class Button extends Disposable { this.options = options || Object.create(null); mixin(this.options, defaultOptions, false); + this.buttonForeground = this.options.buttonForeground; this.buttonBackground = this.options.buttonBackground; this.buttonHoverBackground = this.options.buttonHoverBackground; - this.buttonForeground = this.options.buttonForeground; + + this.buttonSecondaryForeground = this.options.buttonSecondaryForeground; + this.buttonSecondaryBackground = this.options.buttonSecondaryBackground; + this.buttonSecondaryHoverBackground = this.options.buttonSecondaryHoverBackground; + this.buttonBorder = this.options.buttonBorder; this._element = document.createElement('a'); @@ -114,7 +126,12 @@ export class Button extends Disposable { } private setHoverBackground(): void { - const hoverBackground = this.buttonHoverBackground ? this.buttonHoverBackground.toString() : null; + let hoverBackground; + if (this.options.secondary) { + hoverBackground = this.buttonSecondaryHoverBackground ? this.buttonSecondaryHoverBackground.toString() : null; + } else { + hoverBackground = this.buttonHoverBackground ? this.buttonHoverBackground.toString() : null; + } if (hoverBackground) { this._element.style.backgroundColor = hoverBackground; } @@ -124,6 +141,9 @@ export class Button extends Disposable { this.buttonForeground = styles.buttonForeground; this.buttonBackground = styles.buttonBackground; this.buttonHoverBackground = styles.buttonHoverBackground; + this.buttonSecondaryForeground = styles.buttonSecondaryForeground; + this.buttonSecondaryBackground = styles.buttonSecondaryBackground; + this.buttonSecondaryHoverBackground = styles.buttonSecondaryHoverBackground; this.buttonBorder = styles.buttonBorder; this.applyStyles(); @@ -131,8 +151,15 @@ export class Button extends Disposable { private applyStyles(): void { if (this._element) { - const background = this.buttonBackground ? this.buttonBackground.toString() : ''; - const foreground = this.buttonForeground ? this.buttonForeground.toString() : ''; + let background, foreground; + if (this.options.secondary) { + foreground = this.buttonSecondaryForeground ? this.buttonSecondaryForeground.toString() : ''; + background = this.buttonSecondaryBackground ? this.buttonSecondaryBackground.toString() : ''; + } else { + foreground = this.buttonForeground ? this.buttonForeground.toString() : ''; + background = this.buttonBackground ? this.buttonBackground.toString() : ''; + } + const border = this.buttonBorder ? this.buttonBorder.toString() : ''; this._element.style.color = foreground; diff --git a/src/vs/base/browser/ui/checkbox/checkbox.ts b/src/vs/base/browser/ui/checkbox/checkbox.ts index e1aec79b807..867f2f4d4b0 100644 --- a/src/vs/base/browser/ui/checkbox/checkbox.ts +++ b/src/vs/base/browser/ui/checkbox/checkbox.ts @@ -41,8 +41,8 @@ const defaultOpts = { export class CheckboxActionViewItem extends BaseActionViewItem { - private checkbox: Checkbox | undefined; - private readonly disposables = new DisposableStore(); + protected checkbox: Checkbox | undefined; + protected readonly disposables = new DisposableStore(); render(container: HTMLElement): void { this.element = container; diff --git a/src/vs/base/browser/ui/codicons/codicon/codicon.ttf b/src/vs/base/browser/ui/codicons/codicon/codicon.ttf index ba25be2a8e9..691a9c3798a 100644 Binary files a/src/vs/base/browser/ui/codicons/codicon/codicon.ttf and b/src/vs/base/browser/ui/codicons/codicon/codicon.ttf differ diff --git a/src/vs/base/browser/ui/countBadge/countBadge.css b/src/vs/base/browser/ui/countBadge/countBadge.css index ce26af5e6a1..eb0c0837ee9 100644 --- a/src/vs/base/browser/ui/countBadge/countBadge.css +++ b/src/vs/base/browser/ui/countBadge/countBadge.css @@ -19,4 +19,6 @@ .monaco-count-badge.long { padding: 2px 3px; border-radius: 2px; + min-height: auto; + line-height: normal; } diff --git a/src/vs/base/browser/ui/dialog/dialog.css b/src/vs/base/browser/ui/dialog/dialog.css index 911b5616e70..0a0c821553b 100644 --- a/src/vs/base/browser/ui/dialog/dialog.css +++ b/src/vs/base/browser/ui/dialog/dialog.css @@ -55,7 +55,7 @@ padding: 0 10px; } -.monaco-dialog-box .dialog-message-row > .codicon { +.monaco-dialog-box .dialog-message-row > .dialog-icon.codicon { flex: 0 0 48px; height: 48px; align-self: baseline; diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index 19617990112..24d879aac6f 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -11,7 +11,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IContextViewProvider, IAnchor, AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; import { IMenuOptions } from 'vs/base/browser/ui/menu/menu'; import { ResolvedKeybinding, KeyCode } from 'vs/base/common/keyCodes'; -import { EventHelper, EventType, removeClass, addClass, append, $, addDisposableListener, addClasses } from 'vs/base/browser/dom'; +import { EventHelper, EventType, removeClass, addClass, append, $, addDisposableListener, addClasses, DOMEvent } from 'vs/base/browser/dom'; import { IContextMenuDelegate } from 'vs/base/browser/contextmenu'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { Emitter } from 'vs/base/common/event'; @@ -122,7 +122,7 @@ export class BaseDropdown extends ActionRunner { return !!this.visible; } - protected onEvent(e: Event, activeElement: HTMLElement): void { + protected onEvent(e: DOMEvent, activeElement: HTMLElement): void { this.hide(); } @@ -294,6 +294,9 @@ export class DropdownMenuActionViewItem extends BaseActionViewItem { private anchorAlignmentProvider: (() => AnchorAlignment) | undefined; private menuAsChild?: boolean; + private _onDidChangeVisibility = this._register(new Emitter()); + readonly onDidChangeVisibility = this._onDidChangeVisibility.event; + constructor(action: IAction, menuActions: ReadonlyArray, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean); constructor(action: IAction, actionProvider: IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean); constructor(action: IAction, menuActionsOrProvider: ReadonlyArray | IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean) { @@ -339,7 +342,10 @@ export class DropdownMenuActionViewItem extends BaseActionViewItem { } this.dropdownMenu = this._register(new DropdownMenu(container, options)); - this._register(this.dropdownMenu.onDidChangeVisibility(visible => this.element?.setAttribute('aria-expanded', `${visible}`))); + this._register(this.dropdownMenu.onDidChangeVisibility(visible => { + this.element?.setAttribute('aria-expanded', `${visible}`); + this._onDidChangeVisibility.fire(visible); + })); this.dropdownMenu.menuOptions = { actionViewItemProvider: this.actionViewItemProvider, diff --git a/src/vs/base/browser/ui/grid/grid.ts b/src/vs/base/browser/ui/grid/grid.ts index a8105574ac3..db736d5da23 100644 --- a/src/vs/base/browser/ui/grid/grid.ts +++ b/src/vs/base/browser/ui/grid/grid.ts @@ -10,7 +10,7 @@ import { tail2 as tail, equals } from 'vs/base/common/arrays'; import { orthogonal, IView as IGridViewView, GridView, Sizing as GridViewSizing, Box, IGridViewStyles, IViewSize, IGridViewOptions, IBoundarySashes } from './gridview'; import { Event } from 'vs/base/common/event'; -export { Orientation, Sizing as GridViewSizing, IViewSize, orthogonal, LayoutPriority } from './gridview'; +export { Orientation, IViewSize, orthogonal, LayoutPriority } from './gridview'; export const enum Direction { Up, diff --git a/src/vs/base/browser/ui/list/listPaging.ts b/src/vs/base/browser/ui/list/listPaging.ts index 41bfa24ee60..03db9d2a60d 100644 --- a/src/vs/base/browser/ui/list/listPaging.ts +++ b/src/vs/base/browser/ui/list/listPaging.ts @@ -6,12 +6,13 @@ import 'vs/css!./list'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { range } from 'vs/base/common/arrays'; -import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent } from './list'; +import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent } from './list'; import { List, IListStyles, IListOptions, IListAccessibilityProvider, IListOptionsUpdate } from './listWidget'; import { IPagedModel } from 'vs/base/common/paging'; import { Event } from 'vs/base/common/event'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; +import { IThemable } from 'vs/base/common/styler'; export interface IPagedRenderer extends IListRenderer { renderPlaceholder(index: number, templateData: TTemplateData): void; @@ -119,7 +120,7 @@ function fromPagedListOptions(modelProvider: () => IPagedModel, options: I }; } -export class PagedList implements IDisposable { +export class PagedList implements IThemable, IDisposable { private list: List; private _model!: IPagedModel; @@ -168,22 +169,30 @@ export class PagedList implements IDisposable { return this.list.onDidDispose; } + get onMouseClick(): Event> { + return Event.map(this.list.onMouseClick, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent })); + } + + get onMouseDblClick(): Event> { + return Event.map(this.list.onMouseDblClick, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent })); + } + + get onTap(): Event> { + return Event.map(this.list.onTap, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent })); + } + + get onPointer(): Event> { + return Event.map(this.list.onPointer, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent })); + } + get onDidChangeFocus(): Event> { return Event.map(this.list.onDidChangeFocus, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); } - get onDidOpen(): Event> { - return Event.map(this.list.onDidOpen, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); - } - get onDidChangeSelection(): Event> { return Event.map(this.list.onDidChangeSelection, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); } - get onPin(): Event> { - return Event.map(this.list.onDidPin, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); - } - get onContextMenu(): Event> { return Event.map(this.list.onContextMenu, ({ element, index, anchor, browserEvent }) => (typeof element === 'undefined' ? { element, index, anchor, browserEvent } : { element: this._model.get(element), index, anchor, browserEvent })); } @@ -217,10 +226,6 @@ export class PagedList implements IDisposable { this.list.scrollLeft = scrollLeft; } - open(indexes: number[], browserEvent?: UIEvent): void { - this.list.open(indexes, browserEvent); - } - setFocus(indexes: number[]): void { this.list.setFocus(indexes); } diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index e37d80fdd57..70d3019c920 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -376,6 +376,10 @@ export class ListView implements ISpliceable, IDisposable { } updateElementHeight(index: number, size: number, anchorIndex: number | null): void { + if (index < 0 || index >= this.items.length) { + return; + } + if (this.items[index].size === size) { return; } diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index ca09bbf018a..d7e466466bd 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -26,6 +26,7 @@ import { clamp } from 'vs/base/common/numbers'; import { matchesPrefix } from 'vs/base/common/filters'; import { IDragAndDropData } from 'vs/base/browser/dnd'; import { alert } from 'vs/base/browser/ui/aria/aria'; +import { IThemable } from 'vs/base/common/styler'; interface ITraitChangeEvent { indexes: number[]; @@ -224,14 +225,29 @@ class TraitSpliceable implements ISpliceable { } } -function isInputElement(e: HTMLElement): boolean { +export function isInputElement(e: HTMLElement): boolean { return e.tagName === 'INPUT' || e.tagName === 'TEXTAREA'; } +export function isMonacoEditor(e: HTMLElement): boolean { + if (DOM.hasClass(e, 'monaco-editor')) { + return true; + } + + if (DOM.hasClass(e, 'monaco-list')) { + return false; + } + + if (!e.parentElement) { + return false; + } + + return isMonacoEditor(e.parentElement); +} + class KeyboardController implements IDisposable { private readonly disposables = new DisposableStore(); - private openController: IOpenController; constructor( private list: List, @@ -240,8 +256,6 @@ class KeyboardController implements IDisposable { ) { const multipleSelectionSupport = options.multipleSelectionSupport !== false; - this.openController = options.openController || DefaultOpenController; - const onKeyDown = Event.chain(domEvent(view.domNode, 'keydown')) .filter(e => !isInputElement(e.target as HTMLElement)) .map(e => new StandardKeyboardEvent(e)); @@ -262,10 +276,6 @@ class KeyboardController implements IDisposable { e.preventDefault(); e.stopPropagation(); this.list.setSelection(this.list.getFocus(), e.browserEvent); - - if (this.openController.shouldOpen(e.browserEvent)) { - this.list.open(this.list.getFocus(), e.browserEvent); - } } private onUpArrow(e: StandardKeyboardEvent): void { @@ -527,24 +537,16 @@ const DefaultMultipleSelectionController = { isSelectionRangeChangeEvent }; -const DefaultOpenController: IOpenController = { - shouldOpen: (event: UIEvent) => { - if (event instanceof MouseEvent) { - return !isMouseRightClick(event); - } - - return true; - } -}; - export class MouseController implements IDisposable { private multipleSelectionSupport: boolean; readonly multipleSelectionController: IMultipleSelectionController | undefined; - private openController: IOpenController; private mouseSupport: boolean; private readonly disposables = new DisposableStore(); + private _onPointer = new Emitter>(); + readonly onPointer: Event> = this._onPointer.event; + constructor(protected list: List) { this.multipleSelectionSupport = !(list.options.multipleSelectionSupport === false); @@ -552,7 +554,6 @@ export class MouseController implements IDisposable { this.multipleSelectionController = list.options.multipleSelectionController || DefaultMultipleSelectionController; } - this.openController = list.options.openController || DefaultOpenController; this.mouseSupport = typeof list.options.mouseSupport === 'undefined' || !!list.options.mouseSupport; if (this.mouseSupport) { @@ -563,9 +564,7 @@ export class MouseController implements IDisposable { this.disposables.add(Gesture.addTarget(list.getHTMLElement())); } - list.onMouseClick(this.onPointer, this, this.disposables); - list.onMouseMiddleClick(this.onPointer, this, this.disposables); - list.onTap(this.onPointer, this, this.disposables); + Event.any(list.onMouseClick, list.onMouseMiddleClick, list.onTap)(this.onViewPointer, this, this.disposables); } protected isSelectionSingleChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { @@ -589,22 +588,30 @@ export class MouseController implements IDisposable { } private onMouseDown(e: IListMouseEvent | IListTouchEvent): void { + if (isMonacoEditor(e.browserEvent.target as HTMLElement)) { + return; + } + if (document.activeElement !== e.browserEvent.target) { this.list.domFocus(); } } private onContextMenu(e: IListContextMenuEvent): void { + if (isMonacoEditor(e.browserEvent.target as HTMLElement)) { + return; + } + const focus = typeof e.index === 'undefined' ? [] : [e.index]; this.list.setFocus(focus, e.browserEvent); } - protected onPointer(e: IListMouseEvent): void { + protected onViewPointer(e: IListMouseEvent): void { if (!this.mouseSupport) { return; } - if (isInputElement(e.browserEvent.target as HTMLElement)) { + if (isInputElement(e.browserEvent.target as HTMLElement) || isMonacoEditor(e.browserEvent.target as HTMLElement)) { return; } @@ -632,15 +639,13 @@ export class MouseController implements IDisposable { if (!isMouseRightClick(e.browserEvent)) { this.list.setSelection([focus], e.browserEvent); - - if (this.openController.shouldOpen(e.browserEvent)) { - this.list.open([focus], e.browserEvent); - } } + + this._onPointer.fire(e); } protected onDoubleClick(e: IListMouseEvent): void { - if (isInputElement(e.browserEvent.target as HTMLElement)) { + if (isInputElement(e.browserEvent.target as HTMLElement) || isMonacoEditor(e.browserEvent.target as HTMLElement)) { return; } @@ -650,7 +655,6 @@ export class MouseController implements IDisposable { const focus = this.list.getFocus(); this.list.setSelection(focus, e.browserEvent); - this.list.pin(focus); } private changeSelection(e: IListMouseEvent | IListTouchEvent, reference: number | undefined): void { @@ -694,10 +698,6 @@ export interface IMultipleSelectionController { isSelectionRangeChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean; } -export interface IOpenController { - shouldOpen(event: UIEvent): boolean; -} - export interface IStyleController { style(styles: IListStyles): void; } @@ -841,7 +841,6 @@ export interface IListOptions { readonly keyboardSupport?: boolean; readonly multipleSelectionSupport?: boolean; readonly multipleSelectionController?: IMultipleSelectionController; - readonly openController?: IOpenController; readonly styleController?: (suffix: string) => IStyleController; readonly accessibilityProvider?: IListAccessibilityProvider; @@ -855,6 +854,7 @@ export interface IListOptions { readonly horizontalScrolling?: boolean; readonly additionalScrollHeight?: number; readonly transformOptimization?: boolean; + readonly smoothScrolling?: boolean; } export interface IListStyles { @@ -1112,7 +1112,7 @@ export interface IListOptionsUpdate extends IListViewOptionsUpdate { readonly automaticKeyboardNavigation?: boolean; } -export class List implements ISpliceable, IDisposable { +export class List implements ISpliceable, IThemable, IDisposable { private focus: Trait; private selection: Trait; @@ -1122,6 +1122,7 @@ export class List implements ISpliceable, IDisposable { private styleController: IStyleController; private typeLabelController?: TypeLabelController; private accessibilityProvider?: IListAccessibilityProvider; + private mouseController: MouseController; private _ariaLabel: string = ''; protected readonly disposables = new DisposableStore(); @@ -1134,17 +1135,12 @@ export class List implements ISpliceable, IDisposable { return Event.map(this.eventBufferer.wrapEvent(this.selection.onChange), e => this.toListEvent(e)); } - private readonly _onDidOpen = new Emitter>(); - readonly onDidOpen: Event> = this._onDidOpen.event; - - private readonly _onDidPin = new Emitter>(); - readonly onDidPin: Event> = this._onDidPin.event; - get domId(): string { return this.view.domId; } get onDidScroll(): Event { return this.view.onDidScroll; } get onMouseClick(): Event> { return this.view.onMouseClick; } get onMouseDblClick(): Event> { return this.view.onMouseDblClick; } get onMouseMiddleClick(): Event> { return this.view.onMouseMiddleClick; } + get onPointer(): Event> { return this.mouseController.onPointer; } get onMouseUp(): Event> { return this.view.onMouseUp; } get onMouseDown(): Event> { return this.view.onMouseDown; } get onMouseOver(): Event> { return this.view.onMouseOver; } @@ -1263,7 +1259,8 @@ export class List implements ISpliceable, IDisposable { this.disposables.add(this.typeLabelController); } - this.disposables.add(this.createMouseController(_options)); + this.mouseController = this.createMouseController(_options); + this.disposables.add(this.mouseController); this.onDidChangeFocus(this._onFocusChange, this, this.disposables); this.onDidChangeSelection(this._onSelectionChange, this, this.disposables); @@ -1625,26 +1622,6 @@ export class List implements ISpliceable, IDisposable { return this.view.domNode; } - open(indexes: number[], browserEvent?: UIEvent): void { - for (const index of indexes) { - if (index < 0 || index >= this.length) { - throw new ListError(this.user, `Invalid index ${index}`); - } - } - - this._onDidOpen.fire({ indexes, elements: indexes.map(i => this.view.element(i)), browserEvent }); - } - - pin(indexes: number[], browserEvent?: UIEvent): void { - for (const index of indexes) { - if (index < 0 || index >= this.length) { - throw new ListError(this.user, `Invalid index ${index}`); - } - } - - this._onDidPin.fire({ indexes, elements: indexes.map(i => this.view.element(i)), browserEvent }); - } - style(styles: IListStyles): void { this.styleController.style(styles); } @@ -1687,8 +1664,6 @@ export class List implements ISpliceable, IDisposable { this._onDidDispose.fire(); this.disposables.dispose(); - this._onDidOpen.dispose(); - this._onDidPin.dispose(); this._onDidDispose.dispose(); } } diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index 2cf359db3be..d7a428c8f9e 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -942,7 +942,6 @@ export class MenuBar extends Disposable { menuHolder.style.top = `0px`; menuHolder.style.right = `${this.container.clientWidth}px`; menuHolder.style.left = 'auto'; - console.log(customMenu.buttonElement.getBoundingClientRect().right - this.container.clientWidth); } else { menuHolder.style.top = `${this.container.clientHeight}px`; menuHolder.style.left = `${customMenu.buttonElement.getBoundingClientRect().left}px`; diff --git a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts index f611236e379..00bb9830d54 100644 --- a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +++ b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts @@ -17,6 +17,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, ScrollEvent, Scrollable, ScrollbarVisibility } from 'vs/base/common/scrollable'; +import { getZoomFactor } from 'vs/base/browser/browser'; const HIDE_TIMEOUT = 500; const SCROLL_WHEEL_SENSITIVITY = 50; @@ -130,13 +131,18 @@ export class MouseWheelClassifier { // } } - if (Math.abs(item.deltaX - Math.round(item.deltaX)) > 0 || Math.abs(item.deltaY - Math.round(item.deltaY)) > 0) { + if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) { // non-integer deltas => indicator that this is not a physical mouse wheel score += 0.25; } return Math.min(Math.max(score, 0), 1); } + + private _isAlmostInt(value: number): boolean { + const delta = Math.abs(Math.round(value) - value); + return (delta < 0.01); + } } export abstract class AbstractScrollableElement extends Widget { @@ -343,10 +349,11 @@ export abstract class AbstractScrollableElement extends Widget { const classifier = MouseWheelClassifier.INSTANCE; if (SCROLL_WHEEL_SMOOTH_SCROLL_ENABLED) { - if (platform.isWindows) { - // On Windows, the incoming delta events are multiplied with the device pixel ratio, - // so to get a better classification, simply undo that. - classifier.accept(Date.now(), e.deltaX / window.devicePixelRatio, e.deltaY / window.devicePixelRatio); + const osZoomFactor = window.devicePixelRatio / getZoomFactor(); + if (platform.isWindows || platform.isLinux) { + // On Windows and Linux, the incoming delta events are multiplied with the OS zoom factor. + // The OS zoom factor can be reverse engineered by using the device pixel ratio and the configured zoom factor into account. + classifier.accept(Date.now(), e.deltaX / osZoomFactor, e.deltaY / osZoomFactor); } else { classifier.accept(Date.now(), e.deltaX, e.deltaY); } diff --git a/src/vs/base/browser/ui/selectBox/selectBox.css b/src/vs/base/browser/ui/selectBox/selectBox.css index 199ca5f98b8..2997fd77e02 100644 --- a/src/vs/base/browser/ui/selectBox/selectBox.css +++ b/src/vs/base/browser/ui/selectBox/selectBox.css @@ -12,3 +12,16 @@ font-weight: normal; text-transform: none; } + +/** Actions */ + +.monaco-workbench .monaco-action-bar .action-item.select-container { + cursor: default; +} + +.monaco-workbench .monaco-action-bar .action-item .monaco-select-box { + cursor: pointer; + min-width: 110px; + min-height: 18px; + padding: 2px 23px 2px 8px; +} diff --git a/src/vs/base/browser/ui/toolbar/toolbar.ts b/src/vs/base/browser/ui/toolbar/toolbar.ts index 9badee8eb96..a8b39211780 100644 --- a/src/vs/base/browser/ui/toolbar/toolbar.ts +++ b/src/vs/base/browser/ui/toolbar/toolbar.ts @@ -9,10 +9,11 @@ import { Action, IActionRunner, IAction } from 'vs/base/common/actions'; import { ActionBar, ActionsOrientation, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; import { IContextMenuProvider, DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown'; import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; -import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; import { withNullAsUndefined } from 'vs/base/common/types'; import { Codicon, registerIcon } from 'vs/base/common/codicons'; +import { Emitter } from 'vs/base/common/event'; export const CONTEXT = 'context.toolbar'; @@ -35,17 +36,21 @@ export class ToolBar extends Disposable { private options: IToolBarOptions; private actionBar: ActionBar; private toggleMenuAction: ToggleMenuAction; - private toggleMenuActionViewItem = this._register(new MutableDisposable()); + private toggleMenuActionViewItem: DropdownMenuActionViewItem | undefined; + private toggleMenuActionViewItemDisposable: IDisposable = Disposable.None; private hasSecondaryActions: boolean = false; private lookupKeybindings: boolean; + private _onDidChangeDropdownVisibility = this._register(new Emitter()); + readonly onDidChangeDropdownVisibility = this._onDidChangeDropdownVisibility.event; + constructor(container: HTMLElement, contextMenuProvider: IContextMenuProvider, options: IToolBarOptions = { orientation: ActionsOrientation.HORIZONTAL }) { super(); this.options = options; this.lookupKeybindings = typeof this.options.getKeyBinding === 'function'; - this.toggleMenuAction = this._register(new ToggleMenuAction(() => this.toggleMenuActionViewItem.value && this.toggleMenuActionViewItem.value.show(), options.toggleMenuTitle)); + this.toggleMenuAction = this._register(new ToggleMenuAction(() => this.toggleMenuActionViewItem?.show(), options.toggleMenuTitle)); let element = document.createElement('div'); element.className = 'monaco-toolbar'; @@ -60,8 +65,10 @@ export class ToolBar extends Disposable { // Return special action item for the toggle menu action if (action.id === ToggleMenuAction.ID) { + this.toggleMenuActionViewItemDisposable.dispose(); + // Create new - this.toggleMenuActionViewItem.value = new DropdownMenuActionViewItem( + this.toggleMenuActionViewItem = new DropdownMenuActionViewItem( action, (action).menuActions, contextMenuProvider, @@ -72,9 +79,14 @@ export class ToolBar extends Disposable { this.options.anchorAlignmentProvider, true ); - this.toggleMenuActionViewItem.value.setActionContext(this.actionBar.context); + this.toggleMenuActionViewItem.setActionContext(this.actionBar.context); - return this.toggleMenuActionViewItem.value; + this.toggleMenuActionViewItemDisposable = combinedDisposable( + this.toggleMenuActionViewItem, + this.toggleMenuActionViewItem.onDidChangeVisibility(e => this._onDidChangeDropdownVisibility.fire(e)) + ); + + return this.toggleMenuActionViewItem; } return options.actionViewItemProvider ? options.actionViewItemProvider(action) : undefined; @@ -92,8 +104,8 @@ export class ToolBar extends Disposable { set context(context: unknown) { this.actionBar.context = context; - if (this.toggleMenuActionViewItem.value) { - this.toggleMenuActionViewItem.value.setActionContext(context); + if (this.toggleMenuActionViewItem) { + this.toggleMenuActionViewItem.setActionContext(context); } } @@ -113,23 +125,21 @@ export class ToolBar extends Disposable { this.actionBar.setAriaLabel(label); } - setActions(primaryActions: ReadonlyArray, secondaryActions?: ReadonlyArray): () => void { - return () => { - let primaryActionsToSet = primaryActions ? primaryActions.slice(0) : []; + setActions(primaryActions: ReadonlyArray, secondaryActions?: ReadonlyArray): void { + let primaryActionsToSet = primaryActions ? primaryActions.slice(0) : []; - // Inject additional action to open secondary actions if present - this.hasSecondaryActions = !!(secondaryActions && secondaryActions.length > 0); - if (this.hasSecondaryActions && secondaryActions) { - this.toggleMenuAction.menuActions = secondaryActions.slice(0); - primaryActionsToSet.push(this.toggleMenuAction); - } + // Inject additional action to open secondary actions if present + this.hasSecondaryActions = !!(secondaryActions && secondaryActions.length > 0); + if (this.hasSecondaryActions && secondaryActions) { + this.toggleMenuAction.menuActions = secondaryActions.slice(0); + primaryActionsToSet.push(this.toggleMenuAction); + } - this.actionBar.clear(); + this.actionBar.clear(); - primaryActionsToSet.forEach(action => { - this.actionBar.push(action, { icon: true, label: false, keybinding: this.getKeybindingLabel(action) }); - }); - }; + primaryActionsToSet.forEach(action => { + this.actionBar.push(action, { icon: true, label: false, keybinding: this.getKeybindingLabel(action) }); + }); } private getKeybindingLabel(action: IAction): string | undefined { @@ -153,6 +163,11 @@ export class ToolBar extends Disposable { } }; } + + dispose(): void { + super.dispose(); + this.toggleMenuActionViewItemDisposable.dispose(); + } } class ToggleMenuAction extends Action { diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 1075cdd583e..be82f6156e2 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -5,8 +5,8 @@ import 'vs/css!./media/tree'; import { IDisposable, dispose, Disposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { IListOptions, List, IListStyles, MouseController, DefaultKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/listWidget'; -import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider, IKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/list'; +import { IListOptions, List, IListStyles, MouseController, DefaultKeyboardNavigationDelegate, isInputElement, isMonacoEditor } from 'vs/base/browser/ui/list/listWidget'; +import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider, IKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/list'; import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, hasParentWithClass, createStyleSheet, clearNode, addClasses, removeClasses } from 'vs/base/browser/dom'; import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; @@ -917,17 +917,6 @@ class TypeFilterController implements IDisposable { } } -function isInputElement(e: HTMLElement): boolean { - return e.tagName === 'INPUT' || e.tagName === 'TEXTAREA'; -} - -function asTreeEvent(event: IListEvent>): ITreeEvent { - return { - elements: event.elements.map(node => node.element), - browserEvent: event.browserEvent - }; -} - function asTreeMouseEvent(event: IListMouseEvent>): ITreeMouseEvent { let target: TreeMouseEventTarget = TreeMouseEventTarget.Unknown; @@ -960,9 +949,9 @@ export interface IAbstractTreeOptionsUpdate extends ITreeRendererOptions { readonly automaticKeyboardNavigation?: boolean; readonly simpleKeyboardNavigation?: boolean; readonly filterOnType?: boolean; - readonly openOnSingleClick?: boolean; readonly smoothScrolling?: boolean; readonly horizontalScrolling?: boolean; + readonly expandOnlyOnDoubleClick?: boolean; } export interface IAbstractTreeOptions extends IAbstractTreeOptionsUpdate, IListOptions { @@ -1091,26 +1080,24 @@ class TreeNodeListMouseController extends MouseController< super(list); } - protected onPointer(e: IListMouseEvent>): void { - if (isInputElement(e.browserEvent.target as HTMLElement)) { + protected onViewPointer(e: IListMouseEvent>): void { + if (isInputElement(e.browserEvent.target as HTMLElement) || isMonacoEditor(e.browserEvent.target as HTMLElement)) { return; } const node = e.element; if (!node) { - return super.onPointer(e); + return super.onViewPointer(e); } if (this.isSelectionRangeChangeEvent(e) || this.isSelectionSingleChangeEvent(e)) { - return super.onPointer(e); + return super.onViewPointer(e); } - const onTwistie = hasClass(e.browserEvent.target as HTMLElement, 'monaco-tl-twistie'); - - if (!this.tree.openOnSingleClick && e.browserEvent.detail !== 2 && !onTwistie) { - return super.onPointer(e); - } + const target = e.browserEvent.target as HTMLElement; + const onTwistie = hasClass(target, 'monaco-tl-twistie') + || (hasClass(target, 'monaco-icon-label') && hasClass(target, 'folder-icon') && e.browserEvent.offsetX < 16); let expandOnlyOnTwistieClick = false; @@ -1121,7 +1108,11 @@ class TreeNodeListMouseController extends MouseController< } if (expandOnlyOnTwistieClick && !onTwistie) { - return super.onPointer(e); + return super.onViewPointer(e); + } + + if (this.tree.expandOnlyOnDoubleClick && e.browserEvent.detail !== 2 && !onTwistie) { + return super.onViewPointer(e); } if (node.collapsible) { @@ -1135,7 +1126,7 @@ class TreeNodeListMouseController extends MouseController< } } - super.onPointer(e); + super.onViewPointer(e); } protected onDoubleClick(e: IListMouseEvent>): void { @@ -1238,12 +1229,12 @@ export abstract class AbstractTree implements IDisposable get onDidChangeFocus(): Event> { return this.eventBufferer.wrapEvent(this.focus.onDidChange); } get onDidChangeSelection(): Event> { return this.eventBufferer.wrapEvent(this.selection.onDidChange); } - get onDidOpen(): Event> { return Event.map(this.view.onDidOpen, asTreeEvent); } - get onDidPin(): Event> { return Event.map(this.view.onDidPin, asTreeEvent); } get onMouseClick(): Event> { return Event.map(this.view.onMouseClick, asTreeMouseEvent); } get onMouseDblClick(): Event> { return Event.map(this.view.onMouseDblClick, asTreeMouseEvent); } get onContextMenu(): Event> { return Event.map(this.view.onContextMenu, asTreeContextMenuEvent); } + get onTap(): Event> { return Event.map(this.view.onTap, asTreeMouseEvent); } + get onPointer(): Event> { return Event.map(this.view.onPointer, asTreeMouseEvent); } get onKeyDown(): Event { return this.view.onKeyDown; } get onKeyUp(): Event { return this.view.onKeyUp; } @@ -1261,7 +1252,7 @@ export abstract class AbstractTree implements IDisposable get filterOnType(): boolean { return !!this._options.filterOnType; } get onDidChangeTypeFilterPattern(): Event { return this.typeFilterController ? this.typeFilterController.onDidChangePattern : Event.None; } - get openOnSingleClick(): boolean { return typeof this._options.openOnSingleClick === 'undefined' ? true : this._options.openOnSingleClick; } + get expandOnlyOnDoubleClick(): boolean { return this._options.expandOnlyOnDoubleClick ?? false; } get expandOnlyOnTwistieClick(): boolean | ((e: T) => boolean) { return typeof this._options.expandOnlyOnTwistieClick === 'undefined' ? false : this._options.expandOnlyOnTwistieClick; } private readonly _onDidUpdateOptions = new Emitter>(); @@ -1602,11 +1593,6 @@ export abstract class AbstractTree implements IDisposable return this.focus.get(); } - open(elements: TRef[], browserEvent?: UIEvent): void { - const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i >= 0); - this.view.open(indexes, browserEvent); - } - reveal(location: TRef, relativeTop?: number): void { this.model.expandTo(location); diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index 0533836f822..8d82bf60705 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -330,12 +330,13 @@ export class AsyncDataTree implements IDisposable get onDidChangeFocus(): Event> { return Event.map(this.tree.onDidChangeFocus, asTreeEvent); } get onDidChangeSelection(): Event> { return Event.map(this.tree.onDidChangeSelection, asTreeEvent); } - get onDidOpen(): Event> { return Event.map(this.tree.onDidOpen, asTreeEvent); } get onKeyDown(): Event { return this.tree.onKeyDown; } get onMouseClick(): Event> { return Event.map(this.tree.onMouseClick, asTreeMouseEvent); } get onMouseDblClick(): Event> { return Event.map(this.tree.onMouseDblClick, asTreeMouseEvent); } get onContextMenu(): Event> { return Event.map(this.tree.onContextMenu, asTreeContextMenuEvent); } + get onTap(): Event> { return Event.map(this.tree.onTap, asTreeMouseEvent); } + get onPointer(): Event> { return Event.map(this.tree.onPointer, asTreeMouseEvent); } get onDidFocus(): Event { return this.tree.onDidFocus; } get onDidBlur(): Event { return this.tree.onDidBlur; } @@ -344,7 +345,6 @@ export class AsyncDataTree implements IDisposable get onDidUpdateOptions(): Event { return this.tree.onDidUpdateOptions; } get filterOnType(): boolean { return this.tree.filterOnType; } - get openOnSingleClick(): boolean { return this.tree.openOnSingleClick; } get expandOnlyOnTwistieClick(): boolean | ((e: T) => boolean) { if (typeof this.tree.expandOnlyOnTwistieClick === 'boolean') { return this.tree.expandOnlyOnTwistieClick; @@ -671,11 +671,6 @@ export class AsyncDataTree implements IDisposable return nodes.map(n => n!.element as T); } - open(elements: T[], browserEvent?: UIEvent): void { - const nodes = elements.map(e => this.getDataNode(e)); - this.tree.open(nodes, browserEvent); - } - reveal(element: T, relativeTop?: number): void { this.tree.reveal(this.getDataNode(element), relativeTop); } diff --git a/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts b/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts index d3a0f95131b..150f49ce53f 100644 --- a/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts @@ -3,11 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ISpliceable } from 'vs/base/common/sequence'; import { Iterable } from 'vs/base/common/iterator'; import { Event } from 'vs/base/common/event'; import { ITreeModel, ITreeNode, ITreeElement, ICollapseStateChangeEvent, ITreeModelSpliceEvent, TreeError, TreeFilterResult, TreeVisibility, WeakMapper } from 'vs/base/browser/ui/tree/tree'; import { IObjectTreeModelOptions, ObjectTreeModel, IObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; +import { IList } from 'vs/base/browser/ui/tree/indexTreeModel'; // Exported only for test reasons, do not use directly export interface ICompressedTreeElement extends ITreeElement { @@ -126,7 +126,7 @@ export class CompressedObjectTreeModel, TFilterData e constructor( private user: string, - list: ISpliceable, TFilterData>>, + list: IList, TFilterData>>, options: ICompressedObjectTreeModelOptions = {} ) { this.model = new ObjectTreeModel(user, list, options); @@ -290,6 +290,16 @@ export class CompressedObjectTreeModel, TFilterData e this.model.rerender(compressedNode); } + updateElementHeight(element: T, height: number): void { + const compressedNode = this.getCompressedNode(element); + + if (!compressedNode) { + return; + } + + this.model.updateElementHeight(compressedNode, height); + } + refilter(): void { this.model.refilter(); } @@ -340,10 +350,13 @@ class CompressedTreeNodeWrapper implements ITreeNode(nodeMapper: CompressedNodeWeakMapper, list: ISpliceable>): ISpliceable, TFilterData>> { +function mapList(nodeMapper: CompressedNodeWeakMapper, list: IList>): IList, TFilterData>> { return { splice(start: number, deleteCount: number, toInsert: ITreeNode, TFilterData>[]): void { list.splice(start, deleteCount, toInsert.map(node => nodeMapper.map(node)) as ITreeNode[]); + }, + updateElementHeight(index: number, height: number): void { + list.updateElementHeight(index, height); } }; } @@ -402,7 +415,7 @@ export class CompressibleObjectTreeModel, TFilterData constructor( user: string, - list: ISpliceable>, + list: IList>, options: ICompressibleObjectTreeModelOptions = {} ) { this.elementMapper = options.elementMapper || DefaultElementMapper; @@ -492,6 +505,10 @@ export class CompressibleObjectTreeModel, TFilterData return this.model.rerender(location); } + updateElementHeight(element: T, height: number): void { + this.model.updateElementHeight(element, height); + } + refilter(): void { return this.model.refilter(); } diff --git a/src/vs/base/browser/ui/tree/dataTree.ts b/src/vs/base/browser/ui/tree/dataTree.ts index cf7e1110e95..4e97f4ed9b6 100644 --- a/src/vs/base/browser/ui/tree/dataTree.ts +++ b/src/vs/base/browser/ui/tree/dataTree.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { AbstractTree, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree'; -import { ISpliceable } from 'vs/base/common/sequence'; import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, IDataSource, TreeError } from 'vs/base/browser/ui/tree/tree'; import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; import { Iterable } from 'vs/base/common/iterator'; +import { IList } from 'vs/base/browser/ui/tree/indexTreeModel'; export interface IDataTreeOptions extends IAbstractTreeOptions { readonly sorter?: ITreeSorter; @@ -171,7 +171,7 @@ export class DataTree extends AbstractTree>, options: IDataTreeOptions): ITreeModel { + protected createModel(user: string, view: IList>, options: IDataTreeOptions): ITreeModel { return new ObjectTreeModel(user, view, options); } diff --git a/src/vs/base/browser/ui/tree/indexTree.ts b/src/vs/base/browser/ui/tree/indexTree.ts index d4be627730e..5272fa1971a 100644 --- a/src/vs/base/browser/ui/tree/indexTree.ts +++ b/src/vs/base/browser/ui/tree/indexTree.ts @@ -6,8 +6,7 @@ import 'vs/css!./media/tree'; import { Iterable } from 'vs/base/common/iterator'; import { AbstractTree, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree'; -import { ISpliceable } from 'vs/base/common/sequence'; -import { IndexTreeModel } from 'vs/base/browser/ui/tree/indexTreeModel'; +import { IndexTreeModel, IList } from 'vs/base/browser/ui/tree/indexTreeModel'; import { ITreeElement, ITreeModel, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; @@ -41,7 +40,11 @@ export class IndexTree extends AbstractTree>, options: IIndexTreeOptions): ITreeModel { + updateElementHeight(location: number[], height: number): void { + this.model.updateElementHeight(location, height); + } + + protected createModel(user: string, view: IList>, options: IIndexTreeOptions): ITreeModel { return new IndexTreeModel(user, view, this.rootElement, options); } } diff --git a/src/vs/base/browser/ui/tree/indexTreeModel.ts b/src/vs/base/browser/ui/tree/indexTreeModel.ts index 548429eda7a..362ef7e1a30 100644 --- a/src/vs/base/browser/ui/tree/indexTreeModel.ts +++ b/src/vs/base/browser/ui/tree/indexTreeModel.ts @@ -56,6 +56,10 @@ function isCollapsibleStateUpdate(update: CollapseStateUpdate): update is Collap return typeof (update as any).collapsible === 'boolean'; } +export interface IList extends ISpliceable { + updateElementHeight(index: number, height: number): void; +} + export class IndexTreeModel, TFilterData = void> implements ITreeModel { readonly rootRef = []; @@ -78,7 +82,7 @@ export class IndexTreeModel, TFilterData = voi constructor( private user: string, - private list: ISpliceable>, + private list: IList>, rootElement: T, options: IIndexTreeModelOptions = {} ) { @@ -212,6 +216,15 @@ export class IndexTreeModel, TFilterData = voi } } + updateElementHeight(location: number[], height: number): void { + if (location.length === 0) { + throw new TreeError(this.user, 'Invalid tree location'); + } + + const { listIndex } = this.getTreeNodeWithListIndex(location); + this.list.updateElementHeight(listIndex, height); + } + has(location: number[]): boolean { return this.hasTreeNode(location); } diff --git a/src/vs/base/browser/ui/tree/objectTree.ts b/src/vs/base/browser/ui/tree/objectTree.ts index 38647079853..60601a51775 100644 --- a/src/vs/base/browser/ui/tree/objectTree.ts +++ b/src/vs/base/browser/ui/tree/objectTree.ts @@ -5,13 +5,13 @@ import { Iterable } from 'vs/base/common/iterator'; import { AbstractTree, IAbstractTreeOptions, IAbstractTreeOptionsUpdate } from 'vs/base/browser/ui/tree/abstractTree'; -import { ISpliceable } from 'vs/base/common/sequence'; import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, ICollapseStateChangeEvent } from 'vs/base/browser/ui/tree/tree'; import { ObjectTreeModel, IObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; import { IListVirtualDelegate, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list'; import { Event } from 'vs/base/common/event'; import { CompressibleObjectTreeModel, ElementMapper, ICompressedTreeNode, ICompressedTreeElement } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; import { memoize } from 'vs/base/common/decorators'; +import { IList } from 'vs/base/browser/ui/tree/indexTreeModel'; export interface IObjectTreeOptions extends IAbstractTreeOptions { readonly sorter?: ITreeSorter; @@ -46,6 +46,10 @@ export class ObjectTree, TFilterData = void> extends this.model.rerender(element); } + updateElementHeight(element: T, height: number): void { + this.model.updateElementHeight(element, height); + } + resort(element: T, recursive = true): void { this.model.resort(element, recursive); } @@ -54,7 +58,7 @@ export class ObjectTree, TFilterData = void> extends return this.model.has(element); } - protected createModel(user: string, view: ISpliceable>, options: IObjectTreeOptions): ITreeModel { + protected createModel(user: string, view: IList>, options: IObjectTreeOptions): ITreeModel { return new ObjectTreeModel(user, view, options); } } @@ -188,7 +192,7 @@ export class CompressibleObjectTree, TFilterData = vo this.model.setChildren(element, children); } - protected createModel(user: string, view: ISpliceable>, options: ICompressibleObjectTreeOptions): ITreeModel { + protected createModel(user: string, view: IList>, options: ICompressibleObjectTreeOptions): ITreeModel { return new CompressibleObjectTreeModel(user, view, options); } diff --git a/src/vs/base/browser/ui/tree/objectTreeModel.ts b/src/vs/base/browser/ui/tree/objectTreeModel.ts index 12c839ab10c..59afa8d4b98 100644 --- a/src/vs/base/browser/ui/tree/objectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/objectTreeModel.ts @@ -3,9 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ISpliceable } from 'vs/base/common/sequence'; import { Iterable } from 'vs/base/common/iterator'; -import { IndexTreeModel, IIndexTreeModelOptions } from 'vs/base/browser/ui/tree/indexTreeModel'; +import { IndexTreeModel, IIndexTreeModelOptions, IList } from 'vs/base/browser/ui/tree/indexTreeModel'; import { Event } from 'vs/base/common/event'; import { ITreeModel, ITreeNode, ITreeElement, ITreeSorter, ICollapseStateChangeEvent, ITreeModelSpliceEvent, TreeError } from 'vs/base/browser/ui/tree/tree'; import { IIdentityProvider } from 'vs/base/browser/ui/list/list'; @@ -16,6 +15,7 @@ export type ITreeNodeCallback = (node: ITreeNode export interface IObjectTreeModel, TFilterData extends NonNullable = void> extends ITreeModel { setChildren(element: T | null, children: Iterable> | undefined): void; resort(element?: T | null, recursive?: boolean): void; + updateElementHeight(element: T, height: number): void; } export interface IObjectTreeModelOptions extends IIndexTreeModelOptions { @@ -41,7 +41,7 @@ export class ObjectTreeModel, TFilterData extends Non constructor( private user: string, - list: ISpliceable>, + list: IList>, options: IObjectTreeModelOptions = {} ) { this.model = new IndexTreeModel(user, list, null, options); @@ -169,6 +169,11 @@ export class ObjectTreeModel, TFilterData extends Non this.model.rerender(location); } + updateElementHeight(element: T, height: number): void { + const location = this.getElementLocation(element); + this.model.updateElementHeight(location, height); + } + resort(element: T | null = null, recursive = true): void { if (!this.sorter) { return; diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index c4fec6d89ca..406a9c801d4 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -66,7 +66,7 @@ export function dispose(arg: T | IterableIterator | un d.dispose(); } } - return arg; + return Array.isArray(arg) ? [] : arg; } else if (arg) { markTracked(arg); arg.dispose(); diff --git a/src/vs/base/common/network.ts b/src/vs/base/common/network.ts index b382b4221b7..1286c5117a4 100644 --- a/src/vs/base/common/network.ts +++ b/src/vs/base/common/network.ts @@ -62,8 +62,14 @@ export namespace Schemas { export const webviewPanel = 'webview-panel'; - export const oldVscodeWebviewResource = 'vscode-resource'; + /** + * Scheme used for loading the wrapper html and script in webviews. + */ + export const vscodeWebview = 'vscode-webview'; + /** + * Scheme used for loading resources inside of webviews. + */ export const vscodeWebviewResource = 'vscode-webview-resource'; /** diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts index 2c30aaa188f..0bbc5d6ef91 100644 --- a/src/vs/base/common/platform.ts +++ b/src/vs/base/common/platform.ts @@ -54,7 +54,7 @@ if (typeof navigator === 'object' && !isElectronRenderer) { _userAgent = navigator.userAgent; _isWindows = _userAgent.indexOf('Windows') >= 0; _isMacintosh = _userAgent.indexOf('Macintosh') >= 0; - _isIOS = _userAgent.indexOf('Macintosh') >= 0 && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0; + _isIOS = (_userAgent.indexOf('Macintosh') >= 0 || _userAgent.indexOf('iPad') >= 0 || _userAgent.indexOf('iPhone') >= 0) && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0; _isLinux = _userAgent.indexOf('Linux') >= 0; _isWeb = true; _locale = navigator.language; @@ -208,7 +208,7 @@ export const enum OperatingSystem { Macintosh = 2, Linux = 3 } -export const OS = (_isMacintosh ? OperatingSystem.Macintosh : (_isWindows ? OperatingSystem.Windows : OperatingSystem.Linux)); +export const OS = (_isMacintosh || _isIOS ? OperatingSystem.Macintosh : (_isWindows ? OperatingSystem.Windows : OperatingSystem.Linux)); let _isLittleEndian = true; let _isLittleEndianComputed = false; diff --git a/src/vs/base/common/search.ts b/src/vs/base/common/search.ts index 7b57f1e5a66..2eec434e9a7 100644 --- a/src/vs/base/common/search.ts +++ b/src/vs/base/common/search.ts @@ -18,7 +18,7 @@ export function buildReplaceStringWithCasePreserved(matches: string[] | null, pa return pattern.toUpperCase(); } else if (matches[0].toLowerCase() === matches[0]) { return pattern.toLowerCase(); - } else if (strings.containsUppercaseCharacter(matches[0][0])) { + } else if (strings.containsUppercaseCharacter(matches[0][0]) && pattern.length > 0) { return pattern[0].toUpperCase() + pattern.substr(1); } else { // we don't understand its pattern yet. diff --git a/src/vs/base/common/sequence.ts b/src/vs/base/common/sequence.ts index 418d3907c99..dc47fe8c095 100644 --- a/src/vs/base/common/sequence.ts +++ b/src/vs/base/common/sequence.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; +import { IDisposable } from 'vs/base/common/lifecycle'; export interface ISplice { readonly start: number; @@ -32,3 +33,26 @@ export class Sequence implements ISequence, ISpliceable { this._onDidSplice.fire({ start, deleteCount, toInsert }); } } + +export class SimpleSequence implements ISequence { + + private _elements: T[]; + get elements(): T[] { return this._elements; } + + readonly onDidSplice: Event>; + private disposable: IDisposable; + + constructor(elements: T[], onDidAdd: Event, onDidRemove: Event) { + this._elements = [...elements]; + this.onDidSplice = Event.any( + Event.map(onDidAdd, e => ({ start: this.elements.length, deleteCount: 0, toInsert: [e] })), + Event.map(Event.filter(Event.map(onDidRemove, e => this.elements.indexOf(e)), i => i > -1), i => ({ start: i, deleteCount: 1, toInsert: [] })) + ); + + this.disposable = this.onDidSplice(({ start, deleteCount, toInsert }) => this._elements.splice(start, deleteCount, ...toInsert)); + } + + dispose(): void { + this.disposable.dispose(); + } +} diff --git a/src/vs/base/node/stream.ts b/src/vs/base/node/stream.ts deleted file mode 100644 index 12ba5e5d929..00000000000 --- a/src/vs/base/node/stream.ts +++ /dev/null @@ -1,112 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { VSBufferReadableStream, VSBufferReadable, VSBuffer } from 'vs/base/common/buffer'; -import { Readable } from 'stream'; -import { isUndefinedOrNull } from 'vs/base/common/types'; -import { UTF8, UTF8_with_bom, UTF8_BOM, UTF16be, UTF16le_BOM, UTF16be_BOM, UTF16le, UTF_ENCODING } from 'vs/base/node/encoding'; - -export function streamToNodeReadable(stream: VSBufferReadableStream): Readable { - return new class extends Readable { - private listening = false; - - _read(size?: number): void { - if (!this.listening) { - this.listening = true; - - // Data - stream.on('data', data => { - try { - if (!this.push(data.buffer)) { - stream.pause(); // pause the stream if we should not push anymore - } - } catch (error) { - this.emit(error); - } - }); - - // End - stream.on('end', () => { - try { - this.push(null); // signal EOS - } catch (error) { - this.emit(error); - } - }); - - // Error - stream.on('error', error => this.emit('error', error)); - } - - // ensure the stream is flowing - stream.resume(); - } - - _destroy(error: Error | null, callback: (error: Error | null) => void): void { - stream.destroy(); - - callback(null); - } - }; -} - -export function nodeReadableToString(stream: NodeJS.ReadableStream): Promise { - return new Promise((resolve, reject) => { - let result = ''; - - stream.on('data', chunk => result += chunk); - stream.on('error', reject); - stream.on('end', () => resolve(result)); - }); -} - -export function nodeStreamToVSBufferReadable(stream: NodeJS.ReadWriteStream, addBOM?: { encoding: UTF_ENCODING }): VSBufferReadable { - let bytesRead = 0; - let done = false; - - return { - read(): VSBuffer | null { - if (done) { - return null; - } - - const res = stream.read(); - if (isUndefinedOrNull(res)) { - done = true; - - // If we are instructed to add a BOM but we detect that no - // bytes have been read, we must ensure to return the BOM - // ourselves so that we comply with the contract. - if (bytesRead === 0 && addBOM) { - switch (addBOM.encoding) { - case UTF8: - case UTF8_with_bom: - return VSBuffer.wrap(Buffer.from(UTF8_BOM)); - case UTF16be: - return VSBuffer.wrap(Buffer.from(UTF16be_BOM)); - case UTF16le: - return VSBuffer.wrap(Buffer.from(UTF16le_BOM)); - } - } - - return null; - } - - // Handle String - if (typeof res === 'string') { - bytesRead += res.length; - - return VSBuffer.fromString(res); - } - - // Handle Buffer - else { - bytesRead += res.byteLength; - - return VSBuffer.wrap(res); - } - } - }; -} diff --git a/src/vs/base/node/terminalEncoding.ts b/src/vs/base/node/terminalEncoding.ts index 3077f3a9633..63652abb1e5 100644 --- a/src/vs/base/node/terminalEncoding.ts +++ b/src/vs/base/node/terminalEncoding.ts @@ -7,7 +7,7 @@ * This code is also used by standalone cli's. Avoid adding dependencies to keep the size of the cli small. */ import { exec } from 'child_process'; -import * as os from 'os'; +import { isWindows } from 'vs/base/common/platform'; const windowsTerminalEncodings = { '437': 'cp437', // United States @@ -39,7 +39,6 @@ const JSCHARDET_TO_ICONV_ENCODINGS: { [name: string]: string } = { const UTF8 = 'utf8'; - export async function resolveTerminalEncoding(verbose?: boolean): Promise { let rawEncodingPromise: Promise; @@ -54,7 +53,7 @@ export async function resolveTerminalEncoding(verbose?: boolean): Promise(resolve => { if (verbose) { console.log('Running "chcp" to detect terminal encoding...'); diff --git a/src/vs/base/parts/contextmenu/common/contextmenu.ts b/src/vs/base/parts/contextmenu/common/contextmenu.ts index c31a49474f1..0b99dbcb328 100644 --- a/src/vs/base/parts/contextmenu/common/contextmenu.ts +++ b/src/vs/base/parts/contextmenu/common/contextmenu.ts @@ -36,8 +36,7 @@ export interface IPopupOptions { x?: number; y?: number; positioningItem?: number; - onHide?: () => void; } export const CONTEXT_MENU_CHANNEL = 'vscode:contextmenu'; -export const CONTEXT_MENU_CLOSE_CHANNEL = 'vscode:onCloseContextMenu'; \ No newline at end of file +export const CONTEXT_MENU_CLOSE_CHANNEL = 'vscode:onCloseContextMenu'; diff --git a/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts b/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts index 4b5c3fbdf75..4b8917c3426 100644 --- a/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts +++ b/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts @@ -8,7 +8,7 @@ import { IContextMenuItem, ISerializableContextMenuItem, CONTEXT_MENU_CLOSE_CHAN let contextMenuIdPool = 0; -export function popup(items: IContextMenuItem[], options?: IPopupOptions): void { +export function popup(items: IContextMenuItem[], options?: IPopupOptions, onHide?: () => void): void { const processedItems: IContextMenuItem[] = []; const contextMenuId = contextMenuIdPool++; @@ -28,8 +28,8 @@ export function popup(items: IContextMenuItem[], options?: IPopupOptions): void ipcRenderer.removeListener(onClickChannel, onClickChannelHandler); - if (options?.onHide) { - options.onHide(); + if (onHide) { + onHide(); } }); diff --git a/src/vs/base/parts/quickinput/browser/media/quickInput.css b/src/vs/base/parts/quickinput/browser/media/quickInput.css index c086b587c14..547d47ba0b2 100644 --- a/src/vs/base/parts/quickinput/browser/media/quickInput.css +++ b/src/vs/base/parts/quickinput/browser/media/quickInput.css @@ -105,6 +105,8 @@ vertical-align: middle; padding: 2px 4px; border-radius: 2px; + min-height: auto; + line-height: normal; } .quick-input-action { diff --git a/src/vs/base/parts/quickinput/browser/quickInput.ts b/src/vs/base/parts/quickinput/browser/quickInput.ts index f8079252626..afa9d333003 100644 --- a/src/vs/base/parts/quickinput/browser/quickInput.ts +++ b/src/vs/base/parts/quickinput/browser/quickInput.ts @@ -353,10 +353,12 @@ class QuickInput extends Disposable implements IQuickInput { this.ui.inputBox.showDecoration(severity); if (severity === Severity.Error) { const styles = this.ui.inputBox.stylesForType(severity); + this.ui.message.style.color = styles.foreground ? `${styles.foreground}` : ''; this.ui.message.style.backgroundColor = styles.background ? `${styles.background}` : ''; this.ui.message.style.border = styles.border ? `1px solid ${styles.border}` : ''; this.ui.message.style.paddingBottom = '4px'; } else { + this.ui.message.style.color = ''; this.ui.message.style.backgroundColor = ''; this.ui.message.style.border = ''; this.ui.message.style.paddingBottom = ''; @@ -1228,10 +1230,10 @@ export class QuickInputController extends Disposable { this.previousFocusElement = e.relatedTarget instanceof HTMLElement ? e.relatedTarget : undefined; }, true)); this._register(focusTracker.onDidBlur(() => { - this.previousFocusElement = undefined; if (!this.getUI().ignoreFocusOut && !this.options.ignoreFocusOut()) { - this.hide(true); + this.hide(); } + this.previousFocusElement = undefined; })); this._register(dom.addDisposableListener(container, dom.EventType.FOCUS, (e: FocusEvent) => { inputBox.setFocus(); @@ -1572,13 +1574,14 @@ export class QuickInputController extends Disposable { } } - hide(focusLost?: boolean) { + hide() { const controller = this.controller; if (controller) { + const focusChanged = !this.ui?.container.contains(document.activeElement); this.controller = null; this.onHideEmitter.fire(); this.getUI().container.style.display = 'none'; - if (!focusLost) { + if (!focusChanged) { if (this.previousFocusElement && this.previousFocusElement.offsetParent) { this.previousFocusElement.focus(); this.previousFocusElement = undefined; diff --git a/src/vs/base/parts/quickinput/browser/quickInputList.ts b/src/vs/base/parts/quickinput/browser/quickInputList.ts index 1d37629e94a..7c98a6bd880 100644 --- a/src/vs/base/parts/quickinput/browser/quickInputList.ts +++ b/src/vs/base/parts/quickinput/browser/quickInputList.ts @@ -283,7 +283,6 @@ export class QuickInputList { const accessibilityProvider = new QuickInputAccessibilityProvider(); this.list = options.createList('QuickInput', this.container, delegate, [new ListElementRenderer()], { identityProvider: { getId: element => element.saneLabel }, - openController: { shouldOpen: () => false }, // Workaround #58124 setRowLineHeight: false, multipleSelectionSupport: false, horizontalScrolling: false, diff --git a/src/vs/base/parts/request/browser/request.ts b/src/vs/base/parts/request/browser/request.ts index f8532bbe608..5dd4fdd449c 100644 --- a/src/vs/base/parts/request/browser/request.ts +++ b/src/vs/base/parts/request/browser/request.ts @@ -21,7 +21,7 @@ export function request(options: IRequestOptions, token: CancellationToken): Pro setRequestHeaders(xhr, options); xhr.responseType = 'arraybuffer'; - xhr.onerror = e => reject(new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText))); + xhr.onerror = e => reject(new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText) || 'XHR failed')); xhr.onload = (e) => { resolve({ res: { diff --git a/src/vs/base/parts/sandbox/common/electronTypes.ts b/src/vs/base/parts/sandbox/common/electronTypes.ts index 651a9d575ef..8a5f4120862 100644 --- a/src/vs/base/parts/sandbox/common/electronTypes.ts +++ b/src/vs/base/parts/sandbox/common/electronTypes.ts @@ -247,3 +247,37 @@ export interface FileFilter { extensions: string[]; name: string; } + +export interface InputEvent { + + // Docs: http://electronjs.org/docs/api/structures/input-event + + /** + * An array of modifiers of the event, can be `shift`, `control`, `alt`, `meta`, + * `isKeypad`, `isAutoRepeat`, `leftButtonDown`, `middleButtonDown`, + * `rightButtonDown`, `capsLock`, `numLock`, `left`, `right`. + */ + modifiers: Array<'shift' | 'control' | 'alt' | 'meta' | 'isKeypad' | 'isAutoRepeat' | 'leftButtonDown' | 'middleButtonDown' | 'rightButtonDown' | 'capsLock' | 'numLock' | 'left' | 'right'>; +} + +export interface MouseInputEvent extends InputEvent { + + // Docs: http://electronjs.org/docs/api/structures/mouse-input-event + + /** + * The button pressed, can be `left`, `middle`, `right`. + */ + button?: ('left' | 'middle' | 'right'); + clickCount?: number; + globalX?: number; + globalY?: number; + movementX?: number; + movementY?: number; + /** + * The type of the event, can be `mouseDown`, `mouseUp`, `mouseEnter`, + * `mouseLeave`, `contextMenu`, `mouseWheel` or `mouseMove`. + */ + type: ('mouseDown' | 'mouseUp' | 'mouseEnter' | 'mouseLeave' | 'contextMenu' | 'mouseWheel' | 'mouseMove'); + x: number; + y: number; +} diff --git a/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts index d13b997ea75..18eb84d5183 100644 --- a/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { compress, ICompressedTreeElement, ICompressedTreeNode, decompress, CompressedObjectTreeModel } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; import { Iterable } from 'vs/base/common/iterator'; import { ITreeNode } from 'vs/base/browser/ui/tree/tree'; -import { ISpliceable } from 'vs/base/common/sequence'; +import { IList } from 'vs/base/browser/ui/tree/indexTreeModel'; interface IResolvedCompressedTreeElement extends ICompressedTreeElement { readonly element: T; @@ -289,11 +289,12 @@ suite('CompressedObjectTree', function () { }); }); - function toSpliceable(arr: T[]): ISpliceable { + function toList(arr: T[]): IList { return { splice(start: number, deleteCount: number, elements: T[]): void { arr.splice(start, deleteCount, ...elements); - } + }, + updateElementHeight() { } }; } @@ -305,7 +306,7 @@ suite('CompressedObjectTree', function () { test('ctor', () => { const list: ITreeNode>[] = []; - const model = new CompressedObjectTreeModel('test', toSpliceable(list)); + const model = new CompressedObjectTreeModel('test', toList(list)); assert(model); assert.equal(list.length, 0); assert.equal(model.size, 0); @@ -313,7 +314,7 @@ suite('CompressedObjectTree', function () { test('flat', () => { const list: ITreeNode>[] = []; - const model = new CompressedObjectTreeModel('test', toSpliceable(list)); + const model = new CompressedObjectTreeModel('test', toList(list)); model.setChildren(null, [ { element: 0 }, @@ -340,7 +341,7 @@ suite('CompressedObjectTree', function () { test('nested', () => { const list: ITreeNode>[] = []; - const model = new CompressedObjectTreeModel('test', toSpliceable(list)); + const model = new CompressedObjectTreeModel('test', toList(list)); model.setChildren(null, [ { @@ -376,7 +377,7 @@ suite('CompressedObjectTree', function () { test('compressed', () => { const list: ITreeNode>[] = []; - const model = new CompressedObjectTreeModel('test', toSpliceable(list)); + const model = new CompressedObjectTreeModel('test', toList(list)); model.setChildren(null, [ { diff --git a/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts index a5f46d06f2f..6c9dfeae8ea 100644 --- a/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts @@ -5,14 +5,14 @@ import * as assert from 'assert'; import { ITreeNode, ITreeFilter, TreeVisibility } from 'vs/base/browser/ui/tree/tree'; -import { ISpliceable } from 'vs/base/common/sequence'; -import { IndexTreeModel, IIndexTreeNode } from 'vs/base/browser/ui/tree/indexTreeModel'; +import { IndexTreeModel, IIndexTreeNode, IList } from 'vs/base/browser/ui/tree/indexTreeModel'; -function toSpliceable(arr: T[]): ISpliceable { +function toList(arr: T[]): IList { return { splice(start: number, deleteCount: number, elements: T[]): void { arr.splice(start, deleteCount, ...elements); - } + }, + updateElementHeight() { } }; } @@ -24,14 +24,14 @@ suite('IndexTreeModel', function () { test('ctor', () => { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); assert(model); assert.equal(list.length, 0); }); test('insert', () => { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { element: 0 }, @@ -53,7 +53,7 @@ suite('IndexTreeModel', function () { test('deep insert', function () { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -90,7 +90,7 @@ suite('IndexTreeModel', function () { test('deep insert collapsed', function () { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -118,7 +118,7 @@ suite('IndexTreeModel', function () { test('delete', () => { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { element: 0 }, @@ -143,7 +143,7 @@ suite('IndexTreeModel', function () { test('nested delete', function () { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -177,7 +177,7 @@ suite('IndexTreeModel', function () { test('deep delete', function () { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -205,7 +205,7 @@ suite('IndexTreeModel', function () { test('hidden delete', function () { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -230,7 +230,7 @@ suite('IndexTreeModel', function () { test('collapse', () => { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -261,7 +261,7 @@ suite('IndexTreeModel', function () { test('expand', () => { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -301,7 +301,7 @@ suite('IndexTreeModel', function () { test('collapse should recursively adjust visible count', function () { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -334,7 +334,7 @@ suite('IndexTreeModel', function () { test('setCollapsible', () => { const list: ITreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -403,7 +403,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), -1, { filter }); + const model = new IndexTreeModel('test', toList(list), -1, { filter }); model.splice([0], 0, [ { @@ -437,7 +437,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), -1, { filter }); + const model = new IndexTreeModel('test', toList(list), -1, { filter }); model.splice([0], 0, [ { @@ -460,7 +460,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), -1, { filter }); + const model = new IndexTreeModel('test', toList(list), -1, { filter }); model.splice([0], 0, [ { @@ -499,7 +499,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); + const model = new IndexTreeModel('test', toList(list), 'root', { filter }); model.splice([0], 0, [ { @@ -545,7 +545,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); + const model = new IndexTreeModel('test', toList(list), 'root', { filter }); model.splice([0], 0, [ { @@ -591,7 +591,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); + const model = new IndexTreeModel('test', toList(list), 'root', { filter }); model.splice([0], 0, [ { @@ -639,7 +639,7 @@ suite('IndexTreeModel', function () { test('simple', function () { const list: IIndexTreeNode[] = []; - const model = new IndexTreeModel('test', toSpliceable(list), -1); + const model = new IndexTreeModel('test', toList(list), -1); model.splice([0], 0, [ { @@ -669,7 +669,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), -1, { filter }); + const model = new IndexTreeModel('test', toList(list), -1, { filter }); model.splice([0], 0, [ { @@ -701,7 +701,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); + const model = new IndexTreeModel('test', toList(list), 'root', { filter }); model.splice([0], 0, [ { element: 'silver' }, @@ -735,7 +735,7 @@ suite('IndexTreeModel', function () { } }; - const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); + const model = new IndexTreeModel('test', toList(list), 'root', { filter }); model.splice([0], 0, [ { element: 'a', children: [{ element: 'aa' }] }, diff --git a/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts index e4b6afe23c1..4663962b557 100644 --- a/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts @@ -5,15 +5,16 @@ import * as assert from 'assert'; import { ITreeNode, ITreeFilter, TreeVisibility } from 'vs/base/browser/ui/tree/tree'; -import { ISpliceable } from 'vs/base/common/sequence'; import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; +import { IList } from 'vs/base/browser/ui/tree/indexTreeModel'; -function toSpliceable(arr: T[]): ISpliceable { +function toList(arr: T[]): IList { return { splice(start: number, deleteCount: number, elements: T[]): void { // console.log(`splice (${start}, ${deleteCount}, ${elements.length} [${elements.join(', ')}] )`); // debugging arr.splice(start, deleteCount, ...elements); - } + }, + updateElementHeight() { } }; } @@ -25,7 +26,7 @@ suite('ObjectTreeModel', function () { test('ctor', () => { const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list)); + const model = new ObjectTreeModel('test', toList(list)); assert(model); assert.equal(list.length, 0); assert.equal(model.size, 0); @@ -33,7 +34,7 @@ suite('ObjectTreeModel', function () { test('flat', () => { const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list)); + const model = new ObjectTreeModel('test', toList(list)); model.setChildren(null, [ { element: 0 }, @@ -60,7 +61,7 @@ suite('ObjectTreeModel', function () { test('nested', () => { const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list)); + const model = new ObjectTreeModel('test', toList(list)); model.setChildren(null, [ { @@ -96,7 +97,7 @@ suite('ObjectTreeModel', function () { test('setChildren on collapsed node', () => { const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list)); + const model = new ObjectTreeModel('test', toList(list)); model.setChildren(null, [ { element: 0, collapsed: true } @@ -117,7 +118,7 @@ suite('ObjectTreeModel', function () { test('setChildren on expanded, unrevealed node', () => { const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list)); + const model = new ObjectTreeModel('test', toList(list)); model.setChildren(null, [ { @@ -143,7 +144,7 @@ suite('ObjectTreeModel', function () { test('collapse state is preserved with strict identity', () => { const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list), { collapseByDefault: true }); + const model = new ObjectTreeModel('test', toList(list), { collapseByDefault: true }); const data = [{ element: 'father', children: [{ element: 'child' }] }]; model.setChildren(null, data); @@ -173,7 +174,7 @@ suite('ObjectTreeModel', function () { let compare: (a: string, b: string) => number = (a, b) => a < b ? -1 : 1; const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list), { sorter: { compare(a, b) { return compare(a, b); } } }); + const model = new ObjectTreeModel('test', toList(list), { sorter: { compare(a, b) { return compare(a, b); } } }); const data = [ { element: 'cars', children: [{ element: 'sedan' }, { element: 'convertible' }, { element: 'compact' }] }, { element: 'airplanes', children: [{ element: 'passenger' }, { element: 'jet' }] }, @@ -188,7 +189,7 @@ suite('ObjectTreeModel', function () { let compare: (a: string, b: string) => number = () => 0; const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list), { sorter: { compare(a, b) { return compare(a, b); } } }); + const model = new ObjectTreeModel('test', toList(list), { sorter: { compare(a, b) { return compare(a, b); } } }); const data = [ { element: 'cars', children: [{ element: 'sedan' }, { element: 'convertible' }, { element: 'compact' }] }, { element: 'airplanes', children: [{ element: 'passenger' }, { element: 'jet' }] }, @@ -223,7 +224,7 @@ suite('ObjectTreeModel', function () { test('expandTo', () => { const list: ITreeNode[] = []; - const model = new ObjectTreeModel('test', toSpliceable(list), { collapseByDefault: true }); + const model = new ObjectTreeModel('test', toList(list), { collapseByDefault: true }); model.setChildren(null, [ { @@ -254,7 +255,7 @@ suite('ObjectTreeModel', function () { return fn(element) ? TreeVisibility.Visible : parentVisibility; } }; - const model = new ObjectTreeModel('test', toSpliceable(list), { filter }); + const model = new ObjectTreeModel('test', toList(list), { filter }); model.setChildren(null, [{ element: 'file', children: [{ element: 'hello' }] }]); assert.deepEqual(toArray(list), ['file', 'hello']); diff --git a/src/vs/base/test/common/lifecycle.test.ts b/src/vs/base/test/common/lifecycle.test.ts index 4d15ad2046c..91f17aedb44 100644 --- a/src/vs/base/test/common/lifecycle.test.ts +++ b/src/vs/base/test/common/lifecycle.test.ts @@ -48,6 +48,21 @@ suite('Lifecycle', () => { assert(disposable.isDisposed); assert(disposable2.isDisposed); }); + + test('Action bar has broken accessibility #100273', function () { + let array = [{ dispose() { } }, { dispose() { } }]; + let array2 = dispose(array); + + assert.equal(array.length, 2); + assert.equal(array2.length, 0); + assert.ok(array !== array2); + + let set = new Set([{ dispose() { } }, { dispose() { } }]); + let setValues = set.values(); + let setValues2 = dispose(setValues); + assert.ok(setValues === setValues2); + + }); }); suite('Reference Collection', () => { diff --git a/src/vs/base/test/node/path.test.ts b/src/vs/base/test/node/path.test.ts index 14ef9c92df1..3150f8d6094 100644 --- a/src/vs/base/test/node/path.test.ts +++ b/src/vs/base/test/node/path.test.ts @@ -164,8 +164,7 @@ suite('Paths (Node Implementation)', () => { os = 'posix'; } const message = - `path.${os}.join(${test[0].map(JSON.stringify).join(',')})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + `path.${os}.join(${test[0].map(JSON.stringify).join(',')})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected && actualAlt !== expected) { failures.push(`\n${message}`); } @@ -319,8 +318,7 @@ suite('Paths (Node Implementation)', () => { os = 'posix'; } const actual = extname(input); - const message = `path.${os}.extname(${JSON.stringify(input)})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + const message = `path.${os}.extname(${JSON.stringify(input)})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected) { failures.push(`\n${message}`); } @@ -328,8 +326,7 @@ suite('Paths (Node Implementation)', () => { { const input = `C:${test[0].replace(slashRE, '\\')}`; const actual = path.win32.extname(input); - const message = `path.win32.extname(${JSON.stringify(input)})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + const message = `path.win32.extname(${JSON.stringify(input)})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected) { failures.push(`\n${message}`); } @@ -416,8 +413,7 @@ suite('Paths (Node Implementation)', () => { const expected = test[1]; const message = - `path.${os}.resolve(${test[0].map(JSON.stringify).join(',')})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + `path.${os}.resolve(${test[0].map(JSON.stringify).join(',')})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected && actualAlt !== expected) { failures.push(`\n${message}`); } @@ -585,9 +581,7 @@ suite('Paths (Node Implementation)', () => { const actual = relative(test[0], test[1]); const expected = test[2]; const os = relative === path.win32.relative ? 'win32' : 'posix'; - const message = `path.${os}.relative(${ - test.slice(0, 2).map(JSON.stringify).join(',')})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + const message = `path.${os}.relative(${test.slice(0, 2).map(JSON.stringify).join(',')})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected) { failures.push(`\n${message}`); } diff --git a/src/vs/code/browser/workbench/workbench-dev.html b/src/vs/code/browser/workbench/workbench-dev.html index 74ee36bca78..d3b0f94da13 100644 --- a/src/vs/code/browser/workbench/workbench-dev.html +++ b/src/vs/code/browser/workbench/workbench-dev.html @@ -10,6 +10,9 @@ + + + @@ -34,6 +37,8 @@ 'xterm-addon-unicode11': `${window.location.origin}/static/remote/web/node_modules/xterm-addon-unicode11/lib/xterm-addon-unicode11.js`, 'xterm-addon-webgl': `${window.location.origin}/static/remote/web/node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js`, 'semver-umd': `${window.location.origin}/static/remote/web/node_modules/semver-umd/lib/semver-umd.js`, + 'iconv-lite-umd': `${window.location.origin}/static/remote/web/node_modules/iconv-lite-umd/lib/iconv-lite-umd.js`, + 'jschardet': `${window.location.origin}/static/remote/web/node_modules/jschardet/dist/jschardet.min.js`, } }; diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 1825bcffec6..eac3be20822 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -38,6 +38,8 @@ 'xterm-addon-unicode11': `${window.location.origin}/static/node_modules/xterm-addon-unicode11/lib/xterm-addon-unicode11.js`, 'xterm-addon-webgl': `${window.location.origin}/static/node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js`, 'semver-umd': `${window.location.origin}/static/node_modules/semver-umd/lib/semver-umd.js`, + 'iconv-lite-umd': `${window.location.origin}/static/node_modules/iconv-lite-umd/lib/iconv-lite-umd.js`, + 'jschardet': `${window.location.origin}/static/node_modules/jschardet/dist/jschardet.min.js`, } }; diff --git a/src/vs/code/browser/workbench/workbench.ts b/src/vs/code/browser/workbench/workbench.ts index 556c03a03ab..4bd73688054 100644 --- a/src/vs/code/browser/workbench/workbench.ts +++ b/src/vs/code/browser/workbench/workbench.ts @@ -277,6 +277,9 @@ class WorkspaceProvider implements IWorkspaceProvider { (function () { + // Mark start of workbench + performance.mark('workbench-start'); + // Find config by checking for DOM const configElement = document.getElementById('vscode-workbench-web-configuration'); const configElementAttribute = configElement ? configElement.getAttribute('data-settings') : undefined; diff --git a/src/vs/code/electron-browser/issue/issueReporter.html b/src/vs/code/electron-browser/issue/issueReporter.html index 695de78a4cb..3a0cb4be742 100644 --- a/src/vs/code/electron-browser/issue/issueReporter.html +++ b/src/vs/code/electron-browser/issue/issueReporter.html @@ -1,17 +1,23 @@ + + + + + + + - - - - - - - - - - - + + + + + + diff --git a/src/vs/code/electron-browser/issue/issueReporter.js b/src/vs/code/electron-browser/issue/issueReporter.js index 5d11dd15ae4..fdb59bf5fb8 100644 --- a/src/vs/code/electron-browser/issue/issueReporter.js +++ b/src/vs/code/electron-browser/issue/issueReporter.js @@ -6,7 +6,13 @@ //@ts-check 'use strict'; -const bootstrapWindow = require('../../../../bootstrap-window'); +/** + * @type {{ load: (modules: string[], resultCallback: (result, configuration: object) => any, options: object) => unknown }} + */ +const bootstrapWindow = (() => { + // @ts-ignore (defined in bootstrap-window.js) + return window.MonacoBootstrapWindow; +})(); bootstrapWindow.load(['vs/code/electron-browser/issue/issueReporterMain'], function (issueReporter, configuration) { issueReporter.startup(configuration); diff --git a/src/vs/code/electron-browser/processExplorer/processExplorer.html b/src/vs/code/electron-browser/processExplorer/processExplorer.html index 3ef3be23f8f..517805abdb7 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorer.html +++ b/src/vs/code/electron-browser/processExplorer/processExplorer.html @@ -1,17 +1,19 @@ + + + + + +
+ - - - - + + + + - -
- - - - - - \ No newline at end of file + + + diff --git a/src/vs/code/electron-browser/processExplorer/processExplorer.js b/src/vs/code/electron-browser/processExplorer/processExplorer.js index d05816f9915..97faa434a26 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorer.js +++ b/src/vs/code/electron-browser/processExplorer/processExplorer.js @@ -6,8 +6,14 @@ //@ts-check 'use strict'; -const bootstrapWindow = require('../../../../bootstrap-window'); +/** + * @type {{ load: (modules: string[], resultCallback: (result, configuration: object) => any, options: object) => unknown }} + */ +const bootstrapWindow = (() => { + // @ts-ignore (defined in bootstrap-window.js) + return window.MonacoBootstrapWindow; +})(); bootstrapWindow.load(['vs/code/electron-browser/processExplorer/processExplorerMain'], function (processExplorer, configuration) { processExplorer.startup(configuration.data); -}, { forceEnableDeveloperKeybindings: true }); \ No newline at end of file +}, { forceEnableDeveloperKeybindings: true }); diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcess.html b/src/vs/code/electron-browser/sharedProcess/sharedProcess.html index 26890a9fc6b..07fd9bd0478 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcess.html +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcess.html @@ -11,7 +11,12 @@ Shared Process + + + + + - \ No newline at end of file + diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcess.js b/src/vs/code/electron-browser/sharedProcess/sharedProcess.js index 2ecd5f650a8..54815a8ed1b 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcess.js +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcess.js @@ -6,8 +6,21 @@ //@ts-check 'use strict'; -const bootstrap = require('../../../../bootstrap'); -const bootstrapWindow = require('../../../../bootstrap-window'); +/** + * @type {{ load: (modules: string[], resultCallback: (result, configuration: object) => any, options?: object) => unknown }} + */ +const bootstrapWindow = (() => { + // @ts-ignore (defined in bootstrap-window.js) + return window.MonacoBootstrapWindow; +})(); + +/** + * @type {{ avoidMonkeyPatchFromAppInsights: () => void; }} + */ +const bootstrap = (() => { + // @ts-ignore (defined in bootstrap.js) + return window.MonacoBootstrap; +})(); // Avoid Monkey Patches from Application Insights bootstrap.avoidMonkeyPatchFromAppInsights(); diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index ab8a156a170..628018a4e9f 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -49,7 +49,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; import { Schemas } from 'vs/base/common/network'; import { IProductService } from 'vs/platform/product/common/productService'; -import { IUserDataSyncService, IUserDataSyncStoreService, registerConfiguration, IUserDataSyncLogService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, IUserDataSyncStoreService, registerConfiguration, IUserDataSyncLogService, IUserDataSyncUtilService, IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; import { UserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSyncStoreService'; import { UserDataSyncChannel, UserDataSyncUtilServiceClient, UserDataAutoSyncChannel, StorageKeysSyncRegistryChannelClient, UserDataSyncMachinesServiceChannel, UserDataSyncAccountServiceChannel } from 'vs/platform/userDataSync/common/userDataSyncIpc'; @@ -63,7 +63,7 @@ import { NativeStorageService } from 'vs/platform/storage/node/storageService'; import { GlobalStorageDatabaseChannelClient } from 'vs/platform/storage/node/storageIpc'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; -import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; +import { UserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSyncResourceEnablementService'; import { IUserDataSyncAccountService, UserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { UserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSyncBackupStoreService'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; @@ -205,7 +205,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat services.set(IUserDataSyncStoreService, new SyncDescriptor(UserDataSyncStoreService)); services.set(IUserDataSyncMachinesService, new SyncDescriptor(UserDataSyncMachinesService)); services.set(IUserDataSyncBackupStoreService, new SyncDescriptor(UserDataSyncBackupStoreService)); - services.set(IUserDataSyncEnablementService, new SyncDescriptor(UserDataSyncEnablementService)); + services.set(IUserDataSyncResourceEnablementService, new SyncDescriptor(UserDataSyncResourceEnablementService)); services.set(IUserDataSyncService, new SyncDescriptor(UserDataSyncService)); registerConfiguration(); diff --git a/src/vs/code/electron-browser/workbench/workbench.html b/src/vs/code/electron-browser/workbench/workbench.html index bf03da61085..40737461d29 100644 --- a/src/vs/code/electron-browser/workbench/workbench.html +++ b/src/vs/code/electron-browser/workbench/workbench.html @@ -3,11 +3,16 @@ - + + + + + + diff --git a/src/vs/code/electron-browser/workbench/workbench.js b/src/vs/code/electron-browser/workbench/workbench.js index 9badbd9fd32..0ded47c0f4e 100644 --- a/src/vs/code/electron-browser/workbench/workbench.js +++ b/src/vs/code/electron-browser/workbench/workbench.js @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/// + //@ts-check 'use strict'; @@ -31,11 +33,17 @@ const perf = (function () { perf.mark('renderer/started'); -const bootstrapWindow = require('../../../../bootstrap-window'); - // Setup shell environment process['lazyEnv'] = getLazyEnv(); +/** + * @type {{ load: (modules: string[], resultCallback: (result, configuration: object) => any, options: object) => unknown }} + */ +const bootstrapWindow = (() => { + // @ts-ignore (defined in bootstrap-window.js) + return window.MonacoBootstrapWindow; +})(); + // Load workbench main JS, CSS and NLS all in parallel. This is an // optimization to prevent a waterfall of loading to happen, because // we know for a fact that workbench.desktop.main will depend on @@ -46,7 +54,10 @@ bootstrapWindow.load([ 'vs/css!vs/workbench/workbench.desktop.main' ], function (workbench, configuration) { + + // Mark start of workbench perf.mark('didLoadWorkbenchMain'); + performance.mark('workbench-start'); return process['lazyEnv'].then(function () { perf.mark('main/startup'); @@ -54,18 +65,20 @@ bootstrapWindow.load([ // @ts-ignore return require('vs/workbench/electron-browser/desktop.main').main(configuration); }); - }, { - removeDeveloperKeybindingsAfterLoad: true, - canModifyDOM: function (windowConfig) { - showPartsSplash(windowConfig); }, - beforeLoaderConfig: function (windowConfig, loaderConfig) { - loaderConfig.recordStats = true; - }, - beforeRequire: function () { - perf.mark('willLoadWorkbenchMain'); + { + removeDeveloperKeybindingsAfterLoad: true, + canModifyDOM: function (windowConfig) { + showPartsSplash(windowConfig); + }, + beforeLoaderConfig: function (windowConfig, loaderConfig) { + loaderConfig.recordStats = true; + }, + beforeRequire: function () { + perf.mark('willLoadWorkbenchMain'); + } } -}); +); /** * @param {{ @@ -83,7 +96,7 @@ function showPartsSplash(configuration) { let data; if (typeof configuration.partsSplashPath === 'string') { try { - data = JSON.parse(require('fs').readFileSync(configuration.partsSplashPath, 'utf8')); + data = JSON.parse(require.__$__nodeRequire('fs').readFileSync(configuration.partsSplashPath, 'utf8')); } catch (e) { // ignore } @@ -172,7 +185,7 @@ function showPartsSplash(configuration) { */ function getLazyEnv() { - const ipc = require('electron').ipcRenderer; + const ipc = require.__$__nodeRequire('electron').ipcRenderer; return new Promise(function (resolve) { const handle = setTimeout(function () { @@ -182,7 +195,7 @@ function getLazyEnv() { ipc.once('vscode:acceptShellEnv', function (event, shellEnv) { clearTimeout(handle); - bootstrapWindow.assign(process.env, shellEnv); + Object.assign(process.env, shellEnv); // @ts-ignore resolve(process.env); }); diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 32f3bb2e808..8b726400b97 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, ipcMain as ipc, systemPreferences, shell, Event, contentTracing, protocol, powerMonitor, IpcMainEvent, BrowserWindow, dialog, session } from 'electron'; +import { app, ipcMain as ipc, systemPreferences, shell, Event, contentTracing, protocol, IpcMainEvent, BrowserWindow, dialog, session } from 'electron'; import { IProcessEnvironment, isWindows, isMacintosh } from 'vs/base/common/platform'; import { WindowsMainService } from 'vs/platform/windows/electron-main/windowsMainService'; import { IWindowOpenable } from 'vs/platform/windows/common/windows'; @@ -80,6 +80,8 @@ import { INativeEnvironmentService } from 'vs/platform/environment/node/environm import { mnemonicButtonLabel, getPathLabel } from 'vs/base/common/labels'; import { WebviewMainService } from 'vs/platform/webview/electron-main/webviewMainService'; import { IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService'; +import { createServer, AddressInfo } from 'net'; +import { IOpenExtensionWindowResult } from 'vs/platform/debug/common/extensionHostDebug'; export class CodeApplication extends Disposable { private windowsMainService: IWindowsMainService | undefined; @@ -132,7 +134,11 @@ export class CodeApplication extends Disposable { // // !!! DO NOT CHANGE without consulting the documentation !!! // - // app.on('remote-get-guest-web-contents', event => event.preventDefault()); // TODO@Matt revisit this need for + app.on('remote-get-guest-web-contents', event => { + this.logService.trace('App#on(remote-get-guest-web-contents): prevented'); + + event.preventDefault(); + }); app.on('remote-require', (event, sender, module) => { this.logService.trace('App#on(remote-require): prevented'); @@ -172,11 +178,12 @@ export class CodeApplication extends Disposable { return false; } - if (source === 'data:text/html;charset=utf-8,%3C%21DOCTYPE%20html%3E%0D%0A%3Chtml%20lang%3D%22en%22%20style%3D%22width%3A%20100%25%3B%20height%3A%20100%25%22%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3EVirtual%20Document%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%20style%3D%22margin%3A%200%3B%20overflow%3A%20hidden%3B%20width%3A%20100%25%3B%20height%3A%20100%25%22%20role%3D%22document%22%3E%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E') { - return true; + const uri = URI.parse(source); + if (uri.scheme === Schemas.vscodeWebview) { + return uri.path === '/index.html' || uri.path === '/electron-browser/index.html'; } - const srcUri = URI.parse(source).fsPath.toLowerCase(); + const srcUri = uri.fsPath.toLowerCase(); const rootUri = URI.file(this.environmentService.appRoot).fsPath.toLowerCase(); return srcUri.startsWith(rootUri + sep); @@ -261,13 +268,6 @@ export class CodeApplication extends Disposable { } }); - ipc.on('vscode:exit', (event: Event, code: number) => { - this.logService.trace('IPC#vscode:exit', code); - - this.dispose(); - this.lifecycleMainService.kill(code); - }); - ipc.on('vscode:fetchShellEnv', async (event: IpcMainEvent) => { const webContents = event.sender; @@ -294,13 +294,6 @@ export class CodeApplication extends Disposable { (async () => { await this.lifecycleMainService.when(LifecycleMainPhase.AfterWindowOpen); - // After waking up from sleep (after window opened) - powerMonitor.on('resume', () => { - if (this.windowsMainService) { - this.windowsMainService.sendToAll('vscode:osResume', undefined); - } - }); - // Keyboard layout changes (after window opened) const nativeKeymap = await import('native-keymap'); nativeKeymap.onDidChangeKeyboardLayout(() => { @@ -845,20 +838,93 @@ class ElectronExtensionHostDebugBroadcastChannel extends ExtensionHost super(); } - async call(ctx: TContext, command: string, arg?: any): Promise { + call(ctx: TContext, command: string, arg?: any): Promise { if (command === 'openExtensionDevelopmentHostWindow') { - const env = arg[1]; - const pargs = parseArgs(arg[0], OPTIONS); - const extDevPaths = pargs.extensionDevelopmentPath; - if (extDevPaths) { - this.windowsMainService.openExtensionDevelopmentHostWindow(extDevPaths, { - context: OpenContext.API, - cli: pargs, - userEnv: Object.keys(env).length > 0 ? env : undefined - }); - } + return this.openExtensionDevelopmentHostWindow(arg[0], arg[1], arg[2]); } else { return super.call(ctx, command, arg); } } + + private async openExtensionDevelopmentHostWindow(args: string[], env: IProcessEnvironment, debugRenderer: boolean): Promise { + const pargs = parseArgs(args, OPTIONS); + const extDevPaths = pargs.extensionDevelopmentPath; + if (!extDevPaths) { + return {}; + } + + const [codeWindow] = this.windowsMainService.openExtensionDevelopmentHostWindow(extDevPaths, { + context: OpenContext.API, + cli: pargs, + userEnv: Object.keys(env).length > 0 ? env : undefined + }); + + if (!debugRenderer) { + return {}; + } + + const debug = codeWindow.win.webContents.debugger; + + let listeners = debug.isAttached() ? Infinity : 0; + const server = createServer(listener => { + if (listeners++ === 0) { + debug.attach(); + } + + let closed = false; + const writeMessage = (message: object) => { + if (!closed) { // in case sendCommand promises settle after closed + listener.write(JSON.stringify(message) + '\0'); // null-delimited, CDP-compatible + } + }; + + const onMessage = (_event: Event, method: string, params: unknown, sessionId?: string) => + writeMessage(({ method, params, sessionId })); + + codeWindow.win.on('close', () => { + debug.removeListener('message', onMessage); + listener.end(); + closed = true; + }); + + debug.addListener('message', onMessage); + + let buf = Buffer.alloc(0); + listener.on('data', data => { + buf = Buffer.concat([buf, data]); + for (let delimiter = buf.indexOf(0); delimiter !== -1; delimiter = buf.indexOf(0)) { + let data: { id: number; sessionId: string; params: {} }; + try { + const contents = buf.slice(0, delimiter).toString('utf8'); + buf = buf.slice(delimiter + 1); + data = JSON.parse(contents); + } catch (e) { + console.error('error reading cdp line', e); + } + + // depends on a new API for which electron.d.ts has not been updated: + // @ts-ignore + debug.sendCommand(data.method, data.params, data.sessionId) + .then((result: object) => writeMessage({ id: data.id, sessionId: data.sessionId, result })) + .catch((error: Error) => writeMessage({ id: data.id, sessionId: data.sessionId, error: { code: 0, message: error.message } })); + } + }); + + listener.on('error', err => { + console.error('error on cdp pipe:', err); + }); + + listener.on('close', () => { + closed = true; + if (--listeners === 0) { + debug.detach(); + } + }); + }); + + await new Promise(r => server.listen(0, r)); + codeWindow.win.on('close', () => server.close()); + + return { rendererDebugPort: (server.address() as AddressInfo).port }; + } } diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index 83597f68e02..1d2f732c33e 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -59,8 +59,9 @@ export class ProxyAuthHandler extends Disposable { title: 'VS Code', webPreferences: { nodeIntegration: true, - webviewTag: true, - enableWebSQL: false + enableWebSQL: false, + enableRemoteModule: false, + nativeWindowOpen: true } }; diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 744bfea9530..08d0791de73 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -47,6 +47,9 @@ import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemPro import { Schemas } from 'vs/base/common/network'; import { IFileService } from 'vs/platform/files/common/files'; import { IStorageKeysSyncRegistryService, StorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { TunnelService } from 'vs/platform/remote/node/tunnelService'; +import { IProductService } from 'vs/platform/product/common/productService'; class ExpectedError extends Error { readonly isExpected = true; @@ -162,6 +165,8 @@ class CodeMain { services.set(IThemeMainService, new SyncDescriptor(ThemeMainService)); services.set(ISignService, new SyncDescriptor(SignService)); services.set(IStorageKeysSyncRegistryService, new SyncDescriptor(StorageKeysSyncRegistryService)); + services.set(IProductService, { _serviceBrand: undefined, ...product }); + services.set(ITunnelService, new SyncDescriptor(TunnelService)); return [new InstantiationService(services, true), instanceEnvironment, environmentService]; } diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index 7ace2583d75..92027912edc 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -47,6 +47,8 @@ export class SharedProcess implements ISharedProcess { nodeIntegration: true, webgl: false, enableWebSQL: false, + enableRemoteModule: false, + nativeWindowOpen: true, disableBlinkFeatures: 'Auxclick' // do NOT change, allows us to identify this window as shared-process in the process explorer } }); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 0207eb26fce..45064b77ecf 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -36,8 +36,6 @@ import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifec import { IStorageMainService } from 'vs/platform/storage/node/storageMainService'; import { IFileService } from 'vs/platform/files/common/files'; -const RUN_TEXTMATE_IN_WORKER = false; - export interface IWindowCreationOptions { state: IWindowState; extensionDevelopmentPath?: string[]; @@ -91,15 +89,18 @@ export class CodeWindow extends Disposable implements ICodeWindow { private static readonly MAX_URL_LENGTH = 2 * 1024 * 1024; // https://cs.chromium.org/chromium/src/url/url_constants.cc?l=32 + private readonly _onLoad = this._register(new Emitter()); + readonly onLoad = this._onLoad.event; + + private readonly _onReady = this._register(new Emitter()); + readonly onReady = this._onReady.event; + private readonly _onClose = this._register(new Emitter()); readonly onClose = this._onClose.event; private readonly _onDestroy = this._register(new Emitter()); readonly onDestroy = this._onDestroy.event; - private readonly _onLoad = this._register(new Emitter()); - readonly onLoad = this._onLoad.event; - private hiddenTitleBarStyle: boolean | undefined; private showTimeoutHandle: NodeJS.Timeout | undefined; private _lastFocusTime: number; @@ -165,9 +166,10 @@ export class CodeWindow extends Disposable implements ICodeWindow { webPreferences: { preload: URI.parse(this.doGetPreloadUrl()).fsPath, nodeIntegration: true, - nodeIntegrationInWorker: RUN_TEXTMATE_IN_WORKER, webviewTag: true, - enableWebSQL: false + enableWebSQL: false, + enableRemoteModule: false, + nativeWindowOpen: true } }; @@ -346,6 +348,9 @@ export class CodeWindow extends Disposable implements ICodeWindow { while (this.whenReadyCallbacks.length) { this.whenReadyCallbacks.pop()!(this); } + + // Events + this._onReady.fire(); } ready(): Promise { @@ -802,7 +807,14 @@ export class CodeWindow extends Disposable implements ICodeWindow { // fullscreen gets special treatment if (this.isFullScreen) { - const display = screen.getDisplayMatching(this.getBounds()); + let display: Display | undefined; + try { + display = screen.getDisplayMatching(this.getBounds()); + } catch (error) { + // Electron has weird conditions under which it throws errors + // e.g. https://github.com/microsoft/vscode/issues/100334 when + // large numbers are passed in + } const defaultState = defaultWindowState(); @@ -969,8 +981,17 @@ export class CodeWindow extends Disposable implements ICodeWindow { } // Multi Monitor (non-fullscreen): ensure window is within display bounds - const display = screen.getDisplayMatching({ x: state.x, y: state.y, width: state.width, height: state.height }); - const displayWorkingArea = this.getWorkingArea(display); + let display: Display | undefined; + let displayWorkingArea: Rectangle | undefined; + try { + display = screen.getDisplayMatching({ x: state.x, y: state.y, width: state.width, height: state.height }); + displayWorkingArea = this.getWorkingArea(display); + } catch (error) { + // Electron has weird conditions under which it throws errors + // e.g. https://github.com/microsoft/vscode/issues/100334 when + // large numbers are passed in + } + if ( display && // we have a display matching the desired bounds displayWorkingArea && // we have valid working area bounds diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index 81be5f203b3..83a9bc61e54 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -43,7 +43,7 @@ export async function main(argv: string[]): Promise { // Help if (args.help) { - const executable = `${product.applicationName}${os.platform() === 'win32' ? '.exe' : ''}`; + const executable = `${product.applicationName}${isWindows ? '.exe' : ''}`; console.log(buildHelpMessage(product.nameLong, executable, product.version, OPTIONS)); } diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index be5c516895c..9b06d39b0bc 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -36,7 +36,7 @@ import { isPromiseCanceledError } from 'vs/base/common/errors'; import { areSameExtensions, adoptToGalleryExtensionId, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { URI } from 'vs/base/common/uri'; import { getManifest } from 'vs/platform/extensionManagement/node/extensionManagementUtil'; -import { IExtensionManifest, ExtensionType, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; +import { IExtensionManifest, ExtensionType, isLanguagePackExtension, EXTENSION_CATEGORIES } from 'vs/platform/extensions/common/extensions'; import { CancellationToken } from 'vs/base/common/cancellation'; import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; import { Schemas } from 'vs/base/common/network'; @@ -102,8 +102,7 @@ export class Main { private async listExtensions(showVersions: boolean, category?: string): Promise { let extensions = await this.extensionManagementService.getInstalled(ExtensionType.User); - // TODO: we should save this array in a common place so that the command and extensionQuery can use it that way changing it is easier - const categories = ['"programming languages"', 'snippets', 'linters', 'themes', 'debuggers', 'formatters', 'keymaps', '"scm providers"', 'other', '"extension packs"', '"language packs"']; + const categories = EXTENSION_CATEGORIES.map(c => c.toLowerCase()); if (category && category !== '') { if (categories.indexOf(category.toLowerCase()) < 0) { console.log('Invalid category please enter a valid category. To list valid categories run --category without a category specified'); diff --git a/src/vs/editor/browser/controller/coreCommands.ts b/src/vs/editor/browser/controller/coreCommands.ts index f56dff9bd9f..2013ad47528 100644 --- a/src/vs/editor/browser/controller/coreCommands.ts +++ b/src/vs/editor/browser/controller/coreCommands.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import * as types from 'vs/base/common/types'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { Command, EditorCommand, ICommandOptions, registerEditorCommand } from 'vs/editor/browser/editorExtensions'; +import { Command, EditorCommand, ICommandOptions, registerEditorCommand, MultiCommand, UndoCommand, RedoCommand, SelectAllCommand } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ColumnSelection, IColumnSelectResult } from 'vs/editor/common/controller/cursorColumnSelection'; import { CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from 'vs/editor/common/controller/cursorCommon'; @@ -20,7 +20,6 @@ import { Range } from 'vs/editor/common/core/range'; import { Handler, ScrollType } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; -import { MenuId } from 'vs/platform/actions/common/actions'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; @@ -276,6 +275,48 @@ export namespace RevealLine_ { }; } +abstract class EditorOrNativeTextInputCommand { + + constructor(target: MultiCommand) { + // 1. handle case when focus is in editor. + target.addImplementation(10000, (accessor: ServicesAccessor, args: any) => { + // Only if editor text focus (i.e. not if editor has widget focus). + const focusedEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor(); + if (focusedEditor && focusedEditor.hasTextFocus()) { + this.runEditorCommand(accessor, focusedEditor, args); + return true; + } + return false; + }); + + // 2. handle case when focus is in some other `input` / `textarea`. + target.addImplementation(1000, (accessor: ServicesAccessor, args: any) => { + // Only if focused on an element that allows for entering text + const activeElement = document.activeElement; + if (activeElement && ['input', 'textarea'].indexOf(activeElement.tagName.toLowerCase()) >= 0) { + this.runDOMCommand(); + return true; + } + return false; + }); + + // 3. (default) handle case when focus is somewhere else. + target.addImplementation(0, (accessor: ServicesAccessor, args: any) => { + // Redirecting to active editor + const activeEditor = accessor.get(ICodeEditorService).getActiveCodeEditor(); + if (activeEditor) { + activeEditor.focus(); + this.runEditorCommand(accessor, activeEditor, args); + return true; + } + return false; + }); + } + + public abstract runDOMCommand(): void; + public abstract runEditorCommand(accessor: ServicesAccessor | null, editor: ICodeEditor, args: any): void; +} + export namespace CoreNavigationCommands { class BaseMoveToCommand extends CoreEditorCommand { @@ -1594,25 +1635,32 @@ export namespace CoreNavigationCommands { } }); - export const SelectAll: CoreEditorCommand = registerEditorCommand(new class extends CoreEditorCommand { + export const SelectAll = new class extends EditorOrNativeTextInputCommand { constructor() { - super({ - id: 'selectAll', - precondition: undefined - }); + super(SelectAllCommand); + } + public runDOMCommand(): void { + document.execCommand('selectAll'); + } + public runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void { + const viewModel = editor._getViewModel(); + if (!viewModel) { + // the editor has no view => has no cursors + return; + } + this.runCoreEditorCommand(viewModel, args); } - public runCoreEditorCommand(viewModel: IViewModel, args: any): void { viewModel.model.pushStackElement(); viewModel.setCursorStates( - args.source, + 'keyboard', CursorChangeReason.Explicit, [ CursorMoveCommands.selectAll(viewModel, viewModel.getPrimaryCursorState()) ] ); } - }); + }(); export const SetSelection: CoreEditorCommand = registerEditorCommand(new class extends CoreEditorCommand { constructor() { @@ -1655,97 +1703,6 @@ registerColumnSelection(CoreNavigationCommands.CursorColumnSelectPageUp.id, KeyM registerColumnSelection(CoreNavigationCommands.CursorColumnSelectDown.id, KeyMod.Shift | KeyCode.DownArrow); registerColumnSelection(CoreNavigationCommands.CursorColumnSelectPageDown.id, KeyMod.Shift | KeyCode.PageDown); -/** - * A command that will: - * 1. invoke a command on the focused editor. - * 2. otherwise, invoke a browser built-in command on the `activeElement`. - * 3. otherwise, invoke a command on the workbench active editor. - */ -abstract class EditorOrNativeTextInputCommand extends Command { - - public runCommand(accessor: ServicesAccessor, args: any): void { - - const focusedEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor(); - // Only if editor text focus (i.e. not if editor has widget focus). - if (focusedEditor && focusedEditor.hasTextFocus()) { - return this.runEditorCommand(accessor, focusedEditor, args); - } - - // Ignore this action when user is focused on an element that allows for entering text - const activeElement = document.activeElement; - if (activeElement && ['input', 'textarea'].indexOf(activeElement.tagName.toLowerCase()) >= 0) { - return this.runDOMCommand(); - } - - // Redirecting to active editor - const activeEditor = accessor.get(ICodeEditorService).getActiveCodeEditor(); - if (activeEditor) { - activeEditor.focus(); - return this.runEditorCommand(accessor, activeEditor, args); - } - } - - public abstract runDOMCommand(): void; - public abstract runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void; -} - -class SelectAllCommand extends EditorOrNativeTextInputCommand { - constructor() { - super({ - id: 'editor.action.selectAll', - precondition: EditorContextKeys.textInputFocus, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: null, - primary: KeyMod.CtrlCmd | KeyCode.KEY_A - }, - menuOpts: [{ - menuId: MenuId.MenubarSelectionMenu, - group: '1_basic', - title: nls.localize({ key: 'miSelectAll', comment: ['&& denotes a mnemonic'] }, "&&Select All"), - order: 1 - }, { - menuId: MenuId.CommandPalette, - group: '', - title: nls.localize('selectAll', "Select All"), - order: 1 - }] - }); - } - public runDOMCommand(): void { - document.execCommand('selectAll'); - } - public runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void { - args = args || {}; - args.source = 'keyboard'; - CoreNavigationCommands.SelectAll.runEditorCommand(accessor, editor, args); - } -} - -class UndoCommand extends EditorOrNativeTextInputCommand { - public runDOMCommand(): void { - document.execCommand('undo'); - } - public runEditorCommand(accessor: ServicesAccessor | null, editor: ICodeEditor, args: any): void { - if (!editor.hasModel() || editor.getOption(EditorOption.readOnly) === true) { - return; - } - editor.getModel().undo(); - } -} - -class RedoCommand extends EditorOrNativeTextInputCommand { - public runDOMCommand(): void { - document.execCommand('redo'); - } - public runEditorCommand(accessor: ServicesAccessor | null, editor: ICodeEditor, args: any): void { - if (!editor.hasModel() || editor.getOption(EditorOption.readOnly) === true) { - return; - } - editor.getModel().redo(); - } -} - function registerCommand(command: T): T { command.register(); return command; @@ -1881,53 +1838,35 @@ export namespace CoreEditingCommands { } }); - export const Undo: UndoCommand = registerCommand(new UndoCommand({ - id: 'undo', - precondition: EditorContextKeys.writable, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: EditorContextKeys.textInputFocus, - primary: KeyMod.CtrlCmd | KeyCode.KEY_Z - }, - menuOpts: [{ - menuId: MenuId.MenubarEditMenu, - group: '1_do', - title: nls.localize({ key: 'miUndo', comment: ['&& denotes a mnemonic'] }, "&&Undo"), - order: 1 - }, { - menuId: MenuId.CommandPalette, - group: '', - title: nls.localize('undo', "Undo"), - order: 1 - }] - })); + export const Undo = new class extends EditorOrNativeTextInputCommand { + constructor() { + super(UndoCommand); + } + public runDOMCommand(): void { + document.execCommand('undo'); + } + public runEditorCommand(accessor: ServicesAccessor | null, editor: ICodeEditor, args: any): void { + if (!editor.hasModel() || editor.getOption(EditorOption.readOnly) === true) { + return; + } + editor.getModel().undo(); + } + }(); - export const DefaultUndo: UndoCommand = registerCommand(new UndoCommand({ id: 'default:undo', precondition: EditorContextKeys.writable })); - - export const Redo: RedoCommand = registerCommand(new RedoCommand({ - id: 'redo', - precondition: EditorContextKeys.writable, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: EditorContextKeys.textInputFocus, - primary: KeyMod.CtrlCmd | KeyCode.KEY_Y, - secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z], - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z } - }, - menuOpts: [{ - menuId: MenuId.MenubarEditMenu, - group: '1_do', - title: nls.localize({ key: 'miRedo', comment: ['&& denotes a mnemonic'] }, "&&Redo"), - order: 2 - }, { - menuId: MenuId.CommandPalette, - group: '', - title: nls.localize('redo', "Redo"), - order: 1 - }] - })); - - export const DefaultRedo: RedoCommand = registerCommand(new RedoCommand({ id: 'default:redo', precondition: EditorContextKeys.writable })); + export const Redo = new class extends EditorOrNativeTextInputCommand { + constructor() { + super(RedoCommand); + } + public runDOMCommand(): void { + document.execCommand('redo'); + } + public runEditorCommand(accessor: ServicesAccessor | null, editor: ICodeEditor, args: any): void { + if (!editor.hasModel() || editor.getOption(EditorOption.readOnly) === true) { + return; + } + editor.getModel().redo(); + } + }(); } /** @@ -1956,8 +1895,6 @@ class EditorHandlerCommand extends Command { } } -registerCommand(new SelectAllCommand()); - function registerOverwritableCommand(handlerId: string, description?: ICommandHandlerDescription): void { registerCommand(new EditorHandlerCommand('default:' + handlerId, handlerId)); registerCommand(new EditorHandlerCommand(handlerId, handlerId, description)); diff --git a/src/vs/editor/browser/editorExtensions.ts b/src/vs/editor/browser/editorExtensions.ts index faf4f3ebc8d..50a7f678d5a 100644 --- a/src/vs/editor/browser/editorExtensions.ts +++ b/src/vs/editor/browser/editorExtensions.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import { IPosition } from 'vs/base/browser/ui/contextview/contextview'; import { illegalArgument } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; @@ -17,11 +18,13 @@ import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, IContextKeyService, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { IConstructorSignature1, ServicesAccessor as InstantiationServicesAccessor, BrandedService } from 'vs/platform/instantiation/common/instantiation'; -import { IKeybindings, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { IKeybindings, KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { withNullAsUndefined, assertType } from 'vs/base/common/types'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; export type ServicesAccessor = InstantiationServicesAccessor; @@ -139,6 +142,66 @@ export abstract class Command { //#endregion Command +//#region MultiplexingCommand + +/** + * Potential override for a command. + * + * @return `true` if the command was successfully run. This stops other overrides from being executed. + */ +export type CommandImplementation = (accessor: ServicesAccessor, args: unknown) => boolean; + +export class MultiCommand extends Command { + + private readonly _implementations: [number, CommandImplementation][] = []; + + /** + * A higher priority gets to be looked at first + */ + public addImplementation(priority: number, implementation: CommandImplementation): IDisposable { + this._implementations.push([priority, implementation]); + this._implementations.sort((a, b) => b[0] - a[0]); + return { + dispose: () => { + for (let i = 0; i < this._implementations.length; i++) { + if (this._implementations[i][1] === implementation) { + this._implementations.splice(i, 1); + return; + } + } + } + }; + } + + public runCommand(accessor: ServicesAccessor, args: any): void | Promise { + for (const impl of this._implementations) { + if (impl[1](accessor, args)) { + return; + } + } + } +} + +//#endregion + +/** + * A command that delegates to another command's implementation. + * + * This lets different commands be registered but share the same implementation + */ +export class ProxyCommand extends Command { + constructor( + private readonly command: Command, + opts: ICommandOptions + ) { + super(opts); + } + + public runCommand(accessor: ServicesAccessor, args: any): void | Promise { + return this.command.runCommand(accessor, args); + } +} + //#region EditorCommand export interface IContributionCommandOptions extends ICommandOptions { @@ -379,8 +442,10 @@ export function registerEditorCommand(editorCommand: T) return editorCommand; } -export function registerEditorAction(ctor: { new(): EditorAction; }): void { - EditorContributionRegistry.INSTANCE.registerEditorAction(new ctor()); +export function registerEditorAction(ctor: { new(): T; }): T { + const action = new ctor(); + EditorContributionRegistry.INSTANCE.registerEditorAction(action); + return action; } export function registerInstantiatedEditorAction(editorAction: EditorAction): void { @@ -475,3 +540,75 @@ class EditorContributionRegistry { } Registry.add(Extensions.EditorCommonContributions, EditorContributionRegistry.INSTANCE); + +function registerCommand(command: T): T { + command.register(); + return command; +} + +export const UndoCommand = registerCommand(new MultiCommand({ + id: 'undo', + precondition: undefined, + kbOpts: { + weight: KeybindingWeight.EditorCore, + primary: KeyMod.CtrlCmd | KeyCode.KEY_Z + }, + menuOpts: [{ + menuId: MenuId.MenubarEditMenu, + group: '1_do', + title: nls.localize({ key: 'miUndo', comment: ['&& denotes a mnemonic'] }, "&&Undo"), + order: 1 + }, { + menuId: MenuId.CommandPalette, + group: '', + title: nls.localize('undo', "Undo"), + order: 1 + }] +})); + +registerCommand(new ProxyCommand(UndoCommand, { id: 'default:undo', precondition: undefined })); + +export const RedoCommand = registerCommand(new MultiCommand({ + id: 'redo', + precondition: undefined, + kbOpts: { + weight: KeybindingWeight.EditorCore, + primary: KeyMod.CtrlCmd | KeyCode.KEY_Y, + secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z], + mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z } + }, + menuOpts: [{ + menuId: MenuId.MenubarEditMenu, + group: '1_do', + title: nls.localize({ key: 'miRedo', comment: ['&& denotes a mnemonic'] }, "&&Redo"), + order: 2 + }, { + menuId: MenuId.CommandPalette, + group: '', + title: nls.localize('redo', "Redo"), + order: 1 + }] +})); + +registerCommand(new ProxyCommand(RedoCommand, { id: 'default:redo', precondition: undefined })); + +export const SelectAllCommand = registerCommand(new MultiCommand({ + id: 'editor.action.selectAll', + precondition: undefined, + kbOpts: { + weight: KeybindingWeight.EditorCore, + kbExpr: null, + primary: KeyMod.CtrlCmd | KeyCode.KEY_A + }, + menuOpts: [{ + menuId: MenuId.MenubarSelectionMenu, + group: '1_basic', + title: nls.localize({ key: 'miSelectAll', comment: ['&& denotes a mnemonic'] }, "&&Select All"), + order: 1 + }, { + menuId: MenuId.CommandPalette, + group: '', + title: nls.localize('selectAll', "Select All"), + order: 1 + }] +})); diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index 6fc163d9c36..69880b0133d 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { CoreEditorCommand, CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; import { IEditorMouseEvent, IPartialEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; import { ViewUserInputEvents } from 'vs/editor/browser/view/viewUserInputEvents'; import { Position } from 'vs/editor/common/core/position'; @@ -35,8 +35,6 @@ export interface IMouseDispatchData { } export interface ICommandDelegate { - executeEditorCommand(editorCommand: CoreEditorCommand, args: any): void; - paste(text: string, pasteOnNewLine: boolean, multicursorText: string[] | null, mode: string | null): void; type(text: string): void; replacePreviousChar(text: string, replaceCharCnt: number): void; @@ -64,11 +62,6 @@ export class ViewController { this.commandDelegate = commandDelegate; } - private _execMouseCommand(editorCommand: CoreEditorCommand, args: any): void { - args.source = 'mouse'; - this.commandDelegate.executeEditorCommand(editorCommand, args); - } - public paste(text: string, pasteOnNewLine: boolean, multicursorText: string[] | null, mode: string | null): void { this.commandDelegate.paste(text, pasteOnNewLine, multicursorText, mode); } @@ -94,7 +87,7 @@ export class ViewController { } public setSelection(modelSelection: Selection): void { - this.commandDelegate.executeEditorCommand(CoreNavigationCommands.SetSelection, { + CoreNavigationCommands.SetSelection.runCoreEditorCommand(this.viewModel, { source: 'keyboard', selection: modelSelection }); @@ -214,22 +207,24 @@ export class ViewController { private _usualArgs(viewPosition: Position) { viewPosition = this._validateViewColumn(viewPosition); return { + source: 'mouse', position: this._convertViewToModelPosition(viewPosition), viewPosition: viewPosition }; } public moveTo(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.MoveTo, this._usualArgs(viewPosition)); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _moveToSelect(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.MoveToSelect, this._usualArgs(viewPosition)); + CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _columnSelect(viewPosition: Position, mouseColumn: number, doColumnSelect: boolean): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.ColumnSelect, { + CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(this.viewModel, { + source: 'mouse', position: this._convertViewToModelPosition(viewPosition), viewPosition: viewPosition, mouseColumn: mouseColumn, @@ -239,7 +234,8 @@ export class ViewController { private _createCursor(viewPosition: Position, wholeLine: boolean): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.CreateCursor, { + CoreNavigationCommands.CreateCursor.runCoreEditorCommand(this.viewModel, { + source: 'mouse', position: this._convertViewToModelPosition(viewPosition), viewPosition: viewPosition, wholeLine: wholeLine @@ -247,39 +243,39 @@ export class ViewController { } private _lastCursorMoveToSelect(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.LastCursorMoveToSelect, this._usualArgs(viewPosition)); + CoreNavigationCommands.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _wordSelect(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.WordSelect, this._usualArgs(viewPosition)); + CoreNavigationCommands.WordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _wordSelectDrag(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.WordSelectDrag, this._usualArgs(viewPosition)); + CoreNavigationCommands.WordSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _lastCursorWordSelect(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.LastCursorWordSelect, this._usualArgs(viewPosition)); + CoreNavigationCommands.LastCursorWordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _lineSelect(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.LineSelect, this._usualArgs(viewPosition)); + CoreNavigationCommands.LineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _lineSelectDrag(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.LineSelectDrag, this._usualArgs(viewPosition)); + CoreNavigationCommands.LineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _lastCursorLineSelect(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelect, this._usualArgs(viewPosition)); + CoreNavigationCommands.LastCursorLineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _lastCursorLineSelectDrag(viewPosition: Position): void { - this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelectDrag, this._usualArgs(viewPosition)); + CoreNavigationCommands.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(viewPosition)); } private _selectAll(): void { - this._execMouseCommand(CoreNavigationCommands.SelectAll, {}); + CoreNavigationCommands.SelectAll.runCoreEditorCommand(this.viewModel, { source: 'mouse' }); } // ---------------------- diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index f57ab7693d6..e5a0b42db93 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -15,7 +15,6 @@ import { hash } from 'vs/base/common/hash'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { Configuration } from 'vs/editor/browser/config/configuration'; -import { CoreEditorCommand } from 'vs/editor/browser/controller/coreCommands'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { EditorExtensionsRegistry, IEditorContributionDescription } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -1552,9 +1551,6 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE let commandDelegate: ICommandDelegate; if (this.isSimpleWidget) { commandDelegate = { - executeEditorCommand: (editorCommand: CoreEditorCommand, args: any): void => { - editorCommand.runCoreEditorCommand(viewModel, args); - }, paste: (text: string, pasteOnNewLine: boolean, multicursorText: string[] | null, mode: string | null) => { this._paste('keyboard', text, pasteOnNewLine, multicursorText, mode); }, @@ -1576,9 +1572,6 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE }; } else { commandDelegate = { - executeEditorCommand: (editorCommand: CoreEditorCommand, args: any): void => { - editorCommand.runCoreEditorCommand(viewModel, args); - }, paste: (text: string, pasteOnNewLine: boolean, multicursorText: string[] | null, mode: string | null) => { const payload: editorCommon.PastePayload = { text, pasteOnNewLine, multicursorText, mode }; this._commandService.executeCommand(editorCommon.Handler.Paste, payload); @@ -2018,5 +2011,5 @@ registerThemingParticipant((theme, collector) => { } const deprecatedForeground = theme.getColor(editorForeground) || 'inherit'; - collector.addRule(`.monaco-editor .${ClassName.EditorDeprecatedInlineDecoration} { text-decoration: line-through; text-decoration-color: ${deprecatedForeground}}`); + collector.addRule(`.monaco-editor.showDeprecated .${ClassName.EditorDeprecatedInlineDecoration} { text-decoration: line-through; text-decoration-color: ${deprecatedForeground}}`); }); diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 954af2fa4f2..7977140a494 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -503,8 +503,13 @@ const editorConfiguration: IConfigurationNode = { description: nls.localize('wordBasedSuggestions', "Controls whether completions should be computed based on words in the document.") }, 'editor.semanticHighlighting.enabled': { - type: 'boolean', - default: true, + enum: [true, false, 'configuredByTheme'], + enumDescriptions: [ + nls.localize('semanticHighlighting.true', 'Semantic highlighting enabled for all color themes.'), + nls.localize('semanticHighlighting.false', 'Semantic highlighting disabled for all color themes.'), + nls.localize('semanticHighlighting.configuredByTheme', 'Semantic highlighting is configured by the current color theme\'s `semanticHighlighting` setting.') + ], + default: 'configuredByTheme', description: nls.localize('semanticHighlighting.enabled', "Controls whether the semanticHighlighting is shown for the languages that support it.") }, 'editor.stablePeek': { diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 90511cd1879..f5c0a077c63 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -594,6 +594,10 @@ export interface IEditorOptions { * Defaults to false. */ definitionLinkOpensInPeek?: boolean; + /** + * Controls strikethrough deprecated variables. + */ + showDeprecated?: boolean; } export interface IEditorConstructionOptions extends IEditorOptions { @@ -1213,22 +1217,28 @@ class EditorClassName extends ComputedEditorOption 1) { - movedToPreviousLine = true; lineNumber = lineNumber - 1; column = model.getLineMaxColumn(lineNumber); } @@ -176,17 +174,6 @@ export class WordOperations { let prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, column)); if (wordNavigationType === WordNavigationType.WordStart) { - - if (prevWordOnLine && !movedToPreviousLine) { - // Special case for Visual Studio compatibility: - // when starting in the trim whitespace at the end of a line, - // go to the end of the last word - const lastWhitespaceColumn = model.getLineLastNonWhitespaceColumn(lineNumber); - if (lastWhitespaceColumn < column) { - return new Position(lineNumber, prevWordOnLine.end + 1); - } - } - return new Position(lineNumber, prevWordOnLine ? prevWordOnLine.start + 1 : 1); } diff --git a/src/vs/editor/common/editorAction.ts b/src/vs/editor/common/editorAction.ts index d8a1e71ade2..055a67fbd15 100644 --- a/src/vs/editor/common/editorAction.ts +++ b/src/vs/editor/common/editorAction.ts @@ -41,7 +41,6 @@ export class InternalEditorAction implements IEditorAction { return Promise.resolve(undefined); } - const r = this._run(); - return r ? r : Promise.resolve(undefined); + return this._run(); } } diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index f0bed5ad098..d3b414ce03b 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -35,7 +35,7 @@ import { VSBufferReadableStream, VSBuffer } from 'vs/base/common/buffer'; import { TokensStore, MultilineTokens, countEOL, MultilineTokens2, TokensStore2 } from 'vs/editor/common/model/tokensStore'; import { Color } from 'vs/base/common/color'; import { EditorTheme } from 'vs/editor/common/view/viewContext'; -import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; +import { IUndoRedoService, ResourceEditStackSnapshot } from 'vs/platform/undoRedo/common/undoRedo'; import { TextChange } from 'vs/editor/common/model/textChange'; import { Constants } from 'vs/base/common/uint'; @@ -278,6 +278,7 @@ export class TextModel extends Disposable implements model.ITextModel { * Unlike, versionId, this can go down (via undo) or go to previous values (via redo) */ private _alternativeVersionId: number; + private _initialUndoRedoSnapshot: ResourceEditStackSnapshot | null; private readonly _isTooLargeForSyncing: boolean; private readonly _isTooLargeForTokenization: boolean; @@ -351,6 +352,7 @@ export class TextModel extends Disposable implements model.ITextModel { this._versionId = 1; this._alternativeVersionId = 1; + this._initialUndoRedoSnapshot = null; this._isDisposed = false; this._isDisposing = false; @@ -719,6 +721,11 @@ export class TextModel extends Disposable implements model.ITextModel { return this._alternativeVersionId; } + public getInitialUndoRedoSnapshot(): ResourceEditStackSnapshot | null { + this._assertNotDisposed(); + return this._initialUndoRedoSnapshot; + } + public getOffsetAt(rawPosition: IPosition): number { this._assertNotDisposed(); let position = this._validatePosition(rawPosition.lineNumber, rawPosition.column, StringOffsetValidationType.Relaxed); @@ -744,6 +751,10 @@ export class TextModel extends Disposable implements model.ITextModel { this._alternativeVersionId = newAlternativeVersionId; } + public _overwriteInitialUndoRedoSnapshot(newInitialUndoRedoSnapshot: ResourceEditStackSnapshot | null): void { + this._initialUndoRedoSnapshot = newInitialUndoRedoSnapshot; + } + public getValue(eol?: model.EndOfLinePreference, preserveBOM: boolean = false): string { this._assertNotDisposed(); const fullModelRange = this.getFullModelRange(); @@ -1187,6 +1198,9 @@ export class TextModel extends Disposable implements model.ITextModel { try { this._onDidChangeDecorations.beginDeferredEmit(); this._eventEmitter.beginDeferredEmit(); + if (this._initialUndoRedoSnapshot === null) { + this._initialUndoRedoSnapshot = this._undoRedoService.createSnapshot(this.uri); + } this._commandManager.pushEOL(eol); } finally { this._eventEmitter.endDeferredEmit(); @@ -1311,6 +1325,9 @@ export class TextModel extends Disposable implements model.ITextModel { this._trimAutoWhitespaceLines = null; } + if (this._initialUndoRedoSnapshot === null) { + this._initialUndoRedoSnapshot = this._undoRedoService.createSnapshot(this.uri); + } return this._commandManager.pushEditOperation(beforeCursorState, editOperations, cursorStateComputer); } diff --git a/src/vs/editor/common/model/textModelSearch.ts b/src/vs/editor/common/model/textModelSearch.ts index ce5b545c6f9..8ebfdd22216 100644 --- a/src/vs/editor/common/model/textModelSearch.ts +++ b/src/vs/editor/common/model/textModelSearch.ts @@ -548,8 +548,12 @@ export class Searcher { if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) { if (matchLength === 0) { // the search result is an empty string and won't advance `regex.lastIndex`, so `regex.exec` will stuck here - // we attempt to recover from that by advancing by one - this._searchRegex.lastIndex += 1; + // we attempt to recover from that by advancing by two if surrogate pair found and by one otherwise + if (strings.getNextCodePoint(text, textLength, this._searchRegex.lastIndex) > 0xFFFF) { + this._searchRegex.lastIndex += 2; + } else { + this._searchRegex.lastIndex += 1; + } continue; } // Exit early if the regex matches the same range twice diff --git a/src/vs/editor/common/modes/languageSelector.ts b/src/vs/editor/common/modes/languageSelector.ts index 4cf93dc4d23..f3bbac42f8e 100644 --- a/src/vs/editor/common/modes/languageSelector.ts +++ b/src/vs/editor/common/modes/languageSelector.ts @@ -5,6 +5,7 @@ import { IRelativePattern, match as matchGlobPattern } from 'vs/base/common/glob'; import { URI } from 'vs/base/common/uri'; // TODO@Alex +import { normalize } from 'vs/base/common/path'; export interface LanguageFilter { language?: string; @@ -83,7 +84,19 @@ export function score(selector: LanguageSelector | undefined, candidateUri: URI, } if (pattern) { - if (pattern === candidateUri.fsPath || matchGlobPattern(pattern, candidateUri.fsPath)) { + let normalizedPattern: string | IRelativePattern; + if (typeof pattern === 'string') { + normalizedPattern = pattern; + } else { + // Since this pattern has a `base` property, we need + // to normalize this path first before passing it on + // because we will compare it against `Uri.fsPath` + // which uses platform specific separators. + // Refs: https://github.com/microsoft/vscode/issues/99938 + normalizedPattern = { ...pattern, base: normalize(pattern.base) }; + } + + if (normalizedPattern === candidateUri.fsPath || matchGlobPattern(normalizedPattern, candidateUri.fsPath)) { ret = 10; } else { return 0; diff --git a/src/vs/editor/common/modes/linkComputer.ts b/src/vs/editor/common/modes/linkComputer.ts index f3097d5f6f4..c0ca979fb9b 100644 --- a/src/vs/editor/common/modes/linkComputer.ts +++ b/src/vs/editor/common/modes/linkComputer.ts @@ -154,7 +154,7 @@ function getClassifier(): CharacterClassifier { if (_classifier === null) { _classifier = new CharacterClassifier(CharacterClass.None); - const FORCE_TERMINATION_CHARACTERS = ' \t<>\'\"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…'; + const FORCE_TERMINATION_CHARACTERS = ' \t<>\'\"、。。、,.:;‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…'; for (let i = 0; i < FORCE_TERMINATION_CHARACTERS.length; i++) { _classifier.set(FORCE_TERMINATION_CHARACTERS.charCodeAt(i), CharacterClass.ForceTermination); } diff --git a/src/vs/editor/common/services/editorWorkerServiceImpl.ts b/src/vs/editor/common/services/editorWorkerServiceImpl.ts index bb4470fd96d..3ee2f5ad182 100644 --- a/src/vs/editor/common/services/editorWorkerServiceImpl.ts +++ b/src/vs/editor/common/services/editorWorkerServiceImpl.ts @@ -22,6 +22,7 @@ import { regExpFlags } from 'vs/base/common/strings'; import { isNonEmptyArray } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; import { StopWatch } from 'vs/base/common/stopwatch'; +import { canceled } from 'vs/base/common/errors'; /** * Stop syncing a model to the worker if it was not needed for 1 min. @@ -380,6 +381,7 @@ export class EditorWorkerClient extends Disposable { private _worker: IWorkerClient | null; private readonly _workerFactory: DefaultWorkerFactory; private _modelManager: EditorModelManager | null; + private _disposed = false; constructor(modelService: IModelService, keepIdleModels: boolean, label: string | undefined) { super(); @@ -427,6 +429,9 @@ export class EditorWorkerClient extends Disposable { } protected _withSyncedResources(resources: URI[]): Promise { + if (this._disposed) { + return Promise.reject(canceled()); + } return this._getProxy().then((proxy) => { this._getOrCreateModelManager(proxy).ensureSyncedResources(resources); return proxy; @@ -495,4 +500,9 @@ export class EditorWorkerClient extends Disposable { return proxy.navigateValueSet(resource.toString(), range, up, wordDef, wordDefFlags); }); } + + dispose(): void { + super.dispose(); + this._disposed = true; + } } diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 1c1969d3a33..576a7dd4ce8 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -24,14 +24,14 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ILogService } from 'vs/platform/log/common/log'; -import { IUndoRedoService, IUndoRedoElement, IPastFutureElements } from 'vs/platform/undoRedo/common/undoRedo'; +import { IUndoRedoService, IUndoRedoElement, IPastFutureElements, ResourceEditStackSnapshot } from 'vs/platform/undoRedo/common/undoRedo'; import { StringSHA1 } from 'vs/base/common/hash'; import { SingleModelEditStackElement, MultiModelEditStackElement, EditStackElement, isEditStackElement } from 'vs/editor/common/model/editStack'; import { Schemas } from 'vs/base/common/network'; import { SemanticTokensProviderStyling, toMultilineTokens2 } from 'vs/editor/common/services/semanticTokensProviderStyling'; export interface IEditorSemanticHighlightingOptions { - enabled?: boolean; + enabled: true | false | 'configuredByTheme'; } function MODEL_ID(resource: URI): string { @@ -51,7 +51,7 @@ function computeModelSha1(model: ITextModel): string { class ModelData implements IDisposable { - public readonly model: ITextModel; + public readonly model: TextModel; private _languageSelection: ILanguageSelection | null; private _languageSelectionListener: IDisposable | null; @@ -59,7 +59,7 @@ class ModelData implements IDisposable { private readonly _modelEventListeners = new DisposableStore(); constructor( - model: ITextModel, + model: TextModel, onWillDispose: (model: ITextModel) => void, onDidChangeLanguage: (model: ITextModel, e: IModelLanguageChangedEvent) => void ) { @@ -138,6 +138,7 @@ function isEditStackElements(elements: IUndoRedoElement[]): elements is EditStac class DisposedModelInfo { constructor( public readonly uri: URI, + public readonly initialUndoRedoSnapshot: ResourceEditStackSnapshot | null, public readonly time: number, public readonly sharesUndoRedoStack: boolean, public readonly heapSize: number, @@ -362,7 +363,9 @@ export class ModelServiceImpl extends Disposable implements IModelService { while (disposedModels.length > 0 && this._disposedModelsHeapSize > maxModelsHeapSize) { const disposedModel = disposedModels.shift()!; this._removeDisposedModel(disposedModel.uri); - this._undoRedoService.removeElements(disposedModel.uri); + if (disposedModel.initialUndoRedoSnapshot !== null) { + this._undoRedoService.restoreSnapshot(disposedModel.initialUndoRedoSnapshot); + } } } } @@ -390,9 +393,12 @@ export class ModelServiceImpl extends Disposable implements IModelService { if (sha1IsEqual) { model._overwriteVersionId(disposedModelData.versionId); model._overwriteAlternativeVersionId(disposedModelData.alternativeVersionId); + model._overwriteInitialUndoRedoSnapshot(disposedModelData.initialUndoRedoSnapshot); } } else { - this._undoRedoService.removeElements(resource); + if (disposedModelData.initialUndoRedoSnapshot !== null) { + this._undoRedoService.restoreSnapshot(disposedModelData.initialUndoRedoSnapshot); + } } } const modelId = MODEL_ID(model.uri); @@ -541,7 +547,10 @@ export class ModelServiceImpl extends Disposable implements IModelService { if (!maintainUndoRedoStack) { if (!sharesUndoRedoStack) { - this._undoRedoService.removeElements(resource); + const initialUndoRedoSnapshot = modelData.model.getInitialUndoRedoSnapshot(); + if (initialUndoRedoSnapshot !== null) { + this._undoRedoService.restoreSnapshot(initialUndoRedoSnapshot); + } } modelData.model.dispose(); return; @@ -550,7 +559,10 @@ export class ModelServiceImpl extends Disposable implements IModelService { const maxMemory = ModelServiceImpl.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK; if (!sharesUndoRedoStack && heapSize > maxMemory) { // the undo stack for this file would never fit in the configured memory, so don't bother with it. - this._undoRedoService.removeElements(resource); + const initialUndoRedoSnapshot = modelData.model.getInitialUndoRedoSnapshot(); + if (initialUndoRedoSnapshot !== null) { + this._undoRedoService.restoreSnapshot(initialUndoRedoSnapshot); + } modelData.model.dispose(); return; } @@ -559,7 +571,7 @@ export class ModelServiceImpl extends Disposable implements IModelService { // We only invalidate the elements, but they remain in the undo-redo service. this._undoRedoService.setElementsValidFlag(resource, false, (element) => (isEditStackElement(element) && element.matchesResource(resource))); - this._insertDisposedModel(new DisposedModelInfo(resource, Date.now(), sharesUndoRedoStack, heapSize, computeModelSha1(model), model.getVersionId(), model.getAlternativeVersionId())); + this._insertDisposedModel(new DisposedModelInfo(resource, modelData.model.getInitialUndoRedoSnapshot(), Date.now(), sharesUndoRedoStack, heapSize, computeModelSha1(model), model.getVersionId(), model.getAlternativeVersionId())); modelData.model.dispose(); } @@ -621,11 +633,11 @@ export interface ILineSequence { export const SEMANTIC_HIGHLIGHTING_SETTING_ID = 'editor.semanticHighlighting'; export function isSemanticColoringEnabled(model: ITextModel, themeService: IThemeService, configurationService: IConfigurationService): boolean { - if (!themeService.getColorTheme().semanticHighlighting) { - return false; + const setting = configurationService.getValue(SEMANTIC_HIGHLIGHTING_SETTING_ID, { overrideIdentifier: model.getLanguageIdentifier().language, resource: model.uri })?.enabled; + if (typeof setting === 'boolean') { + return setting; } - const options = configurationService.getValue(SEMANTIC_HIGHLIGHTING_SETTING_ID, { overrideIdentifier: model.getLanguageIdentifier().language, resource: model.uri }); - return Boolean(options && options.enabled); + return themeService.getColorTheme().semanticHighlighting; } class SemanticColoringFeature extends Disposable { diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index 49e24e9eac5..b1832df3859 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -279,11 +279,12 @@ export enum EditorOption { wordWrapMinified = 109, wrappingIndent = 110, wrappingStrategy = 111, - editorClassName = 112, - pixelRatio = 113, - tabFocusMode = 114, - layoutInfo = 115, - wrappingInfo = 116 + showDeprecated = 112, + editorClassName = 113, + pixelRatio = 114, + tabFocusMode = 115, + layoutInfo = 116, + wrappingInfo = 117 } /** diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index 3e72f30d0de..0964eac915f 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -210,12 +210,12 @@ export class ViewLayout extends Disposable implements IViewLayout { const width = layoutInfo.contentWidth; const height = layoutInfo.height; const scrollDimensions = this._scrollable.getScrollDimensions(); - const scrollWidth = scrollDimensions.scrollWidth; + const contentWidth = scrollDimensions.contentWidth; this._scrollable.setScrollDimensions(new EditorScrollDimensions( width, scrollDimensions.contentWidth, height, - this._getContentHeight(width, height, scrollWidth) + this._getContentHeight(width, height, contentWidth) )); } else { this._updateHeight(); @@ -250,14 +250,14 @@ export class ViewLayout extends Disposable implements IViewLayout { return scrollbar.horizontalScrollbarSize; } - private _getContentHeight(width: number, height: number, scrollWidth: number): number { + private _getContentHeight(width: number, height: number, contentWidth: number): number { const options = this._configuration.options; let result = this._linesLayout.getLinesTotalHeight(); if (options.get(EditorOption.scrollBeyondLastLine)) { result += height - options.get(EditorOption.lineHeight); } else { - result += this._getHorizontalScrollbarHeight(width, scrollWidth); + result += this._getHorizontalScrollbarHeight(width, contentWidth); } return result; @@ -267,12 +267,12 @@ export class ViewLayout extends Disposable implements IViewLayout { const scrollDimensions = this._scrollable.getScrollDimensions(); const width = scrollDimensions.width; const height = scrollDimensions.height; - const scrollWidth = scrollDimensions.scrollWidth; + const contentWidth = scrollDimensions.contentWidth; this._scrollable.setScrollDimensions(new EditorScrollDimensions( width, scrollDimensions.contentWidth, height, - this._getContentHeight(width, height, scrollWidth) + this._getContentHeight(width, height, contentWidth) )); } diff --git a/src/vs/editor/contrib/clipboard/clipboard.ts b/src/vs/editor/contrib/clipboard/clipboard.ts index 4ad6007754a..114004565c5 100644 --- a/src/vs/editor/contrib/clipboard/clipboard.ts +++ b/src/vs/editor/contrib/clipboard/clipboard.ts @@ -9,7 +9,7 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import { CopyOptions } from 'vs/editor/browser/controller/textAreaInput'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { EditorAction, IActionOptions, ICommandKeybindingsOptions, registerEditorAction } from 'vs/editor/browser/editorExtensions'; +import { EditorAction, registerEditorAction, Command, MultiCommand } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { MenuId } from 'vs/platform/actions/common/actions'; @@ -28,171 +28,108 @@ const supportsCopyWithSyntaxHighlighting = (supportsCopy && !browser.isEdge); // privileges to actually perform the action const supportsPaste = (platform.isNative || (!browser.isChrome && document.queryCommandSupported('paste'))); -type ExecCommand = 'cut' | 'copy' | 'paste'; - -abstract class ExecCommandAction extends EditorAction { - - private readonly browserCommand: ExecCommand; - - constructor(browserCommand: ExecCommand, opts: IActionOptions) { - super(opts); - this.browserCommand = browserCommand; - } - - public runCommand(accessor: ServicesAccessor, args: any): void { - let focusedEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor(); - // Only if editor text focus (i.e. not if editor has widget focus). - if (focusedEditor && focusedEditor.hasTextFocus()) { - focusedEditor.trigger('keyboard', this.id, args); - return; - } - - document.execCommand(this.browserCommand); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - editor.focus(); - document.execCommand(this.browserCommand); - } +function registerCommand(command: T): T { + command.register(); + return command; } -class ExecCommandCutAction extends ExecCommandAction { - - constructor() { - let kbOpts: ICommandKeybindingsOptions | undefined = { - kbExpr: EditorContextKeys.textInputFocus, +export const CutAction = supportsCut ? registerCommand(new MultiCommand({ + id: 'editor.action.clipboardCutAction', + precondition: undefined, + kbOpts: ( + // Do not bind cut keybindings in the browser, + // since browsers do that for us and it avoids security prompts + platform.isNative ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_X, win: { primary: KeyMod.CtrlCmd | KeyCode.KEY_X, secondary: [KeyMod.Shift | KeyCode.Delete] }, weight: KeybindingWeight.EditorContrib - }; - // Do not bind cut keybindings in the browser, + } : undefined + ), + menuOpts: [{ + menuId: MenuId.MenubarEditMenu, + group: '2_ccp', + title: nls.localize({ key: 'miCut', comment: ['&& denotes a mnemonic'] }, "Cu&&t"), + order: 1 + }, { + menuId: MenuId.EditorContext, + group: CLIPBOARD_CONTEXT_MENU_GROUP, + title: nls.localize('actions.clipboard.cutLabel', "Cut"), + when: EditorContextKeys.writable, + order: 1, + }, { + menuId: MenuId.CommandPalette, + group: '', + title: nls.localize('actions.clipboard.cutLabel', "Cut"), + order: 1 + }] +})) : undefined; + +export const CopyAction = supportsCopy ? registerCommand(new MultiCommand({ + id: 'editor.action.clipboardCopyAction', + precondition: undefined, + kbOpts: ( + // Do not bind copy keybindings in the browser, // since browsers do that for us and it avoids security prompts - if (!platform.isNative) { - kbOpts = undefined; - } - super('cut', { - id: 'editor.action.clipboardCutAction', - label: nls.localize('actions.clipboard.cutLabel', "Cut"), - alias: 'Cut', - precondition: EditorContextKeys.writable, - kbOpts: kbOpts, - contextMenuOpts: { - group: CLIPBOARD_CONTEXT_MENU_GROUP, - order: 1 - }, - menuOpts: { - menuId: MenuId.MenubarEditMenu, - group: '2_ccp', - title: nls.localize({ key: 'miCut', comment: ['&& denotes a mnemonic'] }, "Cu&&t"), - order: 1 - } - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - if (!editor.hasModel()) { - return; - } - - const emptySelectionClipboard = editor.getOption(EditorOption.emptySelectionClipboard); - - if (!emptySelectionClipboard && editor.getSelection().isEmpty()) { - return; - } - - super.run(accessor, editor); - } -} - -class ExecCommandCopyAction extends ExecCommandAction { - - constructor() { - let kbOpts: ICommandKeybindingsOptions | undefined = { - kbExpr: EditorContextKeys.textInputFocus, + platform.isNative ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_C, win: { primary: KeyMod.CtrlCmd | KeyCode.KEY_C, secondary: [KeyMod.CtrlCmd | KeyCode.Insert] }, weight: KeybindingWeight.EditorContrib - }; - // Do not bind copy keybindings in the browser, + } : undefined + ), + menuOpts: [{ + menuId: MenuId.MenubarEditMenu, + group: '2_ccp', + title: nls.localize({ key: 'miCopy', comment: ['&& denotes a mnemonic'] }, "&&Copy"), + order: 2 + }, { + menuId: MenuId.EditorContext, + group: CLIPBOARD_CONTEXT_MENU_GROUP, + title: nls.localize('actions.clipboard.copyLabel', "Copy"), + order: 2, + }, { + menuId: MenuId.CommandPalette, + group: '', + title: nls.localize('actions.clipboard.copyLabel', "Copy"), + order: 1 + }] +})) : undefined; + +export const PasteAction = supportsPaste ? registerCommand(new MultiCommand({ + id: 'editor.action.clipboardPasteAction', + precondition: undefined, + kbOpts: ( + // Do not bind paste keybindings in the browser, // since browsers do that for us and it avoids security prompts - if (!platform.isNative) { - kbOpts = undefined; - } - - super('copy', { - id: 'editor.action.clipboardCopyAction', - label: nls.localize('actions.clipboard.copyLabel', "Copy"), - alias: 'Copy', - precondition: undefined, - kbOpts: kbOpts, - contextMenuOpts: { - group: CLIPBOARD_CONTEXT_MENU_GROUP, - order: 2 - }, - menuOpts: { - menuId: MenuId.MenubarEditMenu, - group: '2_ccp', - title: nls.localize({ key: 'miCopy', comment: ['&& denotes a mnemonic'] }, "&&Copy"), - order: 2 - } - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - if (!editor.hasModel()) { - return; - } - - const emptySelectionClipboard = editor.getOption(EditorOption.emptySelectionClipboard); - - if (!emptySelectionClipboard && editor.getSelection().isEmpty()) { - return; - } - - super.run(accessor, editor); - } -} - -class ExecCommandPasteAction extends ExecCommandAction { - - constructor() { - let kbOpts: ICommandKeybindingsOptions | undefined = { - kbExpr: EditorContextKeys.textInputFocus, + platform.isNative ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_V, win: { primary: KeyMod.CtrlCmd | KeyCode.KEY_V, secondary: [KeyMod.Shift | KeyCode.Insert] }, linux: { primary: KeyMod.CtrlCmd | KeyCode.KEY_V, secondary: [KeyMod.Shift | KeyCode.Insert] }, weight: KeybindingWeight.EditorContrib - }; - // Do not bind paste keybindings in the browser, - // since browsers do that for us and it avoids security prompts - if (!platform.isNative) { - kbOpts = undefined; - } + } : undefined + ), + menuOpts: [{ + menuId: MenuId.MenubarEditMenu, + group: '2_ccp', + title: nls.localize({ key: 'miPaste', comment: ['&& denotes a mnemonic'] }, "&&Paste"), + order: 3 + }, { + menuId: MenuId.EditorContext, + group: CLIPBOARD_CONTEXT_MENU_GROUP, + title: nls.localize('actions.clipboard.pasteLabel', "Paste"), + when: EditorContextKeys.writable, + order: 3, + }, { + menuId: MenuId.CommandPalette, + group: '', + title: nls.localize('actions.clipboard.pasteLabel', "Paste"), + order: 1 + }] +})) : undefined; - super('paste', { - id: 'editor.action.clipboardPasteAction', - label: nls.localize('actions.clipboard.pasteLabel', "Paste"), - alias: 'Paste', - precondition: EditorContextKeys.writable, - kbOpts: kbOpts, - contextMenuOpts: { - group: CLIPBOARD_CONTEXT_MENU_GROUP, - order: 3 - }, - menuOpts: { - menuId: MenuId.MenubarEditMenu, - group: '2_ccp', - title: nls.localize({ key: 'miPaste', comment: ['&& denotes a mnemonic'] }, "&&Paste"), - order: 3 - } - }); - } -} - -class ExecCommandCopyWithSyntaxHighlightingAction extends ExecCommandAction { +class ExecCommandCopyWithSyntaxHighlightingAction extends EditorAction { constructor() { - super('copy', { + super({ id: 'editor.action.clipboardCopyWithSyntaxHighlightingAction', label: nls.localize('actions.clipboard.copyWithSyntaxHighlightingLabel', "Copy With Syntax Highlighting"), alias: 'Copy With Syntax Highlighting', @@ -217,20 +154,48 @@ class ExecCommandCopyWithSyntaxHighlightingAction extends ExecCommandAction { } CopyOptions.forceCopyWithSyntaxHighlighting = true; - super.run(accessor, editor); + editor.focus(); + document.execCommand('copy'); CopyOptions.forceCopyWithSyntaxHighlighting = false; } } -if (supportsCut) { - registerEditorAction(ExecCommandCutAction); -} -if (supportsCopy) { - registerEditorAction(ExecCommandCopyAction); -} -if (supportsPaste) { - registerEditorAction(ExecCommandPasteAction); +function registerExecCommandImpl(target: MultiCommand | undefined, browserCommand: 'cut' | 'copy' | 'paste'): void { + if (!target) { + return; + } + + // 1. handle case when focus is in editor. + target.addImplementation(10000, (accessor: ServicesAccessor, args: any) => { + // Only if editor text focus (i.e. not if editor has widget focus). + const focusedEditor = accessor.get(ICodeEditorService).getFocusedCodeEditor(); + if (focusedEditor && focusedEditor.hasTextFocus()) { + if (browserCommand === 'cut' || browserCommand === 'copy') { + // Do not execute if there is no selection and empty selection clipboard is off + const emptySelectionClipboard = focusedEditor.getOption(EditorOption.emptySelectionClipboard); + const selection = focusedEditor.getSelection(); + if (selection && selection.isEmpty() && !emptySelectionClipboard) { + return true; + } + } + document.execCommand(browserCommand); + return true; + } + return false; + }); + + // 2. (default) handle case when focus is somewhere else. + target.addImplementation(0, (accessor: ServicesAccessor, args: any) => { + // Only if editor text focus (i.e. not if editor has widget focus). + document.execCommand(browserCommand); + return true; + }); } + +registerExecCommandImpl(CutAction, 'cut'); +registerExecCommandImpl(CopyAction, 'copy'); +registerExecCommandImpl(PasteAction, 'paste'); + if (supportsCopyWithSyntaxHighlighting) { registerEditorAction(ExecCommandCopyWithSyntaxHighlightingAction); } diff --git a/src/vs/editor/contrib/codeAction/codeAction.ts b/src/vs/editor/contrib/codeAction/codeAction.ts index b9e30b80525..f54e722566e 100644 --- a/src/vs/editor/contrib/codeAction/codeAction.ts +++ b/src/vs/editor/contrib/codeAction/codeAction.ts @@ -73,6 +73,9 @@ class ManagedCodeActionSet extends Disposable implements CodeActionSet { } } + +const emptyCodeActionsResponse = { actions: [] as modes.CodeAction[], documentation: undefined }; + export function getCodeActions( model: ITextModel, rangeOrSelection: Range | Selection, @@ -100,7 +103,7 @@ export function getCodeActions( } if (cts.token.isCancellationRequested) { - return { actions: [] as modes.CodeAction[], documentation: undefined }; + return emptyCodeActionsResponse; } const filteredActions = (providedCodeActions?.actions || []).filter(action => action && filtersAction(filter, action)); @@ -111,7 +114,7 @@ export function getCodeActions( throw err; } onUnexpectedExternalError(err); - return { actions: [] as modes.CodeAction[], documentation: undefined }; + return emptyCodeActionsResponse; } }); diff --git a/src/vs/editor/contrib/codeAction/codeActionModel.ts b/src/vs/editor/contrib/codeAction/codeActionModel.ts index fc35f1398ed..4afe90c451e 100644 --- a/src/vs/editor/contrib/codeAction/codeActionModel.ts +++ b/src/vs/editor/contrib/codeAction/codeActionModel.ts @@ -214,8 +214,8 @@ export class CodeActionModel extends Disposable { } const actions = createCancelablePromise(token => getCodeActions(model, trigger.selection, trigger.trigger, Progress.None, token)); - if (this._progressService && trigger.trigger.type === CodeActionTriggerType.Manual) { - this._progressService.showWhile(actions, 250); + if (trigger.trigger.type === CodeActionTriggerType.Manual) { + this._progressService?.showWhile(actions, 250); } this.setState(new CodeActionsState.Triggered(trigger.trigger, trigger.selection, trigger.position, actions)); diff --git a/src/vs/editor/contrib/colorPicker/colorDetector.ts b/src/vs/editor/contrib/colorPicker/colorDetector.ts index 90f0db8ac67..4b678d0edda 100644 --- a/src/vs/editor/contrib/colorPicker/colorDetector.ts +++ b/src/vs/editor/contrib/colorPicker/colorDetector.ts @@ -173,7 +173,7 @@ export class ColorDetector extends Disposable implements IEditorContribution { for (let i = 0; i < colorData.length && decorations.length < MAX_DECORATORS; i++) { const { red, green, blue, alpha } = colorData[i].colorInfo.color; const rgba = new RGBA(Math.round(red * 255), Math.round(green * 255), Math.round(blue * 255), alpha); - let subKey = hash(rgba).toString(16); + let subKey = hash(`rgba(${rgba.r},${rgba.g},${rgba.b},${rgba.a})`).toString(16); let color = `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`; let key = 'colorBox-' + subKey; diff --git a/src/vs/editor/contrib/find/findController.ts b/src/vs/editor/contrib/find/findController.ts index 8d2f6668924..712501a3933 100644 --- a/src/vs/editor/contrib/find/findController.ts +++ b/src/vs/editor/contrib/find/findController.ts @@ -255,7 +255,7 @@ export class CommonFindController extends Disposable implements IEditorContribut // overwritten in subclass } - protected _start(opts: IFindStartOptions): void { + protected async _start(opts: IFindStartOptions): Promise { this.disposeModel(); if (!this._editor.hasModel()) { @@ -279,7 +279,13 @@ export class CommonFindController extends Disposable implements IEditorContribut } if (!stateChanges.searchString && opts.seedSearchStringFromGlobalClipboard) { - let selectionSearchString = this.getGlobalBufferTerm(); + let selectionSearchString = await this.getGlobalBufferTerm(); + + if (!this._editor.hasModel()) { + // the editor has lost its model in the meantime + return; + } + if (selectionSearchString) { stateChanges.searchString = selectionSearchString; } @@ -308,8 +314,8 @@ export class CommonFindController extends Disposable implements IEditorContribut } } - public start(opts: IFindStartOptions): void { - this._start(opts); + public start(opts: IFindStartOptions): Promise { + return this._start(opts); } public moveToNextMatch(): boolean { @@ -353,24 +359,25 @@ export class CommonFindController extends Disposable implements IEditorContribut return false; } - public getGlobalBufferTerm(): string { + public async getGlobalBufferTerm(): Promise { if (this._editor.getOption(EditorOption.find).globalFindClipboard && this._clipboardService && this._editor.hasModel() && !this._editor.getModel().isTooLargeForSyncing() ) { - return this._clipboardService.readFindTextSync(); + return this._clipboardService.readFindText(); } return ''; } - public setGlobalBufferTerm(text: string) { + public setGlobalBufferTerm(text: string): void { if (this._editor.getOption(EditorOption.find).globalFindClipboard && this._clipboardService && this._editor.hasModel() && !this._editor.getModel().isTooLargeForSyncing() ) { - this._clipboardService.writeFindTextSync(text); + // intentionally not awaited + this._clipboardService.writeFindText(text); } } } @@ -396,7 +403,7 @@ export class FindController extends CommonFindController implements IFindControl this._findOptionsWidget = null; } - protected _start(opts: IFindStartOptions): void { + protected async _start(opts: IFindStartOptions): Promise { if (!this._widget) { this._createFindWidget(); } @@ -422,12 +429,14 @@ export class FindController extends CommonFindController implements IFindControl opts.updateSearchScope = updateSearchScope; - super._start(opts); + await super._start(opts); - if (opts.shouldFocus === FindStartFocusAction.FocusReplaceInput) { - this._widget!.focusReplaceInput(); - } else if (opts.shouldFocus === FindStartFocusAction.FocusFindInput) { - this._widget!.focusFindInput(); + if (this._widget) { + if (opts.shouldFocus === FindStartFocusAction.FocusReplaceInput) { + this._widget.focusReplaceInput(); + } else if (opts.shouldFocus === FindStartFocusAction.FocusFindInput) { + this._widget.focusFindInput(); + } } } @@ -470,10 +479,10 @@ export class StartFindAction extends EditorAction { }); } - public run(accessor: ServicesAccessor | null, editor: ICodeEditor): void { + public async run(accessor: ServicesAccessor | null, editor: ICodeEditor): Promise { let controller = CommonFindController.get(editor); if (controller) { - controller.start({ + await controller.start({ forceRevealReplace: false, seedSearchStringFromSelection: editor.getOption(EditorOption.find).seedSearchStringFromSelection, seedSearchStringFromGlobalClipboard: editor.getOption(EditorOption.find).globalFindClipboard, @@ -505,10 +514,10 @@ export class StartFindWithSelectionAction extends EditorAction { }); } - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + public async run(accessor: ServicesAccessor, editor: ICodeEditor): Promise { let controller = CommonFindController.get(editor); if (controller) { - controller.start({ + await controller.start({ forceRevealReplace: false, seedSearchStringFromSelection: true, seedSearchStringFromGlobalClipboard: false, @@ -523,10 +532,10 @@ export class StartFindWithSelectionAction extends EditorAction { } } export abstract class MatchFindAction extends EditorAction { - public run(accessor: ServicesAccessor | null, editor: ICodeEditor): void { + public async run(accessor: ServicesAccessor | null, editor: ICodeEditor): Promise { let controller = CommonFindController.get(editor); if (controller && !this._run(controller)) { - controller.start({ + await controller.start({ forceRevealReplace: false, seedSearchStringFromSelection: (controller.getState().searchString.length === 0) && editor.getOption(EditorOption.find).seedSearchStringFromSelection, seedSearchStringFromGlobalClipboard: true, @@ -629,7 +638,7 @@ export class PreviousMatchFindAction2 extends MatchFindAction { } export abstract class SelectionMatchFindAction extends EditorAction { - public run(accessor: ServicesAccessor | null, editor: ICodeEditor): void { + public async run(accessor: ServicesAccessor | null, editor: ICodeEditor): Promise { let controller = CommonFindController.get(editor); if (!controller) { return; @@ -639,7 +648,7 @@ export abstract class SelectionMatchFindAction extends EditorAction { controller.setSearchString(selectionSearchString); } if (!this._run(controller)) { - controller.start({ + await controller.start({ forceRevealReplace: false, seedSearchStringFromSelection: editor.getOption(EditorOption.find).seedSearchStringFromSelection, seedSearchStringFromGlobalClipboard: false, @@ -720,7 +729,7 @@ export class StartFindReplaceAction extends EditorAction { }); } - public run(accessor: ServicesAccessor | null, editor: ICodeEditor): void { + public async run(accessor: ServicesAccessor | null, editor: ICodeEditor): Promise { if (!editor.hasModel() || editor.getOption(EditorOption.readOnly)) { return; } @@ -745,7 +754,7 @@ export class StartFindReplaceAction extends EditorAction { if (controller) { - controller.start({ + await controller.start({ forceRevealReplace: true, seedSearchStringFromSelection: seedSearchStringFromSelection, seedSearchStringFromGlobalClipboard: editor.getOption(EditorOption.find).seedSearchStringFromSelection, diff --git a/src/vs/editor/contrib/find/findModel.ts b/src/vs/editor/contrib/find/findModel.ts index 4bae68d1b1b..eca1f89f2e7 100644 --- a/src/vs/editor/contrib/find/findModel.ts +++ b/src/vs/editor/contrib/find/findModel.ts @@ -262,6 +262,13 @@ export class FindModelBoundToEditorModel { private _moveToPrevMatch(before: Position, isRecursed: boolean = false): void { if (!this._state.canNavigateBack()) { + // we are beyond the first matched find result + // instead of doing nothing, we should refocus the first item + const nextMatchRange = this._decorations.matchAfterPosition(before); + + if (nextMatchRange) { + this._setCurrentFindMatch(nextMatchRange); + } return; } if (this._decorations.getCount() < MATCHES_LIMIT) { @@ -350,6 +357,13 @@ export class FindModelBoundToEditorModel { private _moveToNextMatch(after: Position): void { if (!this._state.canNavigateForward()) { + // we are beyond the last matched find result + // instead of doing nothing, we should refocus the last item + const prevMatchRange = this._decorations.matchBeforePosition(after); + + if (prevMatchRange) { + this._setCurrentFindMatch(prevMatchRange); + } return; } if (this._decorations.getCount() < MATCHES_LIMIT) { diff --git a/src/vs/editor/contrib/find/findWidget.ts b/src/vs/editor/contrib/find/findWidget.ts index b9d0f1d8794..82af435546f 100644 --- a/src/vs/editor/contrib/find/findWidget.ts +++ b/src/vs/editor/contrib/find/findWidget.ts @@ -52,7 +52,7 @@ export const findNextMatchIcon = registerIcon('find-next-match', Codicon.arrowDo export interface IFindController { replace(): void; replaceAll(): void; - getGlobalBufferTerm(): string; + getGlobalBufferTerm(): Promise; } const NLS_FIND_INPUT_LABEL = nls.localize('label.find', "Find"); @@ -224,9 +224,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL this._updateToggleSelectionFindButton(); } })); - this._register(this._codeEditor.onDidFocusEditorWidget(() => { + this._register(this._codeEditor.onDidFocusEditorWidget(async () => { if (this._isVisible) { - let globalBufferTerm = this._controller.getGlobalBufferTerm(); + let globalBufferTerm = await this._controller.getGlobalBufferTerm(); if (globalBufferTerm && globalBufferTerm !== this._state.searchString) { this._state.change({ searchString: globalBufferTerm }, true); this._findInput.select(); diff --git a/src/vs/editor/contrib/find/test/findController.test.ts b/src/vs/editor/contrib/find/test/findController.test.ts index 44895a2d658..eaac102b78c 100644 --- a/src/vs/editor/contrib/find/test/findController.test.ts +++ b/src/vs/editor/contrib/find/test/findController.test.ts @@ -14,7 +14,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { CommonFindController, FindStartFocusAction, IFindStartOptions, NextMatchFindAction, NextSelectionMatchFindAction, StartFindAction, StartFindReplaceAction } from 'vs/editor/contrib/find/findController'; import { CONTEXT_FIND_INPUT_FOCUSED } from 'vs/editor/contrib/find/findModel'; -import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; +import { withAsyncTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -39,8 +39,8 @@ export class TestFindController extends CommonFindController { this.hasFocus = false; } - protected _start(opts: IFindStartOptions): void { - super._start(opts); + protected async _start(opts: IFindStartOptions): Promise { + await super._start(opts); if (opts.shouldFocus !== FindStartFocusAction.NoFocusChange) { this.hasFocus = true; @@ -55,7 +55,7 @@ function fromSelection(slc: Selection): number[] { return [slc.startLineNumber, slc.startColumn, slc.endLineNumber, slc.endColumn]; } -suite('FindController', () => { +suite('FindController', async () => { let queryState: { [key: string]: any; } = {}; let clipboardState = ''; let serviceCollection = new ServiceCollection(); @@ -77,13 +77,13 @@ suite('FindController', () => { }); } - /* test('stores to the global clipboard buffer on start find action', () => { - withTestCodeEditor([ + /* test('stores to the global clipboard buffer on start find action', async () => { + await withAsyncTestCodeEditor([ 'ABC', 'ABC', 'XYZ', 'ABC' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; if (!platform.isMacintosh) { assert.ok(true); @@ -101,13 +101,13 @@ suite('FindController', () => { }); }); - test('reads from the global clipboard buffer on next find action if buffer exists', () => { - withTestCodeEditor([ + test('reads from the global clipboard buffer on next find action if buffer exists', async () => { + await withAsyncTestCodeEditor([ 'ABC', 'ABC', 'XYZ', 'ABC' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = 'ABC'; if (!platform.isMacintosh) { @@ -128,13 +128,13 @@ suite('FindController', () => { }); }); - test('writes to the global clipboard buffer when text changes', () => { - withTestCodeEditor([ + test('writes to the global clipboard buffer when text changes', async () => { + await withAsyncTestCodeEditor([ 'ABC', 'ABC', 'XYZ', 'ABC' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; if (!platform.isMacintosh) { assert.ok(true); @@ -152,13 +152,13 @@ suite('FindController', () => { }); }); */ - test('issue #1857: F3, Find Next, acts like "Find Under Cursor"', () => { - withTestCodeEditor([ + test('issue #1857: F3, Find Next, acts like "Find Under Cursor"', async () => { + await withAsyncTestCodeEditor([ 'ABC', 'ABC', 'XYZ', 'ABC' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; // The cursor is at the very top, of the file, at the first ABC let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); @@ -167,7 +167,7 @@ suite('FindController', () => { let nextMatchFindAction = new NextMatchFindAction(); // I hit Ctrl+F to show the Find dialog - startFindAction.run(null, editor); + await startFindAction.run(null, editor); // I type ABC. findState.change({ searchString: 'A' }, true); @@ -201,7 +201,7 @@ suite('FindController', () => { assert.deepEqual(fromSelection(editor.getSelection()!), [1, 4, 1, 4]); // I hit F3 to "Find Next" to find the next occurrence of ABC, but instead it searches for XYZ. - nextMatchFindAction.run(null, editor); + await nextMatchFindAction.run(null, editor); assert.equal(findState.searchString, 'ABC'); assert.equal(findController.hasFocus, false); @@ -210,10 +210,10 @@ suite('FindController', () => { }); }); - test('issue #3090: F3 does not loop with two matches on a single line', () => { - withTestCodeEditor([ + test('issue #3090: F3 does not loop with two matches on a single line', async () => { + await withAsyncTestCodeEditor([ 'import nls = require(\'vs/nls\');' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); let nextMatchFindAction = new NextMatchFindAction(); @@ -223,22 +223,22 @@ suite('FindController', () => { column: 9 }); - nextMatchFindAction.run(null, editor); + await nextMatchFindAction.run(null, editor); assert.deepEqual(fromSelection(editor.getSelection()!), [1, 26, 1, 29]); - nextMatchFindAction.run(null, editor); + await nextMatchFindAction.run(null, editor); assert.deepEqual(fromSelection(editor.getSelection()!), [1, 8, 1, 11]); findController.dispose(); }); }); - test('issue #6149: Auto-escape highlighted text for search and replace regex mode', () => { - withTestCodeEditor([ + test('issue #6149: Auto-escape highlighted text for search and replace regex mode', async () => { + await withAsyncTestCodeEditor([ 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); let startFindAction = new StartFindAction(); @@ -247,22 +247,22 @@ suite('FindController', () => { editor.setSelection(new Selection(1, 9, 1, 13)); findController.toggleRegex(); - startFindAction.run(null, editor); + await startFindAction.run(null, editor); - nextMatchFindAction.run(null, editor); + await nextMatchFindAction.run(null, editor); assert.deepEqual(fromSelection(editor.getSelection()!), [2, 9, 2, 13]); - nextMatchFindAction.run(null, editor); + await nextMatchFindAction.run(null, editor); assert.deepEqual(fromSelection(editor.getSelection()!), [1, 9, 1, 13]); findController.dispose(); }); }); - test('issue #41027: Don\'t replace find input value on replace action if find input is active', () => { - withTestCodeEditor([ + test('issue #41027: Don\'t replace find input value on replace action if find input is active', async () => { + await withAsyncTestCodeEditor([ 'test', - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { let testRegexString = 'tes.'; let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); let nextMatchFindAction = new NextMatchFindAction(); @@ -270,7 +270,7 @@ suite('FindController', () => { findController.toggleRegex(); findController.setSearchString(testRegexString); - findController.start({ + await findController.start({ forceRevealReplace: false, seedSearchStringFromSelection: false, seedSearchStringFromGlobalClipboard: false, @@ -279,8 +279,8 @@ suite('FindController', () => { updateSearchScope: false, loop: true }); - nextMatchFindAction.run(null, editor); - startFindReplaceAction.run(null, editor); + await nextMatchFindAction.run(null, editor); + await startFindReplaceAction.run(null, editor); assert.equal(findController.getState().searchString, testRegexString); @@ -288,15 +288,15 @@ suite('FindController', () => { }); }); - test('issue #9043: Clear search scope when find widget is hidden', () => { - withTestCodeEditor([ + test('issue #9043: Clear search scope when find widget is hidden', async () => { + await withAsyncTestCodeEditor([ 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); - findController.start({ + await findController.start({ forceRevealReplace: false, seedSearchStringFromSelection: false, seedSearchStringFromGlobalClipboard: false, @@ -319,15 +319,15 @@ suite('FindController', () => { }); }); - test('issue #18111: Regex replace with single space replaces with no space', () => { - withTestCodeEditor([ + test('issue #18111: Regex replace with single space replaces with no space', async () => { + await withAsyncTestCodeEditor([ 'HRESULT OnAmbientPropertyChange(DISPID dispid);' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); let startFindAction = new StartFindAction(); - startFindAction.run(null, editor); + await startFindAction.run(null, editor); findController.getState().change({ searchString: '\\b\\s{3}\\b', replaceString: ' ', isRegex: true }, false); findController.moveToNextMatch(); @@ -344,17 +344,17 @@ suite('FindController', () => { }); }); - test('issue #24714: Regular expression with ^ in search & replace', () => { - withTestCodeEditor([ + test('issue #24714: Regular expression with ^ in search & replace', async () => { + await withAsyncTestCodeEditor([ '', 'line2', 'line3' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); let startFindAction = new StartFindAction(); - startFindAction.run(null, editor); + await startFindAction.run(null, editor); findController.getState().change({ searchString: '^', replaceString: 'x', isRegex: true }, false); findController.moveToNextMatch(); @@ -371,12 +371,12 @@ suite('FindController', () => { }); }); - test('issue #38232: Find Next Selection, regex enabled', () => { - withTestCodeEditor([ + test('issue #38232: Find Next Selection, regex enabled', async () => { + await withAsyncTestCodeEditor([ '([funny]', '', '([funny]' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); let nextSelectionMatchFindAction = new NextSelectionMatchFindAction(); @@ -388,7 +388,7 @@ suite('FindController', () => { editor.setSelection(new Selection(1, 1, 1, 9)); // cmd+f3 - nextSelectionMatchFindAction.run(null, editor); + await nextSelectionMatchFindAction.run(null, editor); assert.deepEqual(editor.getSelections()!.map(fromSelection), [ [3, 1, 3, 9] @@ -398,19 +398,19 @@ suite('FindController', () => { }); }); - test('issue #38232: Find Next Selection, regex enabled, find widget open', () => { - withTestCodeEditor([ + test('issue #38232: Find Next Selection, regex enabled, find widget open', async () => { + await withAsyncTestCodeEditor([ '([funny]', '', '([funny]' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { clipboardState = ''; let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); let startFindAction = new StartFindAction(); let nextSelectionMatchFindAction = new NextSelectionMatchFindAction(); // cmd+f - open find widget - startFindAction.run(null, editor); + await startFindAction.run(null, editor); // toggle regex findController.getState().change({ isRegex: true }, false); @@ -419,7 +419,7 @@ suite('FindController', () => { editor.setSelection(new Selection(1, 1, 1, 9)); // cmd+f3 - nextSelectionMatchFindAction.run(null, editor); + await nextSelectionMatchFindAction.run(null, editor); assert.deepEqual(editor.getSelections()!.map(fromSelection), [ [3, 1, 3, 9] @@ -430,7 +430,7 @@ suite('FindController', () => { }); }); -suite('FindController query options persistence', () => { +suite('FindController query options persistence', async () => { let queryState: { [key: string]: any; } = {}; queryState['editor.isRegex'] = false; queryState['editor.matchCase'] = false; @@ -447,13 +447,13 @@ suite('FindController query options persistence', () => { remove: () => undefined } as any); - test('matchCase', () => { - withTestCodeEditor([ + test('matchCase', async () => { + await withAsyncTestCodeEditor([ 'abc', 'ABC', 'XYZ', 'ABC' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { queryState = { 'editor.isRegex': false, 'editor.matchCase': true, 'editor.wholeWord': false }; // The cursor is at the very top, of the file, at the first ABC let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); @@ -461,7 +461,7 @@ suite('FindController query options persistence', () => { let startFindAction = new StartFindAction(); // I hit Ctrl+F to show the Find dialog - startFindAction.run(null, editor); + await startFindAction.run(null, editor); // I type ABC. findState.change({ searchString: 'ABC' }, true); @@ -474,13 +474,13 @@ suite('FindController query options persistence', () => { queryState = { 'editor.isRegex': false, 'editor.matchCase': false, 'editor.wholeWord': true }; - test('wholeWord', () => { - withTestCodeEditor([ + test('wholeWord', async () => { + await withAsyncTestCodeEditor([ 'ABC', 'AB', 'XYZ', 'ABC' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { queryState = { 'editor.isRegex': false, 'editor.matchCase': false, 'editor.wholeWord': true }; // The cursor is at the very top, of the file, at the first ABC let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); @@ -488,7 +488,7 @@ suite('FindController query options persistence', () => { let startFindAction = new StartFindAction(); // I hit Ctrl+F to show the Find dialog - startFindAction.run(null, editor); + await startFindAction.run(null, editor); // I type AB. findState.change({ searchString: 'AB' }, true); @@ -499,13 +499,13 @@ suite('FindController query options persistence', () => { }); }); - test('toggling options is saved', () => { - withTestCodeEditor([ + test('toggling options is saved', async () => { + await withAsyncTestCodeEditor([ 'ABC', 'AB', 'XYZ', 'ABC' - ], { serviceCollection: serviceCollection }, (editor) => { + ], { serviceCollection: serviceCollection }, async (editor) => { queryState = { 'editor.isRegex': false, 'editor.matchCase': false, 'editor.wholeWord': true }; // The cursor is at the very top, of the file, at the first ABC let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); @@ -516,17 +516,17 @@ suite('FindController query options persistence', () => { }); }); - test('issue #27083: Update search scope once find widget becomes visible', () => { - withTestCodeEditor([ + test('issue #27083: Update search scope once find widget becomes visible', async () => { + await withAsyncTestCodeEditor([ 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'always', globalFindClipboard: false } }, (editor) => { + ], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'always', globalFindClipboard: false } }, async (editor) => { // clipboardState = ''; editor.setSelection(new Range(1, 1, 2, 1)); let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); - findController.start({ + await findController.start({ forceRevealReplace: false, seedSearchStringFromSelection: false, seedSearchStringFromGlobalClipboard: false, @@ -540,17 +540,17 @@ suite('FindController query options persistence', () => { }); }); - test('issue #58604: Do not update searchScope if it is empty', () => { - withTestCodeEditor([ + test('issue #58604: Do not update searchScope if it is empty', async () => { + await withAsyncTestCodeEditor([ 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'always', globalFindClipboard: false } }, (editor) => { + ], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'always', globalFindClipboard: false } }, async (editor) => { // clipboardState = ''; editor.setSelection(new Range(1, 2, 1, 2)); let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); - findController.start({ + await findController.start({ forceRevealReplace: false, seedSearchStringFromSelection: false, seedSearchStringFromGlobalClipboard: false, @@ -564,17 +564,17 @@ suite('FindController query options persistence', () => { }); }); - test('issue #58604: Update searchScope if it is not empty', () => { - withTestCodeEditor([ + test('issue #58604: Update searchScope if it is not empty', async () => { + await withAsyncTestCodeEditor([ 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'always', globalFindClipboard: false } }, (editor) => { + ], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'always', globalFindClipboard: false } }, async (editor) => { // clipboardState = ''; editor.setSelection(new Range(1, 2, 1, 3)); let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); - findController.start({ + await findController.start({ forceRevealReplace: false, seedSearchStringFromSelection: false, seedSearchStringFromGlobalClipboard: false, @@ -589,17 +589,17 @@ suite('FindController query options persistence', () => { }); - test('issue #27083: Find in selection when multiple lines are selected', () => { - withTestCodeEditor([ + test('issue #27083: Find in selection when multiple lines are selected', async () => { + await withAsyncTestCodeEditor([ 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'multiline', globalFindClipboard: false } }, (editor) => { + ], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'multiline', globalFindClipboard: false } }, async (editor) => { // clipboardState = ''; editor.setSelection(new Range(1, 6, 2, 1)); let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController); - findController.start({ + await findController.start({ forceRevealReplace: false, seedSearchStringFromSelection: false, seedSearchStringFromGlobalClipboard: false, diff --git a/src/vs/editor/contrib/gotoSymbol/goToCommands.ts b/src/vs/editor/contrib/gotoSymbol/goToCommands.ts index 678b0836338..232aab8d0f8 100644 --- a/src/vs/editor/contrib/gotoSymbol/goToCommands.ts +++ b/src/vs/editor/contrib/gotoSymbol/goToCommands.ts @@ -722,9 +722,10 @@ CommandsRegistry.registerCommand({ { name: 'position', description: 'The position at which to start', constraint: corePosition.Position.isIPosition }, { name: 'locations', description: 'An array of locations.', constraint: Array }, { name: 'multiple', description: 'Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto' }, + { name: 'noResultsMessage', description: 'Human readable message that shows when locations is empty.' }, ] }, - handler: async (accessor: ServicesAccessor, resource: any, position: any, references: any, multiple?: any, openInPeek?: boolean) => { + handler: async (accessor: ServicesAccessor, resource: any, position: any, references: any, multiple?: any, noResultsMessage?: string, openInPeek?: boolean) => { assertType(URI.isUri(resource)); assertType(corePosition.Position.isIPosition(position)); assertType(Array.isArray(references)); @@ -739,7 +740,16 @@ CommandsRegistry.registerCommand({ editor.revealPositionInCenterIfOutsideViewport(position, ScrollType.Smooth); return editor.invokeWithinContext(accessor => { - const command = new GenericGoToLocationAction({ muteMessage: true, openInPeek: Boolean(openInPeek), openToSide: false }, references, multiple as GoToLocationValues); + const command = new class extends GenericGoToLocationAction { + _getNoResultFoundMessage(info: IWordAtPosition | null) { + return noResultsMessage || super._getNoResultFoundMessage(info); + } + }({ + muteMessage: !Boolean(noResultsMessage), + openInPeek: Boolean(openInPeek), + openToSide: false + }, references, multiple as GoToLocationValues); + accessor.get(IInstantiationService).invokeFunction(command.run.bind(command), editor); }); } @@ -758,7 +768,7 @@ CommandsRegistry.registerCommand({ ] }, handler: async (accessor: ServicesAccessor, resource: any, position: any, references: any, multiple?: any) => { - accessor.get(ICommandService).executeCommand('editor.action.goToLocations', resource, position, references, multiple, true); + accessor.get(ICommandService).executeCommand('editor.action.goToLocations', resource, position, references, multiple, undefined, true); } }); diff --git a/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts b/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts index 5b2cf38d15f..49fa98ec1cd 100644 --- a/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts +++ b/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts @@ -6,7 +6,6 @@ import 'vs/css!./referencesWidget'; import * as dom from 'vs/base/browser/dom'; import { IMouseEvent } from 'vs/base/browser/mouseEvent'; -import { GestureEvent } from 'vs/base/browser/touch'; import { Orientation } from 'vs/base/browser/ui/sash/sash'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; @@ -317,6 +316,8 @@ export class ReferenceWidget extends peekView.PeekViewWidget { accessibilityProvider: new AccessibilityProvider(), keyboardNavigationLabelProvider: this._instantiationService.createInstance(StringRepresentationProvider), identityProvider: new IdentityProvider(), + openOnSingleClick: true, + openOnFocus: true, overrideStyles: { listBackground: peekView.peekViewResultsBackground } @@ -372,22 +373,13 @@ export class ReferenceWidget extends peekView.PeekViewWidget { this._onDidSelectReference.fire({ element, kind, source: 'tree' }); } }; - this._tree.onDidChangeFocus(e => { - onEvent(e.elements[0], 'show'); - }); this._tree.onDidOpen(e => { - if (e.browserEvent instanceof MouseEvent && (e.browserEvent.ctrlKey || e.browserEvent.metaKey || e.browserEvent.altKey)) { - // modifier-click -> open to the side - onEvent(e.elements[0], 'side'); - } else if (e.browserEvent instanceof KeyboardEvent || (e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2) || (e.browserEvent).tapCount === 2) { - // keybinding (list service command) - // OR double click - // OR double tap - // -> close widget and goto target - onEvent(e.elements[0], 'goto'); + if (e.sideBySide) { + onEvent(e.element, 'side'); + } else if (e.editorOptions.pinned) { + onEvent(e.element, 'goto'); } else { - // preview location - onEvent(e.elements[0], 'show'); + onEvent(e.element, 'show'); } }); diff --git a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts b/src/vs/editor/contrib/multicursor/test/multicursor.test.ts index c40fa2be7a6..8b25ecac5e1 100644 --- a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts +++ b/src/vs/editor/contrib/multicursor/test/multicursor.test.ts @@ -70,7 +70,8 @@ suite('Multicursor selection', () => { remove: (key) => undefined, logStorage: () => undefined, migrate: (toWorkspace) => Promise.resolve(undefined), - flush: () => undefined + flush: () => undefined, + isNew: () => true } as IStorageService); test('issue #8817: Cursor position changes when you cancel multicursor', () => { diff --git a/src/vs/editor/contrib/peekView/media/peekViewWidget.css b/src/vs/editor/contrib/peekView/media/peekViewWidget.css index d0e9bc3c552..e6b5ccb09f2 100644 --- a/src/vs/editor/contrib/peekView/media/peekViewWidget.css +++ b/src/vs/editor/contrib/peekView/media/peekViewWidget.css @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ .monaco-editor .peekview-widget .head { - box-sizing: border-box; + box-sizing: border-box; display: flex; } @@ -14,6 +14,7 @@ font-size: 13px; margin-left: 20px; cursor: pointer; + min-width: 0; } .monaco-editor .peekview-widget .head .peekview-title .dirname:not(:empty) { @@ -25,6 +26,15 @@ white-space: nowrap; } +.monaco-editor .peekview-widget .head .peekview-title .dirname { + white-space: nowrap; +} + +.monaco-editor .peekview-widget .head .peekview-title .filename { + overflow: hidden; + text-overflow: ellipsis; +} + .monaco-editor .peekview-widget .head .peekview-title .meta:not(:empty)::before { content: '-'; padding: 0 0.3em; diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 3956148566d..ef7dd00a99c 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -159,7 +159,7 @@ class ItemRenderer implements IListRenderer { const options = this.editor.getOptions(); @@ -321,7 +321,7 @@ class SuggestionDetails { this.header = append(this.body, $('.header')); this.close = append(this.header, $('span' + Codicon.close.cssSelector)); - this.close.title = nls.localize('readLess', "Read less...{0}", this.kbToggleDetails); + this.close.title = nls.localize('readLess', "Read Less ({0})", this.kbToggleDetails); this.type = append(this.header, $('p.type')); this.docs = append(this.body, $('p.docs')); @@ -605,7 +605,6 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate false }, mouseSupport: false, accessibilityProvider: { getRole: () => 'option', diff --git a/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts index ee38c0c8146..eadfa9ed3d8 100644 --- a/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts @@ -167,7 +167,7 @@ suite('WordOperations', () => { test('cursorWordStartLeft', () => { // This is the behaviour observed in Visual Studio, please do not touch test - const EXPECTED = ['| |/* |Just |some |more |text |a|+= |3 |+|5|-|3 |+ |7 |*/| '].join('\n'); + const EXPECTED = ['| |/* |Just |some |more |text |a|+= |3 |+|5|-|3 |+ |7 |*/ '].join('\n'); const [text,] = deserializePipePositions(EXPECTED); const actualStops = testRepeatedActionAndExtractPositions( text, diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index 6ff1f85c8f7..b8a1b848968 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -115,9 +115,12 @@ export interface IGlobalEditorOptions { wordBasedSuggestions?: boolean; /** * Controls whether the semanticHighlighting is shown for the languages that support it. - * Defaults to true. + * true: semanticHighlighting is enabled for all themes + * false: semanticHighlighting is disabled for all themes + * 'configuredByTheme': semanticHighlighting is controlled by the current color theme's semanticHighlighting setting. + * Defaults to 'byTheme'. */ - 'semanticHighlighting.enabled'?: boolean; + 'semanticHighlighting.enabled'?: true | false | 'configuredByTheme'; /** * Keep peek editors open even when double clicking their content or when hitting `Escape`. * Defaults to false. diff --git a/src/vs/editor/test/browser/controller/inputRecorder.html b/src/vs/editor/test/browser/controller/inputRecorder.html index 3f538b8a04f..65d8a39c59a 100644 --- a/src/vs/editor/test/browser/controller/inputRecorder.html +++ b/src/vs/editor/test/browser/controller/inputRecorder.html @@ -31,14 +31,14 @@ var RECORDED_EVENTS = []; var input = document.getElementById('input'); -var blackListedProps = [ +var blockedProperties = [ 'currentTarget', 'path', 'srcElement', 'target', 'view' ]; -blackListedProps = blackListedProps.concat([ +blockedProperties = blockedProperties.concat([ 'AT_TARGET', 'BLUR', 'BUBBLING_PHASE', @@ -68,7 +68,7 @@ blackListedProps = blackListedProps.concat([ function toSerializable(e) { var r = {}; for (var k in e) { - if (blackListedProps.indexOf(k) >= 0) { + if (blockedProperties.indexOf(k) >= 0) { continue; } if (typeof e[k] === 'function') { @@ -112,4 +112,4 @@ document.getElementById('stop').onclick = function() { - \ No newline at end of file + diff --git a/src/vs/editor/test/browser/testCodeEditor.ts b/src/vs/editor/test/browser/testCodeEditor.ts index 183f79e20f2..63d9faaa6b3 100644 --- a/src/vs/editor/test/browser/testCodeEditor.ts +++ b/src/vs/editor/test/browser/testCodeEditor.ts @@ -96,6 +96,24 @@ export function withTestCodeEditor(text: string | string[] | null, options: Test editor.dispose(); } +export async function withAsyncTestCodeEditor(text: string | string[] | null, options: TestCodeEditorCreationOptions, callback: (editor: ITestCodeEditor, viewModel: ViewModel) => Promise): Promise { + // create a model if necessary and remember it in order to dispose it. + if (!options.model) { + if (typeof text === 'string') { + options.model = createTextModel(text); + } else if (text) { + options.model = createTextModel(text.join('\n')); + } + } + + const editor = createTestCodeEditor(options); + const viewModel = editor.getViewModel()!; + viewModel.setHasFocus(true); + await callback(editor, editor.getViewModel()!); + + editor.dispose(); +} + export function createTestCodeEditor(options: TestCodeEditorCreationOptions): ITestCodeEditor { const model = options.model; diff --git a/src/vs/editor/test/common/model/textModelSearch.test.ts b/src/vs/editor/test/common/model/textModelSearch.test.ts index e5af37e781b..715cd3032b5 100644 --- a/src/vs/editor/test/common/model/textModelSearch.test.ts +++ b/src/vs/editor/test/common/model/textModelSearch.test.ts @@ -781,4 +781,29 @@ suite('TextModelSearch', () => { model.dispose(); }); + + test('issue #100134. Zero-length matches should properly step over surrogate pairs', () => { + // 1[Laptop]1 - there shoud be no matches inside of [Laptop] emoji + assertFindMatches('1\uD83D\uDCBB1', '()', true, false, null, + [ + [1, 1, 1, 1], + [1, 2, 1, 2], + [1, 4, 1, 4], + [1, 5, 1, 5], + + ] + ); + // 1[Hacker Cat]1 = 1[Cat Face][ZWJ][Laptop]1 - there shoud be matches between emoji and ZWJ + // there shoud be no matches inside of [Cat Face] and [Laptop] emoji + assertFindMatches('1\uD83D\uDC31\u200D\uD83D\uDCBB1', '()', true, false, null, + [ + [1, 1, 1, 1], + [1, 2, 1, 2], + [1, 4, 1, 4], + [1, 5, 1, 5], + [1, 7, 1, 7], + [1, 8, 1, 8] + ] + ); + }); }); diff --git a/src/vs/editor/test/common/modes/languageSelector.test.ts b/src/vs/editor/test/common/modes/languageSelector.test.ts index 5ae99749ad5..0886c65bbee 100644 --- a/src/vs/editor/test/common/modes/languageSelector.test.ts +++ b/src/vs/editor/test/common/modes/languageSelector.test.ts @@ -104,4 +104,15 @@ suite('LanguageSelector', function () { let value = score(selector, URI.parse('file:///C:/Users/zlhe/Desktop/test.interface.json'), 'json', true); assert.equal(value, 10); }); + + test('Document selector match - platform paths #99938', function () { + let selector = { + pattern: { + base: '/home/user/Desktop', + pattern: '*.json' + } + }; + let value = score(selector, URI.file('/home/user/Desktop/test.json'), 'json', true); + assert.equal(value, 10); + }); }); diff --git a/src/vs/editor/test/common/modes/linkComputer.test.ts b/src/vs/editor/test/common/modes/linkComputer.test.ts index 9ed515c2a2e..9cf9ca77c2f 100644 --- a/src/vs/editor/test/common/modes/linkComputer.test.ts +++ b/src/vs/editor/test/common/modes/linkComputer.test.ts @@ -223,4 +223,11 @@ suite('Editor Modes - Link Computer', () => { ' https://foo.bar/[this is foo site] ' ); }); + + test('issue #100353: Link detection stops at &(double-byte)', () => { + assertLink( + 'aa http://tree-mark.chips.jp/レーズン&ベリーミックス aa', + ' http://tree-mark.chips.jp/レーズン&ベリーミックス ' + ); + }); }); diff --git a/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules.ts b/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules.ts index 8ad60864350..7222048074e 100644 --- a/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules.ts +++ b/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules.ts @@ -18,7 +18,7 @@ export const javascriptOnEnterRules = [ }, { // e.g. * ...| beforeText: /^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/, - oneLineAboveText: /^(\s*(\/\*\*|\*)).*/, + oneLineAboveText: /(?=^(\s*(\/\*\*|\*)).*)(?=(?!(\s*\*\/)))/, action: { indentAction: IndentAction.None, appendText: '* ' } }, { // e.g. */| diff --git a/src/vs/editor/test/common/modes/supports/onEnter.test.ts b/src/vs/editor/test/common/modes/supports/onEnter.test.ts index 6fc397d62fe..f799c66e76e 100644 --- a/src/vs/editor/test/common/modes/supports/onEnter.test.ts +++ b/src/vs/editor/test/common/modes/supports/onEnter.test.ts @@ -118,6 +118,7 @@ suite('OnEnter', () => { testIndentAction(' *', ' * asdfsfagadfg * / * / * /*', '', IndentAction.None, '* '); testIndentAction('', ' */', '', IndentAction.None, null, 1); + testIndentAction(' */', ' * test() {', '', IndentAction.Indent, null, 0); testIndentAction('', '\t */', '', IndentAction.None, null, 1); testIndentAction('', '\t\t */', '', IndentAction.None, null, 1); testIndentAction('', ' */', '', IndentAction.None, null, 1); diff --git a/src/vs/loader.js b/src/vs/loader.js index e81ef52603f..5a28455df11 100644 --- a/src/vs/loader.js +++ b/src/vs/loader.js @@ -624,17 +624,34 @@ var AMDLoader; script.addEventListener('error', errorEventListener); }; BrowserScriptLoader.prototype.load = function (moduleManager, scriptSrc, callback, errorback) { - var script = document.createElement('script'); - script.setAttribute('async', 'async'); - script.setAttribute('type', 'text/javascript'); - this.attachListeners(script, callback, errorback); - script.setAttribute('src', scriptSrc); - // Propagate CSP nonce to dynamically created script tag. - var cspNonce = moduleManager.getConfig().getOptionsLiteral().cspNonce; - if (cspNonce) { - script.setAttribute('nonce', cspNonce); + if (/^node\|/.test(scriptSrc)) { + var opts = moduleManager.getConfig().getOptionsLiteral(); + var nodeRequire = (opts.nodeRequire || AMDLoader.global.nodeRequire); + var pieces = scriptSrc.split('|'); + var moduleExports_1 = null; + try { + moduleExports_1 = nodeRequire(pieces[1]); + } + catch (err) { + errorback(err); + return; + } + moduleManager.enqueueDefineAnonymousModule([], function () { return moduleExports_1; }); + callback(); + } + else { + var script = document.createElement('script'); + script.setAttribute('async', 'async'); + script.setAttribute('type', 'text/javascript'); + this.attachListeners(script, callback, errorback); + script.setAttribute('src', scriptSrc); + // Propagate CSP nonce to dynamically created script tag. + var cspNonce = moduleManager.getConfig().getOptionsLiteral().cspNonce; + if (cspNonce) { + script.setAttribute('nonce', cspNonce); + } + document.getElementsByTagName('head')[0].appendChild(script); } - document.getElementsByTagName('head')[0].appendChild(script); }; return BrowserScriptLoader; }()); @@ -742,15 +759,15 @@ var AMDLoader; var recorder = moduleManager.getRecorder(); if (/^node\|/.test(scriptSrc)) { var pieces = scriptSrc.split('|'); - var moduleExports_1 = null; + var moduleExports_2 = null; try { - moduleExports_1 = nodeRequire(pieces[1]); + moduleExports_2 = nodeRequire(pieces[1]); } catch (err) { errorback(err); return; } - moduleManager.enqueueDefineAnonymousModule([], function () { return moduleExports_1; }); + moduleManager.enqueueDefineAnonymousModule([], function () { return moduleExports_2; }); callback(); } else { diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 947bdf93a47..271c1abd15b 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1117,9 +1117,12 @@ declare namespace monaco.editor { wordBasedSuggestions?: boolean; /** * Controls whether the semanticHighlighting is shown for the languages that support it. - * Defaults to true. + * true: semanticHighlighting is enabled for all themes + * false: semanticHighlighting is disabled for all themes + * 'configuredByTheme': semanticHighlighting is controlled by the current color theme's semanticHighlighting setting. + * Defaults to 'byTheme'. */ - 'semanticHighlighting.enabled'?: boolean; + 'semanticHighlighting.enabled'?: true | false | 'configuredByTheme'; /** * Keep peek editors open even when double clicking their content or when hitting `Escape`. * Defaults to false. @@ -3129,6 +3132,10 @@ declare namespace monaco.editor { * Defaults to false. */ definitionLinkOpensInPeek?: boolean; + /** + * Controls strikethrough deprecated variables. + */ + showDeprecated?: boolean; } export interface IEditorConstructionOptions extends IEditorOptions { @@ -3945,11 +3952,12 @@ declare namespace monaco.editor { wordWrapMinified = 109, wrappingIndent = 110, wrappingStrategy = 111, - editorClassName = 112, - pixelRatio = 113, - tabFocusMode = 114, - layoutInfo = 115, - wrappingInfo = 116 + showDeprecated = 112, + editorClassName = 113, + pixelRatio = 114, + tabFocusMode = 115, + layoutInfo = 116, + wrappingInfo = 117 } export const EditorOptions: { acceptSuggestionOnCommitCharacter: IEditorOption; @@ -4045,6 +4053,7 @@ declare namespace monaco.editor { selectOnLineNumbers: IEditorOption; showFoldingControls: IEditorOption; showUnused: IEditorOption; + showDeprecated: IEditorOption; snippetSuggestions: IEditorOption; smoothScrolling: IEditorOption; stopRenderingLineAfter: IEditorOption; diff --git a/src/vs/platform/browser/checkbox.ts b/src/vs/platform/browser/checkbox.ts new file mode 100644 index 00000000000..7dd7a5fd8ef --- /dev/null +++ b/src/vs/platform/browser/checkbox.ts @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IBaseActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionbar'; +import { CheckboxActionViewItem } from 'vs/base/browser/ui/checkbox/checkbox'; +import { IAction } from 'vs/base/common/actions'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { attachCheckboxStyler } from 'vs/platform/theme/common/styler'; + +export class ThemableCheckboxActionViewItem extends CheckboxActionViewItem { + + constructor(context: any, action: IAction, options: IBaseActionViewItemOptions | undefined, private readonly themeService: IThemeService) { + super(context, action, options); + } + + render(container: HTMLElement): void { + super.render(container); + if (this.checkbox) { + this.disposables.add(attachCheckboxStyler(this.checkbox, this.themeService)); + } + } + +} + diff --git a/src/vs/platform/clipboard/browser/clipboardService.ts b/src/vs/platform/clipboard/browser/clipboardService.ts index b4f10caa33a..e67d5f59bd1 100644 --- a/src/vs/platform/clipboard/browser/clipboardService.ts +++ b/src/vs/platform/clipboard/browser/clipboardService.ts @@ -97,14 +97,4 @@ export class BrowserClipboardService implements IClipboardService { async hasResources(): Promise { return this.resources.length > 0; } - - /** @deprecated */ - readFindTextSync(): string { - return this.findText; - } - - /** @deprecated */ - writeFindTextSync(text: string): void { - this.findText = text; - } } diff --git a/src/vs/platform/clipboard/common/clipboardService.ts b/src/vs/platform/clipboard/common/clipboardService.ts index 295f59ce527..22cc5b30004 100644 --- a/src/vs/platform/clipboard/common/clipboardService.ts +++ b/src/vs/platform/clipboard/common/clipboardService.ts @@ -46,12 +46,4 @@ export interface IClipboardService { * Find out if resources are copied to the clipboard. */ hasResources(): Promise; - - - - /** @deprecated */ - readFindTextSync(): string; - - /** @deprecated */ - writeFindTextSync(text: string): void; } diff --git a/src/vs/platform/configuration/common/configuration.ts b/src/vs/platform/configuration/common/configuration.ts index 697a2f21808..b94c564686e 100644 --- a/src/vs/platform/configuration/common/configuration.ts +++ b/src/vs/platform/configuration/common/configuration.ts @@ -323,14 +323,16 @@ export function getConfigurationValue(config: any, settingPath: string, defau export function merge(base: any, add: any, overwrite: boolean): void { Object.keys(add).forEach(key => { - if (key in base) { - if (types.isObject(base[key]) && types.isObject(add[key])) { - merge(base[key], add[key], overwrite); - } else if (overwrite) { + if (key !== '__proto__') { + if (key in base) { + if (types.isObject(base[key]) && types.isObject(add[key])) { + merge(base[key], add[key], overwrite); + } else if (overwrite) { + base[key] = add[key]; + } + } else { base[key] = add[key]; } - } else { - base[key] = add[key]; } }); } diff --git a/src/vs/platform/configuration/test/common/configurationService.test.ts b/src/vs/platform/configuration/test/common/configurationService.test.ts new file mode 100644 index 00000000000..2d19fcf1308 --- /dev/null +++ b/src/vs/platform/configuration/test/common/configurationService.test.ts @@ -0,0 +1,246 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; + +import { Registry } from 'vs/platform/registry/common/platform'; +import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'; +import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; +import { URI } from 'vs/base/common/uri'; +import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; +import { Event } from 'vs/base/common/event'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { FileService } from 'vs/platform/files/common/fileService'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { Schemas } from 'vs/base/common/network'; +import { IFileService } from 'vs/platform/files/common/files'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider'; + +suite('ConfigurationService', () => { + + let fileService: IFileService; + let settingsResource: URI; + const disposables: DisposableStore = new DisposableStore(); + + setup(async () => { + fileService = disposables.add(new FileService(new NullLogService())); + const diskFileSystemProvider = disposables.add(new InMemoryFileSystemProvider()); + fileService.registerProvider(Schemas.file, diskFileSystemProvider); + settingsResource = URI.file('settings.json'); + }); + + teardown(() => disposables.clear()); + + test('simple', async () => { + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "bar" }')); + const testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + await testObject.initialize(); + const config = testObject.getValue<{ + foo: string; + }>(); + + assert.ok(config); + assert.equal(config.foo, 'bar'); + }); + + test('config gets flattened', async () => { + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "testworkbench.editor.tabs": true }')); + + const testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + await testObject.initialize(); + const config = testObject.getValue<{ + testworkbench: { + editor: { + tabs: boolean; + }; + }; + }>(); + + assert.ok(config); + assert.ok(config.testworkbench); + assert.ok(config.testworkbench.editor); + assert.equal(config.testworkbench.editor.tabs, true); + }); + + test('error case does not explode', async () => { + await fileService.writeFile(settingsResource, VSBuffer.fromString(',,,,')); + + const testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + await testObject.initialize(); + const config = testObject.getValue<{ + foo: string; + }>(); + + assert.ok(config); + }); + + test('missing file does not explode', async () => { + const testObject = disposables.add(new ConfigurationService(URI.file('__testFile'), fileService)); + await testObject.initialize(); + + const config = testObject.getValue<{ foo: string }>(); + + assert.ok(config); + }); + + test('trigger configuration change event when file does not exist', async () => { + const testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + await testObject.initialize(); + return new Promise(async (c, e) => { + disposables.add(Event.filter(testObject.onDidChangeConfiguration, e => e.source === ConfigurationTarget.USER)(() => { + assert.equal(testObject.getValue('foo'), 'bar'); + c(); + })); + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "bar" }')); + }); + + }); + + test('trigger configuration change event when file exists', async () => { + const testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "bar" }')); + await testObject.initialize(); + + return new Promise((c, e) => { + disposables.add(Event.filter(testObject.onDidChangeConfiguration, e => e.source === ConfigurationTarget.USER)(async (e) => { + assert.equal(testObject.getValue('foo'), 'barz'); + c(); + })); + fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "barz" }')); + }); + }); + + test('reloadConfiguration', async () => { + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "bar" }')); + + const testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + await testObject.initialize(); + let config = testObject.getValue<{ + foo: string; + }>(); + assert.ok(config); + assert.equal(config.foo, 'bar'); + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "foo": "changed" }')); + + // force a reload to get latest + await testObject.reloadConfiguration(); + config = testObject.getValue<{ + foo: string; + }>(); + assert.ok(config); + assert.equal(config.foo, 'changed'); + }); + + test('model defaults', async () => { + interface ITestSetting { + configuration: { + service: { + testSetting: string; + } + }; + } + + const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); + configurationRegistry.registerConfiguration({ + 'id': '_test', + 'type': 'object', + 'properties': { + 'configuration.service.testSetting': { + 'type': 'string', + 'default': 'isSet' + } + } + }); + + let testObject = disposables.add(new ConfigurationService(URI.file('__testFile'), fileService)); + await testObject.initialize(); + let setting = testObject.getValue(); + + assert.ok(setting); + assert.equal(setting.configuration.service.testSetting, 'isSet'); + + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "testworkbench.editor.tabs": true }')); + testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + + setting = testObject.getValue(); + + assert.ok(setting); + assert.equal(setting.configuration.service.testSetting, 'isSet'); + + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "configuration.service.testSetting": "isChanged" }')); + + await testObject.reloadConfiguration(); + setting = testObject.getValue(); + assert.ok(setting); + assert.equal(setting.configuration.service.testSetting, 'isChanged'); + }); + + test('lookup', async () => { + const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); + configurationRegistry.registerConfiguration({ + 'id': '_test', + 'type': 'object', + 'properties': { + 'lookup.service.testSetting': { + 'type': 'string', + 'default': 'isSet' + } + } + }); + + const testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + testObject.initialize(); + + let res = testObject.inspect('something.missing'); + assert.strictEqual(res.value, undefined); + assert.strictEqual(res.defaultValue, undefined); + assert.strictEqual(res.userValue, undefined); + + res = testObject.inspect('lookup.service.testSetting'); + assert.strictEqual(res.defaultValue, 'isSet'); + assert.strictEqual(res.value, 'isSet'); + assert.strictEqual(res.userValue, undefined); + + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "lookup.service.testSetting": "bar" }')); + + await testObject.reloadConfiguration(); + res = testObject.inspect('lookup.service.testSetting'); + assert.strictEqual(res.defaultValue, 'isSet'); + assert.strictEqual(res.userValue, 'bar'); + assert.strictEqual(res.value, 'bar'); + + }); + + test('lookup with null', async () => { + const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); + configurationRegistry.registerConfiguration({ + 'id': '_testNull', + 'type': 'object', + 'properties': { + 'lookup.service.testNullSetting': { + 'type': 'null', + } + } + }); + + const testObject = disposables.add(new ConfigurationService(settingsResource, fileService)); + testObject.initialize(); + + let res = testObject.inspect('lookup.service.testNullSetting'); + assert.strictEqual(res.defaultValue, null); + assert.strictEqual(res.value, null); + assert.strictEqual(res.userValue, undefined); + + await fileService.writeFile(settingsResource, VSBuffer.fromString('{ "lookup.service.testNullSetting": null }')); + + await testObject.reloadConfiguration(); + + res = testObject.inspect('lookup.service.testNullSetting'); + assert.strictEqual(res.defaultValue, null); + assert.strictEqual(res.value, null); + assert.strictEqual(res.userValue, null); + }); +}); diff --git a/src/vs/platform/configuration/test/node/configurationService.test.ts b/src/vs/platform/configuration/test/node/configurationService.test.ts deleted file mode 100644 index f5fb471fcdb..00000000000 --- a/src/vs/platform/configuration/test/node/configurationService.test.ts +++ /dev/null @@ -1,304 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as assert from 'assert'; -import * as os from 'os'; -import * as path from 'vs/base/common/path'; -import * as fs from 'fs'; - -import { Registry } from 'vs/platform/registry/common/platform'; -import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'; -import * as uuid from 'vs/base/common/uuid'; -import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; -import { testFile } from 'vs/base/test/node/utils'; -import { URI } from 'vs/base/common/uri'; -import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -import { Event } from 'vs/base/common/event'; -import { NullLogService } from 'vs/platform/log/common/log'; -import { FileService } from 'vs/platform/files/common/fileService'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; -import { Schemas } from 'vs/base/common/network'; -import { IFileService } from 'vs/platform/files/common/files'; -import { VSBuffer } from 'vs/base/common/buffer'; - -suite('ConfigurationService - Node', () => { - - let fileService: IFileService; - const disposables: IDisposable[] = []; - - setup(() => { - const logService = new NullLogService(); - fileService = new FileService(logService); - disposables.push(fileService); - const diskFileSystemProvider = new DiskFileSystemProvider(logService); - disposables.push(diskFileSystemProvider); - fileService.registerProvider(Schemas.file, diskFileSystemProvider); - }); - - test('simple', async () => { - const res = await testFile('config', 'config.json'); - fs.writeFileSync(res.testFile, '{ "foo": "bar" }'); - - const service = new ConfigurationService(URI.file(res.testFile), fileService); - await service.initialize(); - const config = service.getValue<{ - foo: string; - }>(); - - assert.ok(config); - assert.equal(config.foo, 'bar'); - service.dispose(); - - return res.cleanUp(); - }); - - test('config gets flattened', async () => { - const res = await testFile('config', 'config.json'); - - fs.writeFileSync(res.testFile, '{ "testworkbench.editor.tabs": true }'); - - const service = new ConfigurationService(URI.file(res.testFile), fileService); - await service.initialize(); - const config = service.getValue<{ - testworkbench: { - editor: { - tabs: boolean; - }; - }; - }>(); - assert.ok(config); - assert.ok(config.testworkbench); - assert.ok(config.testworkbench.editor); - assert.equal(config.testworkbench.editor.tabs, true); - - service.dispose(); - return res.cleanUp(); - }); - - test('error case does not explode', async () => { - const res = await testFile('config', 'config.json'); - - fs.writeFileSync(res.testFile, ',,,,'); - - const service = new ConfigurationService(URI.file(res.testFile), fileService); - await service.initialize(); - const config = service.getValue<{ - foo: string; - }>(); - assert.ok(config); - - service.dispose(); - return res.cleanUp(); - }); - - test('missing file does not explode', async () => { - const id = uuid.generateUuid(); - const parentDir = path.join(os.tmpdir(), 'vsctests', id); - const newDir = path.join(parentDir, 'config', id); - const testFile = path.join(newDir, 'config.json'); - - const service = new ConfigurationService(URI.file(testFile), fileService); - await service.initialize(); - - const config = service.getValue<{ foo: string }>(); - assert.ok(config); - - service.dispose(); - }); - - test('trigger configuration change event when file does not exist', async () => { - const res = await testFile('config', 'config.json'); - const settingsFile = URI.file(res.testFile); - const service = new ConfigurationService(settingsFile, fileService); - await service.initialize(); - return new Promise(async (c, e) => { - const disposable = Event.filter(service.onDidChangeConfiguration, e => e.source === ConfigurationTarget.USER)(async (e) => { - disposable.dispose(); - assert.equal(service.getValue('foo'), 'bar'); - service.dispose(); - await res.cleanUp(); - c(); - }); - await fileService.writeFile(settingsFile, VSBuffer.fromString('{ "foo": "bar" }')); - }); - - }); - - test('trigger configuration change event when file exists', async () => { - const res = await testFile('config', 'config.json'); - - const service = new ConfigurationService(URI.file(res.testFile), fileService); - fs.writeFileSync(res.testFile, '{ "foo": "bar" }'); - await service.initialize(); - return new Promise((c, e) => { - const disposable = Event.filter(service.onDidChangeConfiguration, e => e.source === ConfigurationTarget.USER)(async (e) => { - disposable.dispose(); - assert.equal(service.getValue('foo'), 'barz'); - service.dispose(); - await res.cleanUp(); - c(); - }); - fs.writeFileSync(res.testFile, '{ "foo": "barz" }'); - }); - - }); - - test('reloadConfiguration', async () => { - const res = await testFile('config', 'config.json'); - - fs.writeFileSync(res.testFile, '{ "foo": "bar" }'); - - const service = new ConfigurationService(URI.file(res.testFile), fileService); - await service.initialize(); - let config = service.getValue<{ - foo: string; - }>(); - assert.ok(config); - assert.equal(config.foo, 'bar'); - fs.writeFileSync(res.testFile, '{ "foo": "changed" }'); - - // still outdated - config = service.getValue<{ - foo: string; - }>(); - assert.ok(config); - assert.equal(config.foo, 'bar'); - - // force a reload to get latest - await service.reloadConfiguration(); - config = service.getValue<{ - foo: string; - }>(); - assert.ok(config); - assert.equal(config.foo, 'changed'); - - service.dispose(); - return res.cleanUp(); - }); - - test('model defaults', async () => { - interface ITestSetting { - configuration: { - service: { - testSetting: string; - } - }; - } - - const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - configurationRegistry.registerConfiguration({ - 'id': '_test', - 'type': 'object', - 'properties': { - 'configuration.service.testSetting': { - 'type': 'string', - 'default': 'isSet' - } - } - }); - - let serviceWithoutFile = new ConfigurationService(URI.file('__testFile'), fileService); - await serviceWithoutFile.initialize(); - let setting = serviceWithoutFile.getValue(); - - assert.ok(setting); - assert.equal(setting.configuration.service.testSetting, 'isSet'); - - return testFile('config', 'config.json').then(async res => { - fs.writeFileSync(res.testFile, '{ "testworkbench.editor.tabs": true }'); - - const service = new ConfigurationService(URI.file(res.testFile), fileService); - - let setting = service.getValue(); - - assert.ok(setting); - assert.equal(setting.configuration.service.testSetting, 'isSet'); - - fs.writeFileSync(res.testFile, '{ "configuration.service.testSetting": "isChanged" }'); - - await service.reloadConfiguration(); - let setting_1 = service.getValue(); - assert.ok(setting_1); - assert.equal(setting_1.configuration.service.testSetting, 'isChanged'); - service.dispose(); - serviceWithoutFile.dispose(); - return res.cleanUp(); - }); - }); - - test('lookup', async () => { - const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - configurationRegistry.registerConfiguration({ - 'id': '_test', - 'type': 'object', - 'properties': { - 'lookup.service.testSetting': { - 'type': 'string', - 'default': 'isSet' - } - } - }); - - const r = await testFile('config', 'config.json'); - const service = new ConfigurationService(URI.file(r.testFile), fileService); - service.initialize(); - - let res = service.inspect('something.missing'); - assert.strictEqual(res.value, undefined); - assert.strictEqual(res.defaultValue, undefined); - assert.strictEqual(res.userValue, undefined); - - res = service.inspect('lookup.service.testSetting'); - assert.strictEqual(res.defaultValue, 'isSet'); - assert.strictEqual(res.value, 'isSet'); - assert.strictEqual(res.userValue, undefined); - - fs.writeFileSync(r.testFile, '{ "lookup.service.testSetting": "bar" }'); - - await service.reloadConfiguration(); - res = service.inspect('lookup.service.testSetting'); - assert.strictEqual(res.defaultValue, 'isSet'); - assert.strictEqual(res.userValue, 'bar'); - assert.strictEqual(res.value, 'bar'); - - service.dispose(); - return r.cleanUp(); - }); - - test('lookup with null', async () => { - const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - configurationRegistry.registerConfiguration({ - 'id': '_testNull', - 'type': 'object', - 'properties': { - 'lookup.service.testNullSetting': { - 'type': 'null', - } - } - }); - - const r = await testFile('config', 'config.json'); - const service = new ConfigurationService(URI.file(r.testFile), fileService); - service.initialize(); - - let res = service.inspect('lookup.service.testNullSetting'); - assert.strictEqual(res.defaultValue, null); - assert.strictEqual(res.value, null); - assert.strictEqual(res.userValue, undefined); - - fs.writeFileSync(r.testFile, '{ "lookup.service.testNullSetting": null }'); - - await service.reloadConfiguration(); - - res = service.inspect('lookup.service.testNullSetting'); - assert.strictEqual(res.defaultValue, null); - assert.strictEqual(res.value, null); - assert.strictEqual(res.userValue, null); - - service.dispose(); - return r.cleanUp(); - }); -}); diff --git a/src/vs/platform/contextkey/common/contextkey.ts b/src/vs/platform/contextkey/common/contextkey.ts index 4d42f0b9777..3281940fb75 100644 --- a/src/vs/platform/contextkey/common/contextkey.ts +++ b/src/vs/platform/contextkey/common/contextkey.ts @@ -637,16 +637,7 @@ export class ContextKeyNotRegexExpr implements IContextKeyExpression { export class ContextKeyAndExpr implements IContextKeyExpression { public static create(_expr: ReadonlyArray): ContextKeyExpression | undefined { - const expr = ContextKeyAndExpr._normalizeArr(_expr); - if (expr.length === 0) { - return undefined; - } - - if (expr.length === 1) { - return expr[0]; - } - - return new ContextKeyAndExpr(expr); + return ContextKeyAndExpr._normalizeArr(_expr); } public readonly type = ContextKeyExprType.And; @@ -697,7 +688,7 @@ export class ContextKeyAndExpr implements IContextKeyExpression { return true; } - private static _normalizeArr(arr: ReadonlyArray): ContextKeyExpression[] { + private static _normalizeArr(arr: ReadonlyArray): ContextKeyExpression | undefined { const expr: ContextKeyExpression[] = []; let hasTrue = false; @@ -714,7 +705,7 @@ export class ContextKeyAndExpr implements IContextKeyExpression { if (e.type === ContextKeyExprType.False) { // anything && false ==> false - return [ContextKeyFalseExpr.INSTANCE]; + return ContextKeyFalseExpr.INSTANCE; } if (e.type === ContextKeyExprType.And) { @@ -722,21 +713,48 @@ export class ContextKeyAndExpr implements IContextKeyExpression { continue; } - if (e.type === ContextKeyExprType.Or) { - // Not allowed, because we don't have parens! - throw new Error(`It is not allowed to have an or expression here due to lack of parens! For example "a && (b||c)" is not supported, use "(a&&b) || (a&&c)" instead.`); - } - expr.push(e); } if (expr.length === 0 && hasTrue) { - return [ContextKeyTrueExpr.INSTANCE]; + return ContextKeyTrueExpr.INSTANCE; + } + + if (expr.length === 0) { + return undefined; + } + + if (expr.length === 1) { + return expr[0]; } expr.sort(cmp); - return expr; + // We must distribute any OR expression because we don't support parens + // OR extensions will be at the end (due to sorting rules) + while (expr.length > 1) { + const lastElement = expr[expr.length - 1]; + if (lastElement.type !== ContextKeyExprType.Or) { + break; + } + // pop the last element + expr.pop(); + + // pop the second to last element + const secondToLastElement = expr.pop()!; + + // distribute `lastElement` over `secondToLastElement` + const resultElement = ContextKeyOrExpr.create( + lastElement.expr.map(el => ContextKeyAndExpr.create([el, secondToLastElement])) + ); + + if (resultElement) { + expr.push(resultElement); + expr.sort(cmp); + } + } + + return new ContextKeyAndExpr(expr); } public serialize(): string { diff --git a/src/vs/platform/contextkey/test/common/contextkey.test.ts b/src/vs/platform/contextkey/test/common/contextkey.test.ts index f5a04ce1cf2..c7784c888e1 100644 --- a/src/vs/platform/contextkey/test/common/contextkey.test.ts +++ b/src/vs/platform/contextkey/test/common/contextkey.test.ts @@ -136,4 +136,18 @@ suite('ContextKeyExpr', () => { testNormalize('isLinux', isLinux ? 'true' : 'false'); testNormalize('isWindows', isWindows ? 'true' : 'false'); }); + + test('issue #101015: distribute OR', () => { + function t(expr1: string, expr2: string, expected: string | undefined): void { + const e1 = ContextKeyExpr.deserialize(expr1); + const e2 = ContextKeyExpr.deserialize(expr2); + const actual = ContextKeyExpr.and(e1, e2)?.serialize(); + assert.strictEqual(actual, expected); + } + t('a', 'b', 'a && b'); + t('a || b', 'c', 'a && c || b && c'); + t('a || b', 'c || d', 'a && c || b && c || a && d || b && d'); + t('a || b', 'c && d', 'a && c && d || b && c && d'); + t('a || b', 'c && d || e', 'a && e || b && e || a && c && d || b && c && d'); + }); }); diff --git a/src/vs/platform/contextview/browser/contextView.ts b/src/vs/platform/contextview/browser/contextView.ts index de9cb985c95..fde55c58e76 100644 --- a/src/vs/platform/contextview/browser/contextView.ts +++ b/src/vs/platform/contextview/browser/contextView.ts @@ -15,7 +15,7 @@ export interface IContextViewService extends IContextViewProvider { readonly _serviceBrand: undefined; - showContextView(delegate: IContextViewDelegate, container?: HTMLElement): void; + showContextView(delegate: IContextViewDelegate, container?: HTMLElement): IDisposable; hideContextView(data?: any): void; layout(): void; anchorAlignment?: AnchorAlignment; diff --git a/src/vs/platform/contextview/browser/contextViewService.ts b/src/vs/platform/contextview/browser/contextViewService.ts index 8ca6dfbdc4b..685b7e21cff 100644 --- a/src/vs/platform/contextview/browser/contextViewService.ts +++ b/src/vs/platform/contextview/browser/contextViewService.ts @@ -5,12 +5,13 @@ import { IContextViewService, IContextViewDelegate } from './contextView'; import { ContextView } from 'vs/base/browser/ui/contextview/contextview'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; export class ContextViewService extends Disposable implements IContextViewService { declare readonly _serviceBrand: undefined; + private currentViewDisposable: IDisposable = Disposable.None; private contextView: ContextView; private container: HTMLElement; @@ -32,8 +33,7 @@ export class ContextViewService extends Disposable implements IContextViewServic this.contextView.setContainer(container, !!useFixedPosition); } - showContextView(delegate: IContextViewDelegate, container?: HTMLElement): void { - + showContextView(delegate: IContextViewDelegate, container?: HTMLElement): IDisposable { if (container) { if (container !== this.container) { this.container = container; @@ -47,6 +47,15 @@ export class ContextViewService extends Disposable implements IContextViewServic } this.contextView.show(delegate); + + const disposable = toDisposable(() => { + if (this.currentViewDisposable === disposable) { + this.hideContextView(); + } + }); + + this.currentViewDisposable = disposable; + return disposable; } layout(): void { diff --git a/src/vs/platform/debug/common/extensionHostDebug.ts b/src/vs/platform/debug/common/extensionHostDebug.ts index 8dc4e4b2ada..b263bdd9c1c 100644 --- a/src/vs/platform/debug/common/extensionHostDebug.ts +++ b/src/vs/platform/debug/common/extensionHostDebug.ts @@ -34,6 +34,10 @@ export interface ICloseSessionEvent { sessionId: string; } +export interface IOpenExtensionWindowResult { + rendererDebugPort?: number; +} + export interface IExtensionHostDebugService { readonly _serviceBrand: undefined; @@ -52,5 +56,5 @@ export interface IExtensionHostDebugService { terminateSession(sessionId: string, subId?: string): void; readonly onTerminateSession: Event; - openExtensionDevelopmentHostWindow(args: string[], env: IProcessEnvironment): Promise; + openExtensionDevelopmentHostWindow(args: string[], env: IProcessEnvironment, debugRenderer: boolean): Promise; } diff --git a/src/vs/platform/debug/common/extensionHostDebugIpc.ts b/src/vs/platform/debug/common/extensionHostDebugIpc.ts index 84c034b8391..60011be13e3 100644 --- a/src/vs/platform/debug/common/extensionHostDebugIpc.ts +++ b/src/vs/platform/debug/common/extensionHostDebugIpc.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IServerChannel, IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IReloadSessionEvent, ICloseSessionEvent, IAttachSessionEvent, ILogToSessionEvent, ITerminateSessionEvent, IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; +import { IReloadSessionEvent, ICloseSessionEvent, IAttachSessionEvent, ILogToSessionEvent, ITerminateSessionEvent, IExtensionHostDebugService, IOpenExtensionWindowResult } from 'vs/platform/debug/common/extensionHostDebug'; import { Event, Emitter } from 'vs/base/common/event'; import { IRemoteConsoleLog } from 'vs/base/common/console'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -101,7 +101,7 @@ export class ExtensionHostDebugChannelClient extends Disposable implements IExte return this.channel.listen('terminate'); } - openExtensionDevelopmentHostWindow(args: string[], env: IProcessEnvironment): Promise { - return this.channel.call('openExtensionDevelopmentHostWindow', [args, env]); + openExtensionDevelopmentHostWindow(args: string[], env: IProcessEnvironment, debugRenderer: boolean): Promise { + return this.channel.call('openExtensionDevelopmentHostWindow', [args, env, debugRenderer]); } } diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 9e39b4d6eb0..f0d350d392e 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -7,7 +7,6 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/node/driver'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; -import { remote } from 'electron'; import { timeout } from 'vs/base/common/async'; import { BaseWindowDriver } from 'vs/platform/driver/browser/baseDriver'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; @@ -32,11 +31,10 @@ class WindowDriver extends BaseWindowDriver { private async _click(selector: string, clickCount: number, offset?: { x: number, y: number }): Promise { const { x, y } = await this._getElementXY(selector, offset); - const webContents = remote.getCurrentWebContents(); - webContents.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount } as any); + await this.electronService.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount } as any); await timeout(10); - webContents.sendInputEvent({ type: 'mouseUp', x, y, button: 'left', clickCount } as any); + await this.electronService.sendInputEvent({ type: 'mouseUp', x, y, button: 'left', clickCount } as any); await timeout(100); } diff --git a/src/vs/platform/electron/common/electron.ts b/src/vs/platform/electron/common/electron.ts index ae31c708216..22efa3bda23 100644 --- a/src/vs/platform/electron/common/electron.ts +++ b/src/vs/platform/electron/common/electron.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions, SaveDialogOptions, OpenDialogOptions, OpenDialogReturnValue, SaveDialogReturnValue, CrashReporterStartOptions } from 'vs/base/parts/sandbox/common/electronTypes'; +import { MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions, SaveDialogOptions, OpenDialogOptions, OpenDialogReturnValue, SaveDialogReturnValue, CrashReporterStartOptions, MouseInputEvent } from 'vs/base/parts/sandbox/common/electronTypes'; import { IOpenedWindow, IWindowOpenable, IOpenEmptyWindowOptions, IOpenWindowOptions } from 'vs/platform/windows/common/windows'; import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; @@ -25,6 +25,8 @@ export interface ICommonElectronService { readonly onWindowFocus: Event; readonly onWindowBlur: Event; + readonly onOSResume: Event; + // Window getWindows(): Promise; getWindowCount(): Promise; @@ -80,16 +82,19 @@ export interface ICommonElectronService { toggleWindowTabsBar(): Promise; // Lifecycle + notifyReady(): Promise relaunch(options?: { addArgs?: string[], removeArgs?: string[] }): Promise; reload(options?: { disableExtensions?: boolean }): Promise; closeWindow(): Promise; closeWindowById(windowId: number): Promise; quit(): Promise; + exit(code: number): Promise; // Development openDevTools(options?: OpenDevToolsOptions): Promise; toggleDevTools(): Promise; startCrashReporter(options: CrashReporterStartOptions): Promise; + sendInputEvent(event: MouseInputEvent): Promise; // Connectivity resolveProxy(url: string): Promise; diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index bcd1f9d9752..8adf3e95d33 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; -import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue, CrashReporterStartOptions, crashReporter, Menu, BrowserWindow, app, clipboard } from 'electron'; +import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue, CrashReporterStartOptions, crashReporter, Menu, BrowserWindow, app, clipboard, powerMonitor } from 'electron'; import { OpenContext } from 'vs/platform/windows/node/window'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { IOpenedWindow, IOpenWindowOptions, IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; @@ -22,6 +22,7 @@ import { ITelemetryData, ITelemetryService } from 'vs/platform/telemetry/common/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; +import { MouseInputEvent } from 'vs/base/parts/sandbox/common/electronTypes'; export interface IElectronMainService extends AddFirstParameterToFunctions /* only methods, not events */, number | undefined /* window ID */> { } @@ -49,17 +50,19 @@ export class ElectronMainService implements IElectronMainService { //#region Events - readonly onWindowOpen: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-created', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); + readonly onWindowOpen = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-created', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); - readonly onWindowMaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-maximize', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); - readonly onWindowUnmaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-unmaximize', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); + readonly onWindowMaximize = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-maximize', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); + readonly onWindowUnmaximize = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-unmaximize', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); - readonly onWindowBlur: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-blur', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); - readonly onWindowFocus: Event = Event.any( + readonly onWindowBlur = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-blur', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); + readonly onWindowFocus = Event.any( Event.map(Event.filter(Event.map(this.windowsMainService.onWindowsCountChanged, () => this.windowsMainService.getLastActiveWindow()), window => !!window), window => window!.id), - Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-focus', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)) + Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-focus', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)) ); + readonly onOSResume = Event.fromNodeEventEmitter(powerMonitor, 'resume'); + //#endregion //#region Window @@ -177,11 +180,7 @@ export class ElectronMainService implements IElectronMainService { const window = this.windowById(windowId); if (window) { - if (isMacintosh) { - window.win.show(); - } else { - window.win.focus(); - } + window.focus(); } } @@ -325,7 +324,7 @@ export class ElectronMainService implements IElectronMainService { } async writeClipboardBuffer(windowId: number | undefined, format: string, buffer: Uint8Array, type?: 'selection' | 'clipboard'): Promise { - return clipboard.writeBuffer(format, buffer as Buffer, type); + return clipboard.writeBuffer(format, Buffer.from(buffer), type); } async readClipboardBuffer(windowId: number | undefined, format: string): Promise { @@ -368,6 +367,13 @@ export class ElectronMainService implements IElectronMainService { //#region Lifecycle + async notifyReady(windowId: number | undefined): Promise { + const window = this.windowById(windowId); + if (window) { + window.setReady(); + } + } + async relaunch(windowId: number | undefined, options?: { addArgs?: string[], removeArgs?: string[] }): Promise { return this.lifecycleMainService.relaunch(options); } @@ -407,6 +413,10 @@ export class ElectronMainService implements IElectronMainService { } } + async exit(windowId: number | undefined, code: number): Promise { + await this.lifecycleMainService.kill(code); + } + //#endregion //#region Connectivity @@ -445,8 +455,16 @@ export class ElectronMainService implements IElectronMainService { } async startCrashReporter(windowId: number | undefined, options: CrashReporterStartOptions): Promise { - crashReporter.start(options); this.logService.trace('ElectronMainService#crashReporter', JSON.stringify(options)); + + crashReporter.start(options); + } + + async sendInputEvent(windowId: number | undefined, event: MouseInputEvent): Promise { + const window = this.windowById(windowId); + if (window && (event.type === 'mouseDown' || event.type === 'mouseUp')) { + window.win.webContents.sendInputEvent(event); + } } //#endregion diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index cb3c895d823..38e7ca5ad33 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as minimist from 'minimist'; -import * as os from 'os'; import { localize } from 'vs/nls'; +import { isWindows } from 'vs/base/common/platform'; export interface ParsedArgs { _: string[]; @@ -142,7 +142,7 @@ export const OPTIONS: OptionDescriptions> = { 'list-extensions': { type: 'boolean', cat: 'e', description: localize('listExtensions', "List the installed extensions.") }, 'show-versions': { type: 'boolean', cat: 'e', description: localize('showVersions', "Show versions of installed extensions, when using --list-extension.") }, 'category': { type: 'string', cat: 'e', description: localize('category', "Filters installed extensions by provided category, when using --list-extension.") }, - 'install-extension': { type: 'string[]', cat: 'e', args: 'extension-id | path-to-vsix', description: localize('installExtension', "Installs or updates the extension. Use `--force` argument to avoid prompts.") }, + 'install-extension': { type: 'string[]', cat: 'e', args: 'extension-id[@version] | path-to-vsix', description: localize('installExtension', "Installs or updates the extension. Use `--force` argument to avoid prompts. The identifier of an extension is always `${publisher}.${name}`. To install a specific version provide `@${version}`. For example: 'vscode.csharp@1.2.3'.") }, 'uninstall-extension': { type: 'string[]', cat: 'e', args: 'extension-id', description: localize('uninstallExtension', "Uninstalls an extension.") }, 'enable-proposed-api': { type: 'string[]', cat: 'e', args: 'extension-id', description: localize('experimentalApis', "Enables proposed API features for extensions. Can receive one or more extension IDs to enable individually.") }, @@ -364,7 +364,7 @@ export function buildHelpMessage(productName: string, executableName: string, ve help.push(`${localize('usage', "Usage")}: ${executableName} [${localize('options', "options")}][${localize('paths', 'paths')}...]`); help.push(''); if (isPipeSupported) { - if (os.platform() === 'win32') { + if (isWindows) { help.push(localize('stdinWindows', "To read output from another program, append '-' (e.g. 'echo Hello World | {0} -')", executableName)); } else { help.push(localize('stdinUnix', "To read from stdin, append '-' (e.g. 'ps aux | grep code | {0} -')", executableName)); diff --git a/src/vs/platform/environment/node/stdin.ts b/src/vs/platform/environment/node/stdin.ts index e870ac6e704..b72ae5e0c75 100644 --- a/src/vs/platform/environment/node/stdin.ts +++ b/src/vs/platform/environment/node/stdin.ts @@ -46,13 +46,19 @@ export async function readFromStdin(targetPath: string, verbose: boolean): Promi let encoding = await resolveTerminalEncoding(verbose); - const iconv = await import('iconv-lite'); + const iconv = await import('iconv-lite-umd'); if (!iconv.encodingExists(encoding)) { console.log(`Unsupported terminal encoding: ${encoding}, falling back to UTF-8.`); encoding = 'utf8'; } // Pipe into tmp file using terminals encoding - const converterStream = iconv.decodeStream(encoding); - process.stdin.pipe(converterStream).pipe(stdinFileStream); + const decoder = iconv.getDecoder(encoding); + process.stdin.on('data', chunk => stdinFileStream.write(decoder.write(chunk))); + process.stdin.on('end', () => { + stdinFileStream.write(decoder.end()); + stdinFileStream.end(); + }); + process.stdin.on('error', error => stdinFileStream.destroy(error)); + process.stdin.on('close', () => stdinFileStream.close()); } diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index 7ca5aec90c9..9c71df411fc 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -217,7 +217,7 @@ function getCoreTranslationAssets(version: IRawGalleryExtensionVersion): [string function getRepositoryAsset(version: IRawGalleryExtensionVersion): IGalleryExtensionAsset | null { if (version.properties) { const results = version.properties.filter(p => p.key === AssetType.Repository); - const gitRegExp = new RegExp('((git|ssh|http(s)?)|(git@[\w\.]+))(:(//)?)([\w\.@\:/\-~]+)(\.git)(/)?'); + const gitRegExp = new RegExp('((git|ssh|http(s)?)|(git@[\w.]+))(:(//)?)([\w.@\:/\-~]+)(.git)(/)?'); const uri = results.filter(r => gitRegExp.test(r.value))[0]; return uri ? { uri: uri.value, fallbackUri: uri.value } : null; @@ -295,6 +295,8 @@ function toExtension(galleryExtension: IRawGalleryExtension, version: IRawGaller installCount: getStatistic(galleryExtension.statistics, 'install'), rating: getStatistic(galleryExtension.statistics, 'averagerating'), ratingCount: getStatistic(galleryExtension.statistics, 'ratingcount'), + assetUri: URI.parse(version.assetUri), + assetTypes: version.files.map(({ assetType }) => assetType), assets, properties: { dependencies: getExtensions(version, PropertyType.Dependency), @@ -603,7 +605,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return Promise.resolve(''); } - getAllVersions(extension: IGalleryExtension, compatible: boolean): Promise { + async getAllVersions(extension: IGalleryExtension, compatible: boolean): Promise { let query = new Query() .withFlags(Flags.IncludeVersions, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, 1) @@ -615,19 +617,24 @@ export class ExtensionGalleryService implements IExtensionGalleryService { query = query.withFilter(FilterType.ExtensionName, extension.identifier.id); } - return this.queryGallery(query, CancellationToken.None).then(({ galleryExtensions }) => { - if (galleryExtensions.length) { - if (compatible) { - return Promise.all(galleryExtensions[0].versions.map(v => this.getEngine(v).then(engine => isEngineValid(engine, this.productService.version) ? v : null))) - .then(versions => versions - .filter(v => !!v) - .map(v => ({ version: v!.version, date: v!.lastUpdated }))); - } else { - return galleryExtensions[0].versions.map(v => ({ version: v.version, date: v.lastUpdated })); - } + const result: IGalleryExtensionVersion[] = []; + const { galleryExtensions } = await this.queryGallery(query, CancellationToken.None); + if (galleryExtensions.length) { + if (compatible) { + await Promise.all(galleryExtensions[0].versions.map(async v => { + let engine: string | undefined; + try { + engine = await this.getEngine(v); + } catch (error) { /* Ignore error and skip version */ } + if (engine && isEngineValid(engine, this.productService.version)) { + result.push({ version: v!.version, date: v!.lastUpdated }); + } + })); + } else { + result.push(...galleryExtensions[0].versions.map(v => ({ version: v.version, date: v.lastUpdated }))); } - return []; - }); + } + return result; } private getAsset(asset: IGalleryExtensionAsset, options: IRequestOptions = {}, token: CancellationToken = CancellationToken.None): Promise { diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 32c50744116..80bbd3c806d 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -12,7 +12,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionManifest, IExtension, ExtensionType } from 'vs/platform/extensions/common/extensions'; import { IExeBasedExtensionTip } from 'vs/platform/product/common/productService'; -export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\-A-Z]*)$'; +export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9-A-Z]*)\\.([a-z0-9A-Z][a-z0-9-A-Z]*)$'; export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); export interface IGalleryExtensionProperties { @@ -78,6 +78,8 @@ export interface IGalleryExtension { installCount: number; rating: number; ratingCount: number; + assetUri: URI; + assetTypes: string[]; assets: IGalleryExtensionAssets; properties: IGalleryExtensionProperties; telemetryData: any; @@ -91,17 +93,11 @@ export interface IGalleryMetadata { } export interface ILocalExtension extends IExtension { - readonly manifest: IExtensionManifest; isMachineScoped: boolean; publisherId: string | null; publisherDisplayName: string | null; - readmeUrl: URI | null; - changelogUrl: URI | null; } -export const IExtensionManagementService = createDecorator('extensionManagementService'); -export const IExtensionGalleryService = createDecorator('extensionGalleryService'); - export const enum SortBy { NoneOrRelevance = 0, LastUpdatedDate = 1, @@ -148,6 +144,7 @@ export interface ITranslation { contents: { [key: string]: {} }; } +export const IExtensionGalleryService = createDecorator('extensionGalleryService'); export interface IExtensionGalleryService { readonly _serviceBrand: undefined; isEnabled(): boolean; @@ -195,6 +192,7 @@ export class ExtensionManagementError extends Error { } } +export const IExtensionManagementService = createDecorator('extensionManagementService'); export interface IExtensionManagementService { readonly _serviceBrand: undefined; diff --git a/src/vs/platform/extensionManagement/node/extensionsScanner.ts b/src/vs/platform/extensionManagement/node/extensionsScanner.ts index 8c9d4ce94dd..8a02d584772 100644 --- a/src/vs/platform/extensionManagement/node/extensionsScanner.ts +++ b/src/vs/platform/extensionManagement/node/extensionsScanner.ts @@ -228,9 +228,9 @@ export class ExtensionsScanner extends Disposable { const children = await pfs.readdir(extensionPath); const { manifest, metadata } = await this.readManifest(extensionPath); const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0]; - const readmeUrl = readme ? URI.file(path.join(extensionPath, readme)) : null; + const readmeUrl = readme ? URI.file(path.join(extensionPath, readme)) : undefined; const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; - const changelogUrl = changelog ? URI.file(path.join(extensionPath, changelog)) : null; + const changelogUrl = changelog ? URI.file(path.join(extensionPath, changelog)) : undefined; const identifier = { id: getGalleryExtensionId(manifest.publisher, manifest.name) }; const local = { type, identifier, manifest, location: URI.file(extensionPath), readmeUrl, changelogUrl, publisherDisplayName: null, publisherId: null, isMachineScoped: false }; if (metadata) { diff --git a/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts b/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts index 32c514601c7..a9652639529 100644 --- a/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts +++ b/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts @@ -15,6 +15,8 @@ suite('Extension Identifier Pattern', () => { assert.equal(true, regEx.test('PUBLISHER.NAME')); assert.equal(true, regEx.test('PUBLISHEr.NAMe')); assert.equal(true, regEx.test('PUBLISHEr.N-AMe')); + assert.equal(true, regEx.test('PUB-LISHEr.NAMe')); + assert.equal(true, regEx.test('PUB-LISHEr.N-AMe')); assert.equal(true, regEx.test('PUBLISH12Er90.N-A54Me123')); assert.equal(true, regEx.test('111PUBLISH12Er90.N-1111A54Me123')); assert.equal(false, regEx.test('publishername')); diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index 3c9bede84fe..17673328b27 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -6,6 +6,7 @@ import * as strings from 'vs/base/common/strings'; import { ILocalization } from 'vs/platform/localizations/common/localizations'; import { URI } from 'vs/base/common/uri'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export const MANIFEST_CACHE_FOLDER = 'CachedExtensions'; export const USER_MANIFEST_CACHE_FILE = 'user'; @@ -141,6 +142,9 @@ export interface IExtensionIdentifier { uuid?: string; } +export const EXTENSION_CATEGORIES = ['Programming Languages', 'Snippets', 'Linters', 'Themes', 'Debuggers', 'Other', 'Keymaps', 'Formatters', 'Extension Packs', + 'SCM Providers', 'Azure', 'Language Packs', 'Data Science', 'Machine Learning', 'Visualization', 'Testing', 'Notebooks']; + export interface IExtensionManifest { readonly name: string; readonly displayName?: string; @@ -175,6 +179,8 @@ export interface IExtension { readonly identifier: IExtensionIdentifier; readonly manifest: IExtensionManifest; readonly location: URI; + readonly readmeUrl?: URI; + readonly changelogUrl?: URI; } /** @@ -244,3 +250,19 @@ export interface IExtensionDescription extends IExtensionManifest { export function isLanguagePackExtension(manifest: IExtensionManifest): boolean { return manifest.contributes && manifest.contributes.localizations ? manifest.contributes.localizations.length > 0 : false; } + +export interface IScannedExtension { + readonly identifier: IExtensionIdentifier; + readonly location: URI; + readonly type: ExtensionType; + readonly packageJSON: IExtensionManifest + readonly packageNLSUrl?: URI; + readonly readmeUrl?: URI; + readonly changelogUrl?: URI; +} + +export const IBuiltinExtensionsScannerService = createDecorator('IBuiltinExtensionsScannerService'); +export interface IBuiltinExtensionsScannerService { + readonly _serviceBrand: undefined; + scanBuiltinExtensions(): Promise; +} diff --git a/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts b/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts new file mode 100644 index 00000000000..059bffe8744 --- /dev/null +++ b/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts @@ -0,0 +1,123 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { KeyValueFileSystemProvider } from 'vs/platform/files/common/keyValueFileSystemProvider'; +import * as browser from 'vs/base/browser/browser'; +import { IFileSystemProvider } from 'vs/platform/files/common/files'; + +const INDEXEDDB_VSCODE_DB = 'vscode-web-db'; +export const INDEXEDDB_USERDATA_OBJECT_STORE = 'vscode-userdata-store'; +export const INDEXEDDB_LOGS_OBJECT_STORE = 'vscode-logs-store'; + +export class IndexedDB { + + private indexedDBPromise: Promise; + + constructor() { + this.indexedDBPromise = this.openIndexedDB(INDEXEDDB_VSCODE_DB, 2, [INDEXEDDB_USERDATA_OBJECT_STORE, INDEXEDDB_LOGS_OBJECT_STORE]); + } + + async createFileSystemProvider(scheme: string, store: string): Promise { + let fsp: IFileSystemProvider | null = null; + const indexedDB = await this.indexedDBPromise; + if (indexedDB) { + if (indexedDB.objectStoreNames.contains(store)) { + fsp = new IndexedDBFileSystemProvider(scheme, indexedDB, store); + } else { + console.error(`Error while creating indexedDB filesystem provider. Could not find ${store} object store`); + } + } + return fsp; + } + + private openIndexedDB(name: string, version: number, stores: string[]): Promise { + if (browser.isEdge) { + return Promise.resolve(null); + } + return new Promise((c, e) => { + const request = window.indexedDB.open(name, version); + request.onerror = (err) => e(request.error); + request.onsuccess = () => { + const db = request.result; + for (const store of stores) { + if (!db.objectStoreNames.contains(store)) { + console.error(`Error while creating indexedDB. Could not create ${store} object store`); + c(null); + return; + } + } + c(db); + }; + request.onupgradeneeded = () => { + const db = request.result; + for (const store of stores) { + if (!db.objectStoreNames.contains(store)) { + db.createObjectStore(store); + } + } + }; + }); + } + +} + +class IndexedDBFileSystemProvider extends KeyValueFileSystemProvider { + + constructor(scheme: string, private readonly database: IDBDatabase, private readonly store: string) { + super(scheme); + } + + protected async getAllKeys(): Promise { + return new Promise(async (c, e) => { + const transaction = this.database.transaction([this.store]); + const objectStore = transaction.objectStore(this.store); + const request = objectStore.getAllKeys(); + request.onerror = () => e(request.error); + request.onsuccess = () => c(request.result); + }); + } + + protected hasKey(key: string): Promise { + return new Promise(async (c, e) => { + const transaction = this.database.transaction([this.store]); + const objectStore = transaction.objectStore(this.store); + const request = objectStore.getKey(key); + request.onerror = () => e(request.error); + request.onsuccess = () => { + c(!!request.result); + }; + }); + } + + protected getValue(key: string): Promise { + return new Promise(async (c, e) => { + const transaction = this.database.transaction([this.store]); + const objectStore = transaction.objectStore(this.store); + const request = objectStore.get(key); + request.onerror = () => e(request.error); + request.onsuccess = () => c(request.result || ''); + }); + } + + protected setValue(key: string, value: string): Promise { + return new Promise(async (c, e) => { + const transaction = this.database.transaction([this.store], 'readwrite'); + const objectStore = transaction.objectStore(this.store); + const request = objectStore.put(value, key); + request.onerror = () => e(request.error); + request.onsuccess = () => c(); + }); + } + + protected deleteKey(key: string): Promise { + return new Promise(async (c, e) => { + const transaction = this.database.transaction([this.store], 'readwrite'); + const objectStore = transaction.objectStore(this.store); + const request = objectStore.delete(key); + request.onerror = () => e(request.error); + request.onsuccess = () => c(); + }); + } +} diff --git a/src/vs/platform/files/common/fileService.ts b/src/vs/platform/files/common/fileService.ts index 5c9d9dbb9b9..fc4e543c263 100644 --- a/src/vs/platform/files/common/fileService.ts +++ b/src/vs/platform/files/common/fileService.ts @@ -26,19 +26,19 @@ export class FileService extends Disposable implements IFileService { private readonly BUFFER_SIZE = 64 * 1024; - constructor(@ILogService private logService: ILogService) { + constructor(@ILogService private readonly logService: ILogService) { super(); } //#region File System Provider - private _onDidChangeFileSystemProviderRegistrations = this._register(new Emitter()); + private readonly _onDidChangeFileSystemProviderRegistrations = this._register(new Emitter()); readonly onDidChangeFileSystemProviderRegistrations = this._onDidChangeFileSystemProviderRegistrations.event; - private _onWillActivateFileSystemProvider = this._register(new Emitter()); + private readonly _onWillActivateFileSystemProvider = this._register(new Emitter()); readonly onWillActivateFileSystemProvider = this._onWillActivateFileSystemProvider.event; - private _onDidChangeFileSystemProviderCapabilities = this._register(new Emitter()); + private readonly _onDidChangeFileSystemProviderCapabilities = this._register(new Emitter()); readonly onDidChangeFileSystemProviderCapabilities = this._onDidChangeFileSystemProviderCapabilities.event; private readonly provider = new Map(); @@ -146,10 +146,10 @@ export class FileService extends Disposable implements IFileService { //#endregion - private _onDidRunOperation = this._register(new Emitter()); + private readonly _onDidRunOperation = this._register(new Emitter()); readonly onDidRunOperation = this._onDidRunOperation.event; - private _onError = this._register(new Emitter()); + private readonly _onError = this._register(new Emitter()); readonly onError = this._onError.event; //#region File Metadata Resolving @@ -287,12 +287,28 @@ export class FileService extends Disposable implements IFileService { //#region File Reading/Writing - async createFile(resource: URI, bufferOrReadableOrStream: VSBuffer | VSBufferReadable | VSBufferReadableStream = VSBuffer.fromString(''), options?: ICreateFileOptions): Promise { + async canCreateFile(resource: URI, options?: ICreateFileOptions): Promise { + try { + await this.doValidateCreateFile(resource, options); + } catch (error) { + return error; + } + + return true; + } + + private async doValidateCreateFile(resource: URI, options?: ICreateFileOptions): Promise { // validate overwrite if (!options?.overwrite && await this.exists(resource)) { throw new FileOperationError(localize('fileExists', "Unable to create file '{0}' that already exists when overwrite flag is not set", this.resourceForError(resource)), FileOperationResult.FILE_MODIFIED_SINCE, options); } + } + + async createFile(resource: URI, bufferOrReadableOrStream: VSBuffer | VSBufferReadable | VSBufferReadableStream = VSBuffer.fromString(''), options?: ICreateFileOptions): Promise { + + // validate + await this.doValidateCreateFile(resource, options); // do write into file (this will create it too) const fileStat = await this.writeFile(resource, bufferOrReadableOrStream); @@ -865,10 +881,10 @@ export class FileService extends Disposable implements IFileService { //#region File Watching - private _onDidFilesChange = this._register(new Emitter()); + private readonly _onDidFilesChange = this._register(new Emitter()); readonly onDidFilesChange = this._onDidFilesChange.event; - private activeWatchers = new Map(); + private readonly activeWatchers = new Map(); watch(resource: URI, options: IWatchOptions = { recursive: false, excludes: [] }): IDisposable { let watchDisposed = false; @@ -934,7 +950,7 @@ export class FileService extends Disposable implements IFileService { //#region Helpers - private writeQueues: Map> = new Map(); + private readonly writeQueues: Map> = new Map(); private ensureWriteQueue(provider: IFileSystemProvider, resource: URI): Queue { const { extUri } = this.getExtUri(provider); diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index f2463320382..b8b4bdfd1ee 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -140,6 +140,12 @@ export interface IFileService { */ canCopy(source: URI, target: URI, overwrite?: boolean): Promise; + /** + * Find out if a file create operation is possible given the arguments. No changes on disk will + * be performed. Returns an Error if the operation cannot be done. + */ + canCreateFile(resource: URI, options?: ICreateFileOptions): Promise; + /** * Creates a new file with the given path and optional contents. The returned promise * will have the stat model object as a result. diff --git a/src/vs/platform/files/common/inMemoryFilesystemProvider.ts b/src/vs/platform/files/common/inMemoryFilesystemProvider.ts index 1432be01a11..e5708db8bed 100644 --- a/src/vs/platform/files/common/inMemoryFilesystemProvider.ts +++ b/src/vs/platform/files/common/inMemoryFilesystemProvider.ts @@ -11,7 +11,7 @@ import { URI } from 'vs/base/common/uri'; class File implements IStat { - type: FileType; + type: FileType.File; ctime: number; mtime: number; size: number; @@ -30,7 +30,7 @@ class File implements IStat { class Directory implements IStat { - type: FileType; + type: FileType.Directory; ctime: number; mtime: number; size: number; diff --git a/src/vs/workbench/services/log/common/keyValueLogProvider.ts b/src/vs/platform/files/common/keyValueFileSystemProvider.ts similarity index 85% rename from src/vs/workbench/services/log/common/keyValueLogProvider.ts rename to src/vs/platform/files/common/keyValueFileSystemProvider.ts index 7d13c9a2e65..e8dfb610926 100644 --- a/src/vs/workbench/services/log/common/keyValueLogProvider.ts +++ b/src/vs/platform/files/common/keyValueFileSystemProvider.ts @@ -8,11 +8,11 @@ import { IFileSystemProviderWithFileReadWriteCapability, FileSystemProviderCapab import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; import { VSBuffer } from 'vs/base/common/buffer'; -import { joinPath, extUri } from 'vs/base/common/resources'; +import { joinPath, extUri, dirname } from 'vs/base/common/resources'; import { values } from 'vs/base/common/map'; import { localize } from 'vs/nls'; -export abstract class KeyValueLogProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { +export abstract class KeyValueFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.FileReadWrite @@ -23,9 +23,12 @@ export abstract class KeyValueLogProvider extends Disposable implements IFileSys readonly onDidChangeFile: Event = this._onDidChangeFile.event; private readonly versions: Map = new Map(); + private readonly dirs: Set = new Set(); constructor(private readonly scheme: string) { super(); + // Add root directory by default + this.dirs.add('/'); } watch(resource: URI, opts: IWatchOptions): IDisposable { @@ -33,6 +36,17 @@ export abstract class KeyValueLogProvider extends Disposable implements IFileSys } async mkdir(resource: URI): Promise { + try { + const resourceStat = await this.stat(resource); + if (resourceStat.type === FileType.File) { + throw createFileSystemProviderError(localize('fileNotDirectory', "File is not a directory"), FileSystemProviderErrorCode.FileNotADirectory); + } + } catch (error) { /* Ignore */ } + + // Make sure parent dir exists + await this.stat(dirname(resource)); + + this.dirs.add(resource.path); } async stat(resource: URI): Promise { @@ -55,6 +69,14 @@ export abstract class KeyValueLogProvider extends Disposable implements IFileSys size: 0 }; } + if (this.dirs.has(resource.path)) { + return { + type: FileType.Directory, + ctime: 0, + mtime: 0, + size: 0 + }; + } throw createFileSystemProviderError(localize('fileNotExists', "File does not exist"), FileSystemProviderErrorCode.FileNotFound); } diff --git a/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts b/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts index de3211dae17..1ba8c20f3e4 100644 --- a/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts +++ b/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts @@ -15,7 +15,7 @@ export class DiskFileSystemProvider extends NodeDiskFileSystemProvider { constructor( logService: ILogService, - private electronService: IElectronService, + private readonly electronService: IElectronService, options?: IDiskFileSystemProviderOptions ) { super(logService, options); diff --git a/src/vs/platform/files/node/diskFileSystemProvider.ts b/src/vs/platform/files/node/diskFileSystemProvider.ts index df266edaa01..c551bcac9c2 100644 --- a/src/vs/platform/files/node/diskFileSystemProvider.ts +++ b/src/vs/platform/files/node/diskFileSystemProvider.ts @@ -46,7 +46,10 @@ export class DiskFileSystemProvider extends Disposable implements private readonly BUFFER_SIZE = this.options?.bufferSize || 64 * 1024; - constructor(private logService: ILogService, private options?: IDiskFileSystemProviderOptions) { + constructor( + private readonly logService: ILogService, + private readonly options?: IDiskFileSystemProviderOptions + ) { super(); } @@ -198,9 +201,9 @@ export class DiskFileSystemProvider extends Disposable implements } } - private mapHandleToPos: Map = new Map(); + private readonly mapHandleToPos: Map = new Map(); - private writeHandles: Set = new Set(); + private readonly writeHandles: Set = new Set(); private canFlush: boolean = true; async open(resource: URI, opts: FileOpenOptions): Promise { @@ -502,14 +505,14 @@ export class DiskFileSystemProvider extends Disposable implements //#region File Watching - private _onDidWatchErrorOccur = this._register(new Emitter()); + private readonly _onDidWatchErrorOccur = this._register(new Emitter()); readonly onDidErrorOccur = this._onDidWatchErrorOccur.event; - private _onDidChangeFile = this._register(new Emitter()); + private readonly _onDidChangeFile = this._register(new Emitter()); readonly onDidChangeFile = this._onDidChangeFile.event; private recursiveWatcher: WindowsWatcherService | UnixWatcherService | NsfwWatcherService | undefined; - private recursiveFoldersToWatch: { path: string, excludes: string[] }[] = []; + private readonly recursiveFoldersToWatch: { path: string, excludes: string[] }[] = []; private recursiveWatchRequestDelayer = this._register(new ThrottledDelayer(0)); private recursiveWatcherLogLevelListener: IDisposable | undefined; diff --git a/src/vs/platform/files/test/electron-browser/diskFileService.test.ts b/src/vs/platform/files/test/electron-browser/diskFileService.test.ts index b170a7628b4..3a290e0c0c1 100644 --- a/src/vs/platform/files/test/electron-browser/diskFileService.test.ts +++ b/src/vs/platform/files/test/electron-browser/diskFileService.test.ts @@ -1549,23 +1549,23 @@ suite('Disk File Service', function () { assert.equal(error!.fileOperationResult, FileOperationResult.FILE_EXCEEDS_MEMORY_LIMIT); } - test('readFile - FILE_TOO_LARGE - default', async () => { + (isWindows ? test.skip /* flaky test */ : test)('readFile - FILE_TOO_LARGE - default', async () => { return testFileTooLarge(); }); - test('readFile - FILE_TOO_LARGE - buffered', async () => { + (isWindows ? test.skip /* flaky test */ : test)('readFile - FILE_TOO_LARGE - buffered', async () => { setCapabilities(fileProvider, FileSystemProviderCapabilities.FileOpenReadWriteClose); return testFileTooLarge(); }); - test('readFile - FILE_TOO_LARGE - unbuffered', async () => { + (isWindows ? test.skip /* flaky test */ : test)('readFile - FILE_TOO_LARGE - unbuffered', async () => { setCapabilities(fileProvider, FileSystemProviderCapabilities.FileReadWrite); return testFileTooLarge(); }); - test('readFile - FILE_TOO_LARGE - streamed', async () => { + (isWindows ? test.skip /* flaky test */ : test)('readFile - FILE_TOO_LARGE - streamed', async () => { setCapabilities(fileProvider, FileSystemProviderCapabilities.FileReadStream); return testFileTooLarge(); @@ -1611,6 +1611,8 @@ suite('Disk File Service', function () { const contents = 'Hello World'; const resource = URI.file(join(testDir, 'test.txt')); + + assert.equal(await service.canCreateFile(resource), true); const fileStat = await service.createFile(resource, converter(contents)); assert.equal(fileStat.name, 'test.txt'); assert.equal(existsSync(fileStat.resource.fsPath), true); @@ -1628,6 +1630,8 @@ suite('Disk File Service', function () { writeFileSync(resource.fsPath, ''); // create file + assert.ok((await service.canCreateFile(resource)) instanceof Error); + let error; try { await service.createFile(resource, VSBuffer.fromString(contents)); @@ -1647,6 +1651,7 @@ suite('Disk File Service', function () { writeFileSync(resource.fsPath, ''); // create file + assert.equal(await service.canCreateFile(resource, { overwrite: true }), true); const fileStat = await service.createFile(resource, VSBuffer.fromString(contents), { overwrite: true }); assert.equal(fileStat.name, 'test.txt'); assert.equal(existsSync(fileStat.resource.fsPath), true); diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 76ea96249b9..30ad4283515 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -96,8 +96,7 @@ export class InstantiationService implements IInstantiationService { // check for argument mismatches, adjust static args if needed if (args.length !== firstServiceArgPos) { - console.warn(`[createInstance] First service dependency of ${ctor.name} at position ${ - firstServiceArgPos + 1} conflicts with ${args.length} static arguments`); + console.warn(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`); let delta = firstServiceArgPos - args.length; if (delta > 0) { diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 561fb1ad169..087307e1862 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -196,7 +196,9 @@ export class IssueMainService implements ICommonIssueService { webPreferences: { preload: URI.parse(require.toUrl('vs/base/parts/sandbox/electron-browser/preload.js')).fsPath, nodeIntegration: true, - enableWebSQL: false + enableWebSQL: false, + enableRemoteModule: false, + nativeWindowOpen: true } }); @@ -247,7 +249,9 @@ export class IssueMainService implements ICommonIssueService { webPreferences: { preload: URI.parse(require.toUrl('vs/base/parts/sandbox/electron-browser/preload.js')).fsPath, nodeIntegration: true, - enableWebSQL: false + enableWebSQL: false, + enableRemoteModule: false, + nativeWindowOpen: true } }); diff --git a/src/vs/platform/keybinding/test/common/mockKeybindingService.ts b/src/vs/platform/keybinding/test/common/mockKeybindingService.ts index 998169968bd..a147dd652cc 100644 --- a/src/vs/platform/keybinding/test/common/mockKeybindingService.ts +++ b/src/vs/platform/keybinding/test/common/mockKeybindingService.ts @@ -53,7 +53,7 @@ export class MockContextKeyService implements IContextKeyService { public get onDidChangeContext(): Event { return Event.None; } - public bufferChangeEvents() { } + public bufferChangeEvents(callback: () => void) { callback(); } public getContextKeyValue(key: string) { const value = this._keys.get(key); if (value) { diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 3c9f08288cf..586b2304f3c 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -6,7 +6,7 @@ import { createStyleSheet } from 'vs/base/browser/dom'; import { IListMouseEvent, IListTouchEvent, IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer, PagedList, IPagedListOptions } from 'vs/base/browser/ui/list/listPaging'; -import { DefaultStyleController, IListOptions, IMultipleSelectionController, IOpenController, isSelectionRangeChangeEvent, isSelectionSingleChangeEvent, List, IListAccessibilityProvider, IListOptionsUpdate } from 'vs/base/browser/ui/list/listWidget'; +import { DefaultStyleController, IListOptions, IMultipleSelectionController, isSelectionRangeChangeEvent, isSelectionSingleChangeEvent, List, IListAccessibilityProvider, IListOptionsUpdate } from 'vs/base/browser/ui/list/listWidget'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, dispose, IDisposable, toDisposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; @@ -21,13 +21,14 @@ import { attachListStyler, computeStyles, defaultListStyles, IColorMapping } fro import { IThemeService } from 'vs/platform/theme/common/themeService'; import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; import { ObjectTree, IObjectTreeOptions, ICompressibleTreeRenderer, CompressibleObjectTree, ICompressibleObjectTreeOptions, ICompressibleObjectTreeOptionsUpdate } from 'vs/base/browser/ui/tree/objectTree'; -import { ITreeRenderer, IAsyncDataSource, IDataSource } from 'vs/base/browser/ui/tree/tree'; +import { ITreeRenderer, IAsyncDataSource, IDataSource, ITreeEvent } from 'vs/base/browser/ui/tree/tree'; import { AsyncDataTree, IAsyncDataTreeOptions, CompressibleAsyncDataTree, ITreeCompressionDelegate, ICompressibleAsyncDataTreeOptions, IAsyncDataTreeOptionsUpdate } from 'vs/base/browser/ui/tree/asyncDataTree'; import { DataTree, IDataTreeOptions } from 'vs/base/browser/ui/tree/dataTree'; import { IKeyboardNavigationEventFilter, IAbstractTreeOptions, RenderIndentGuides, IAbstractTreeOptionsUpdate } from 'vs/base/browser/ui/tree/abstractTree'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; export type ListWidget = List | PagedList | ObjectTree | DataTree | AsyncDataTree; +export type WorkbenchListWidget = WorkbenchList | WorkbenchPagedList | WorkbenchObjectTree | WorkbenchCompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree; export const IListService = createDecorator('listService'); @@ -38,11 +39,11 @@ export interface IListService { /** * Returns the currently focused list widget if any. */ - readonly lastFocusedList: ListWidget | undefined; + readonly lastFocusedList: WorkbenchListWidget | undefined; } interface IRegisteredList { - widget: ListWidget; + widget: WorkbenchListWidget; extraContextKeys?: (IContextKey)[]; } @@ -52,17 +53,17 @@ export class ListService implements IListService { private disposables = new DisposableStore(); private lists: IRegisteredList[] = []; - private _lastFocusedWidget: ListWidget | undefined = undefined; + private _lastFocusedWidget: WorkbenchListWidget | undefined = undefined; private _hasCreatedStyleController: boolean = false; - get lastFocusedList(): ListWidget | undefined { + get lastFocusedList(): WorkbenchListWidget | undefined { return this._lastFocusedWidget; } constructor(@IThemeService private readonly _themeService: IThemeService) { } - register(widget: ListWidget, extraContextKeys?: (IContextKey)[]): IDisposable { + register(widget: WorkbenchListWidget, extraContextKeys?: (IContextKey)[]): IDisposable { if (!this._hasCreatedStyleController) { this._hasCreatedStyleController = true; // create a shared default tree style sheet for performance reasons @@ -130,10 +131,6 @@ function useAltAsMultipleSelectionModifier(configurationService: IConfigurationS return configurationService.getValue(multiSelectModifierSettingKey) === 'alt'; } -function useSingleClickToOpen(configurationService: IConfigurationService): boolean { - return configurationService.getValue(openModeSettingKey) !== 'doubleClick'; -} - class MultipleSelectionController extends Disposable implements IMultipleSelectionController { private useAltAsMultipleSelectionModifier: boolean; @@ -166,44 +163,6 @@ class MultipleSelectionController extends Disposable implements IMultipleSele } } -class WorkbenchOpenController extends Disposable implements IOpenController { - private openOnSingleClick: boolean; - - constructor(private configurationService: IConfigurationService, private existingOpenController?: IOpenController) { - super(); - - this.openOnSingleClick = useSingleClickToOpen(configurationService); - - this.registerListeners(); - } - - private registerListeners(): void { - this._register(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(openModeSettingKey)) { - this.openOnSingleClick = useSingleClickToOpen(this.configurationService); - } - })); - } - - shouldOpen(event: UIEvent): boolean { - if (event instanceof MouseEvent) { - const isLeftButton = event.button === 0; - const isDoubleClick = event.detail === 2; - if (isLeftButton && !this.openOnSingleClick && !isDoubleClick) { - return false; - } - - if (isLeftButton /* left mouse button */ || event.button === 1 /* middle mouse button */) { - return this.existingOpenController ? this.existingOpenController.shouldOpen(event) : true; - } - - return false; - } - - return this.existingOpenController ? this.existingOpenController.shouldOpen(event) : true; - } -} - function toWorkbenchListOptions(options: IListOptions, configurationService: IConfigurationService, keybindingService: IKeybindingService): [IListOptions, IDisposable] { const disposables = new DisposableStore(); const result = { ...options }; @@ -214,16 +173,14 @@ function toWorkbenchListOptions(options: IListOptions, configurationServic disposables.add(multipleSelectionController); } - const openController = new WorkbenchOpenController(configurationService, options.openController); - result.openController = openController; - disposables.add(openController); - result.keyboardNavigationDelegate = { mightProducePrintableCharacter(e) { return keybindingService.mightProducePrintableCharacter(e); } }; + result.smoothScrolling = configurationService.getValue(listSmoothScrolling); + return [result, disposables]; } @@ -238,7 +195,6 @@ export interface IWorkbenchListOptions extends IWorkbenchListOptionsUpdate, I export class WorkbenchList extends List { readonly contextKeyService: IContextKeyService; - private readonly configurationService: IConfigurationService; private readonly themeService: IThemeService; private listHasSelectionOrFocus: IContextKey; @@ -276,7 +232,6 @@ export class WorkbenchList extends List { this.disposables.add(workbenchListOptionsDisposable); this.contextKeyService = createScopedContextKeyService(contextKeyService, this); - this.configurationService = configurationService; this.themeService = themeService; const listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService); @@ -310,8 +265,25 @@ export class WorkbenchList extends List { this.listHasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); })); + this.disposables.add(configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(multiSelectModifierSettingKey)) { + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); + } - this.registerListeners(); + let options: IListOptionsUpdate = {}; + + if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === undefined) { + const horizontalScrolling = configurationService.getValue(horizontalScrollingKey); + options = { ...options, horizontalScrolling }; + } + if (e.affectsConfiguration(listSmoothScrolling)) { + const smoothScrolling = configurationService.getValue(listSmoothScrolling); + options = { ...options, smoothScrolling }; + } + if (Object.keys(options).length > 0) { + this.updateOptions(options); + } + })); } updateOptions(options: IWorkbenchListOptionsUpdate): void { @@ -337,18 +309,6 @@ export class WorkbenchList extends List { this._styler = attachListStyler(this, this.themeService, styles); } - private registerListeners(): void { - this.disposables.add(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(multiSelectModifierSettingKey)) { - this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(this.configurationService); - } - if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === undefined) { - const horizontalScrolling = this.configurationService.getValue(horizontalScrollingKey); - this.updateOptions({ horizontalScrolling }); - } - })); - } - get useAltAsMultipleSelectionModifier(): boolean { return this._useAltAsMultipleSelectionModifier; } @@ -361,7 +321,6 @@ export interface IWorkbenchPagedListOptions extends IWorkbenchListOptionsUpda export class WorkbenchPagedList extends PagedList { readonly contextKeyService: IContextKeyService; - private readonly configurationService: IConfigurationService; private readonly disposables: DisposableStore; @@ -395,7 +354,6 @@ export class WorkbenchPagedList extends PagedList { this.disposables.add(workbenchListOptionsDisposable); this.contextKeyService = createScopedContextKeyService(contextKeyService, this); - this.configurationService = configurationService; this.horizontalScrolling = options.horizontalScrolling; const listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService); @@ -410,17 +368,23 @@ export class WorkbenchPagedList extends PagedList { this.disposables.add(attachListStyler(this, themeService, options.overrideStyles)); } - this.registerListeners(); - } - - private registerListeners(): void { - this.disposables.add(this.configurationService.onDidChangeConfiguration(e => { + this.disposables.add(configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(multiSelectModifierSettingKey)) { - this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(this.configurationService); + this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); } + + let options: IListOptionsUpdate = {}; + if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === undefined) { - const horizontalScrolling = this.configurationService.getValue(horizontalScrollingKey); - this.updateOptions({ horizontalScrolling }); + const horizontalScrolling = configurationService.getValue(horizontalScrollingKey); + options = { ...options, horizontalScrolling }; + } + if (e.affectsConfiguration(listSmoothScrolling)) { + const smoothScrolling = configurationService.getValue(listSmoothScrolling); + options = { ...options, smoothScrolling }; + } + if (Object.keys(options).length > 0) { + this.updateOptions(options); } })); } @@ -455,8 +419,8 @@ export interface IOpenEvent { } export interface IResourceNavigatorOptions { + readonly configurationService?: IConfigurationService; readonly openOnFocus?: boolean; - readonly openOnSelection?: boolean; readonly openOnSingleClick?: boolean; } @@ -473,101 +437,119 @@ export function getSelectionKeyboardEvent(typeArg = 'keydown', preserveFocus?: b abstract class ResourceNavigator extends Disposable { - private readonly options: IResourceNavigatorOptions; + private readonly openOnFocus: boolean; + private openOnSingleClick: boolean; - private readonly _onDidOpenResource = new Emitter>(); - readonly onDidOpenResource: Event> = this._onDidOpenResource.event; + private readonly _onDidOpen = new Emitter>(); + readonly onDidOpen: Event> = this._onDidOpen.event; constructor( - private readonly treeOrList: { - getFocus(): (T | null)[], - getSelection(): (T | null)[], - setSelection(elements: (T | null)[], browserEvent?: UIEvent): void, - onDidChangeFocus: Event<{ browserEvent?: UIEvent }>, - onDidChangeSelection: Event<{ browserEvent?: UIEvent }>, - onDidOpen: Event<{ browserEvent?: UIEvent }>, - readonly openOnSingleClick?: boolean - }, + private readonly widget: ListWidget, options?: IResourceNavigatorOptions ) { super(); - this.options = { openOnSelection: true, ...(options || {}) }; + this.openOnFocus = options?.openOnFocus ?? false; + this.openOnSingleClick = options?.openOnSingleClick ?? true; - this.registerListeners(); - } + this._register(Event.filter(this.widget.onDidChangeSelection, e => e.browserEvent instanceof KeyboardEvent)(e => this.onSelectionFromKeyboard(e))); + this._register(this.widget.onPointer((e: { browserEvent: MouseEvent }) => this.onPointer(e.browserEvent))); + this._register(this.widget.onMouseDblClick((e: { browserEvent: MouseEvent }) => this.onMouseDblClick(e.browserEvent))); - private registerListeners(): void { - if (this.options && this.options.openOnFocus) { - this._register(this.treeOrList.onDidChangeFocus(e => this.onFocus(e.browserEvent))); + if (this.openOnFocus) { + this._register(Event.filter(this.widget.onDidChangeFocus, e => e.browserEvent instanceof KeyboardEvent)(e => this.onFocusFromKeyboard(e))); } - if (this.options && this.options.openOnSelection) { - this._register(this.treeOrList.onDidChangeSelection(e => this.onSelection(e.browserEvent))); + if (typeof options?.openOnSingleClick !== 'boolean' && options?.configurationService) { + this._register(options?.configurationService.onDidChangeConfiguration(() => { + this.openOnSingleClick = options?.configurationService!.getValue(openModeSettingKey) !== 'doubleClick'; + })); } - - this._register(this.treeOrList.onDidOpen(e => this.onSelection(e.browserEvent))); } - private onFocus(browserEvent?: UIEvent): void { - const focus = this.treeOrList.getFocus(); - this.treeOrList.setSelection(focus, browserEvent); + private onFocusFromKeyboard(event: ITreeEvent): void { + const focus = this.widget.getFocus(); + this.widget.setSelection(focus, event.browserEvent); + const preserveFocus = typeof (event.browserEvent as SelectionKeyboardEvent).preserveFocus === 'boolean' ? (event.browserEvent as SelectionKeyboardEvent).preserveFocus! : true; + const pinned = false; + const sideBySide = false; + + this._open(preserveFocus, pinned, sideBySide, event.browserEvent); + } + + private onSelectionFromKeyboard(event: ITreeEvent): void { + if (event.elements.length !== 1) { + return; + } + + const preserveFocus = typeof (event.browserEvent as SelectionKeyboardEvent).preserveFocus === 'boolean' ? (event.browserEvent as SelectionKeyboardEvent).preserveFocus! : true; + const pinned = false; + const sideBySide = false; + + this._open(preserveFocus, pinned, sideBySide, event.browserEvent); + } + + private onPointer(browserEvent: MouseEvent): void { + const isDoubleClick = browserEvent.detail === 2; + + if (!this.openOnSingleClick && !isDoubleClick) { + return; + } + + const isMiddleClick = browserEvent.button === 1; + const preserveFocus = !isDoubleClick; + const pinned = isDoubleClick || isMiddleClick; + const sideBySide = browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey; + + this._open(preserveFocus, pinned, sideBySide, browserEvent); + } + + private onMouseDblClick(browserEvent?: MouseEvent): void { if (!browserEvent) { return; } - const isMouseEvent = browserEvent && browserEvent instanceof MouseEvent; + const preserveFocus = false; + const pinned = true; + const sideBySide = (browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey); - if (!isMouseEvent) { - const preserveFocus = (browserEvent instanceof KeyboardEvent && typeof (browserEvent).preserveFocus === 'boolean') ? - !!(browserEvent).preserveFocus : - true; - - this.open(preserveFocus, false, false, browserEvent); - } + this._open(preserveFocus, pinned, sideBySide, browserEvent); } - private onSelection(browserEvent?: MouseEvent | UIEvent): void { - if (!browserEvent || browserEvent.type === 'contextmenu') { - return; - } - - const isKeyboardEvent = browserEvent instanceof KeyboardEvent; - const isMiddleClick = browserEvent instanceof MouseEvent ? browserEvent.button === 1 : false; - const isDoubleClick = browserEvent.detail === 2; - const preserveFocus = (browserEvent instanceof KeyboardEvent && typeof (browserEvent).preserveFocus === 'boolean') ? - !!(browserEvent).preserveFocus : - !isDoubleClick; - - if (this.options.openOnSingleClick || this.treeOrList.openOnSingleClick || isDoubleClick || isKeyboardEvent) { - const sideBySide = browserEvent instanceof MouseEvent && (browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey); - this.open(preserveFocus, isDoubleClick || isMiddleClick, sideBySide, browserEvent); - } - } - - private open(preserveFocus: boolean, pinned: boolean, sideBySide: boolean, browserEvent?: UIEvent): void { - this._onDidOpenResource.fire({ + private _open(preserveFocus: boolean, pinned: boolean, sideBySide: boolean, browserEvent?: UIEvent): void { + this._onDidOpen.fire({ editorOptions: { preserveFocus, pinned, revealIfVisible: true }, sideBySide, - element: this.treeOrList.getSelection()[0], + element: this.widget.getSelection()[0], browserEvent }); } + + // hack for References Widget: pressing Enter on already selected tree element + open(browserEvent?: UIEvent): void { + this._open((browserEvent as any)?.preserveFocus || false, true, false, browserEvent); + } } export class ListResourceNavigator extends ResourceNavigator { - constructor(list: WorkbenchList | WorkbenchPagedList, options?: IResourceNavigatorOptions) { + constructor( + list: List | PagedList, + options?: IResourceNavigatorOptions + ) { super(list, options); } } -export class TreeResourceNavigator extends ResourceNavigator { - constructor(tree: WorkbenchObjectTree | WorkbenchCompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree, options: IResourceNavigatorOptions = {}) { +class TreeResourceNavigator extends ResourceNavigator { + constructor( + tree: ObjectTree | CompressibleObjectTree | DataTree | AsyncDataTree | CompressibleAsyncDataTree, + options: IResourceNavigatorOptions + ) { super(tree, options); } } @@ -593,7 +575,7 @@ function createKeyboardNavigationEventFilter(container: HTMLElement, keybindingS }; } -export interface IWorkbenchObjectTreeOptions extends IObjectTreeOptions { +export interface IWorkbenchObjectTreeOptions extends IObjectTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; readonly overrideStyles?: IColorMapping; } @@ -603,6 +585,7 @@ export class WorkbenchObjectTree, TFilterData = void> private internals: WorkbenchTreeInternals; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -623,13 +606,17 @@ export class WorkbenchObjectTree, TFilterData = void> this.internals = new WorkbenchTreeInternals(this, options, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); this.disposables.add(this.internals); } + + open(browserEvent?: UIEvent): void { + this.internals.open(browserEvent); + } } export interface IWorkbenchCompressibleObjectTreeOptionsUpdate extends ICompressibleObjectTreeOptionsUpdate { readonly overrideStyles?: IColorMapping; } -export interface IWorkbenchCompressibleObjectTreeOptions extends IWorkbenchCompressibleObjectTreeOptionsUpdate, ICompressibleObjectTreeOptions { +export interface IWorkbenchCompressibleObjectTreeOptions extends IWorkbenchCompressibleObjectTreeOptionsUpdate, ICompressibleObjectTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; } @@ -638,6 +625,7 @@ export class WorkbenchCompressibleObjectTree, TFilter private internals: WorkbenchTreeInternals; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -666,13 +654,17 @@ export class WorkbenchCompressibleObjectTree, TFilter this.internals.updateStyleOverrides(options.overrideStyles); } } + + open(browserEvent?: UIEvent): void { + this.internals.open(browserEvent); + } } export interface IWorkbenchDataTreeOptionsUpdate extends IAbstractTreeOptionsUpdate { readonly overrideStyles?: IColorMapping; } -export interface IWorkbenchDataTreeOptions extends IWorkbenchDataTreeOptionsUpdate, IDataTreeOptions { +export interface IWorkbenchDataTreeOptions extends IWorkbenchDataTreeOptionsUpdate, IDataTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; } @@ -681,6 +673,7 @@ export class WorkbenchDataTree extends DataTree; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -710,13 +703,17 @@ export class WorkbenchDataTree extends DataTree extends IWorkbenchAsyncDataTreeOptionsUpdate, IAsyncDataTreeOptions { +export interface IWorkbenchAsyncDataTreeOptions extends IWorkbenchAsyncDataTreeOptionsUpdate, IAsyncDataTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; } @@ -725,6 +722,7 @@ export class WorkbenchAsyncDataTree extends Async private internals: WorkbenchTreeInternals; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -754,9 +752,13 @@ export class WorkbenchAsyncDataTree extends Async this.internals.updateStyleOverrides(options.overrideStyles); } } + + open(browserEvent?: UIEvent): void { + this.internals.open(browserEvent); + } } -export interface IWorkbenchCompressibleAsyncDataTreeOptions extends ICompressibleAsyncDataTreeOptions { +export interface IWorkbenchCompressibleAsyncDataTreeOptions extends ICompressibleAsyncDataTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; readonly overrideStyles?: IColorMapping; } @@ -766,6 +768,7 @@ export class WorkbenchCompressibleAsyncDataTree e private internals: WorkbenchTreeInternals; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -788,6 +791,10 @@ export class WorkbenchCompressibleAsyncDataTree e this.internals = new WorkbenchTreeInternals(this, options, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); this.disposables.add(this.internals); } + + open(browserEvent?: UIEvent): void { + this.internals.open(browserEvent); + } } function workbenchTreeDataPreamble | IAsyncDataTreeOptions>( @@ -819,7 +826,6 @@ function workbenchTreeDataPreamble(keyboardNavigationSettingKey); const horizontalScrolling = options.horizontalScrolling !== undefined ? options.horizontalScrolling : configurationService.getValue(horizontalScrollingKey); - const openOnSingleClick = useSingleClickToOpen(configurationService); const [workbenchListOptions, disposable] = toWorkbenchListOptions(options, configurationService, keybindingService); const additionalScrollHeight = options.additionalScrollHeight; @@ -837,10 +843,10 @@ function workbenchTreeDataPreamble { private _useAltAsMultipleSelectionModifier: boolean; private disposables: IDisposable[] = []; private styler: IDisposable | undefined; + private navigator: TreeResourceNavigator; + + get onDidOpen(): Event> { return this.navigator.onDidOpen; } constructor( - private tree: WorkbenchObjectTree | CompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree, - options: IAbstractTreeOptions | IAsyncDataTreeOptions, + private tree: WorkbenchObjectTree | WorkbenchCompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree, + options: IWorkbenchObjectTreeOptions | IWorkbenchCompressibleObjectTreeOptions | IWorkbenchDataTreeOptions | IWorkbenchAsyncDataTreeOptions | IWorkbenchCompressibleAsyncDataTreeOptions, getAutomaticKeyboardNavigation: () => boolean | undefined, overrideStyles: IColorMapping | undefined, @IContextKeyService contextKeyService: IContextKeyService, @@ -909,9 +918,6 @@ class WorkbenchTreeInternals { }), configurationService.onDidChangeConfiguration(e => { let newOptions: any = {}; - if (e.affectsConfiguration(openModeSettingKey)) { - newOptions = { ...newOptions, openOnSingleClick: useSingleClickToOpen(configurationService) }; - } if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); } @@ -937,6 +943,9 @@ class WorkbenchTreeInternals { const horizontalScrolling = configurationService.getValue(horizontalScrollingKey); newOptions = { ...newOptions, horizontalScrolling }; } + if (e.affectsConfiguration(openModeSettingKey)) { + newOptions = { ...newOptions, expandOnlyOnDoubleClick: configurationService.getValue(openModeSettingKey) === 'doubleClick' }; + } if (Object.keys(newOptions).length > 0) { tree.updateOptions(newOptions); } @@ -948,6 +957,9 @@ class WorkbenchTreeInternals { }), accessibilityService.onDidChangeScreenReaderOptimized(() => updateKeyboardNavigation()) ); + + this.navigator = new TreeResourceNavigator(tree, { configurationService, ...options }); + this.disposables.push(this.navigator); } get useAltAsMultipleSelectionModifier(): boolean { @@ -959,6 +971,10 @@ class WorkbenchTreeInternals { this.styler = overrideStyles ? attachListStyler(this.tree, this.themeService, overrideStyles) : Disposable.None; } + open(browserEvent?: UIEvent): void { + this.navigator.open(browserEvent); + } + dispose(): void { this.disposables = dispose(this.disposables); dispose(this.styler); diff --git a/src/vs/platform/log/common/logIpc.ts b/src/vs/platform/log/common/logIpc.ts index c8f7dd559a6..4c92e8d88af 100644 --- a/src/vs/platform/log/common/logIpc.ts +++ b/src/vs/platform/log/common/logIpc.ts @@ -75,14 +75,14 @@ export class LoggerChannelClient { export class FollowerLogService extends DelegatedLogService implements ILogService { declare readonly _serviceBrand: undefined; - constructor(private master: LoggerChannelClient, logService: ILogService) { + constructor(private parent: LoggerChannelClient, logService: ILogService) { super(logService); - this._register(master.onDidChangeLogLevel(level => logService.setLevel(level))); + this._register(parent.onDidChangeLogLevel(level => logService.setLevel(level))); } setLevel(level: LogLevel): void { super.setLevel(level); - this.master.setLevel(level); + this.parent.setLevel(level); } } diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index 46e88cd5537..5c39fe6c2a5 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -61,7 +61,7 @@ export class Menubar { private keybindings: { [commandId: string]: IMenubarKeybinding }; - private readonly fallbackMenuHandlers: { [id: string]: (menuItem: MenuItem, browserWindow: BrowserWindow, event: Event) => void } = Object.create(null); + private readonly fallbackMenuHandlers: { [id: string]: (menuItem: MenuItem, browserWindow: BrowserWindow | undefined, event: Event) => void } = Object.create(null); constructor( @IUpdateService private readonly updateService: IUpdateService, @@ -113,8 +113,8 @@ export class Menubar { private addFallbackHandlers(): void { // File Menu Items - this.fallbackMenuHandlers['workbench.action.files.newUntitledFile'] = (menuItem, win, event) => this.windowsMainService.openEmptyWindow({ context: OpenContext.MENU, contextWindowId: win.id }); - this.fallbackMenuHandlers['workbench.action.newWindow'] = (menuItem, win, event) => this.windowsMainService.openEmptyWindow({ context: OpenContext.MENU, contextWindowId: win.id }); + this.fallbackMenuHandlers['workbench.action.files.newUntitledFile'] = (menuItem, win, event) => this.windowsMainService.openEmptyWindow({ context: OpenContext.MENU, contextWindowId: win?.id }); + this.fallbackMenuHandlers['workbench.action.newWindow'] = (menuItem, win, event) => this.windowsMainService.openEmptyWindow({ context: OpenContext.MENU, contextWindowId: win?.id }); this.fallbackMenuHandlers['workbench.action.files.openFileFolder'] = (menuItem, win, event) => this.electronMainService.pickFileFolderAndOpen(undefined, { forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }); this.fallbackMenuHandlers['workbench.action.openWorkspace'] = (menuItem, win, event) => this.electronMainService.pickWorkspaceAndOpen(undefined, { forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }); @@ -432,7 +432,7 @@ export class Menubar { menu.append(__separator__()); } else if (isMenubarMenuItemSubmenu(item)) { const submenu = new Menu(); - const submenuItem = new MenuItem({ label: this.mnemonicLabel(item.label), submenu: submenu }); + const submenuItem = new MenuItem({ label: this.mnemonicLabel(item.label), submenu }); this.setMenu(submenu, item.submenu.items); menu.append(submenuItem); } else if (isMenubarMenuItemUriAction(item)) { diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index c413616e472..67083e24df7 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -20,7 +20,7 @@ if (isWeb) { // Running out of sources if (Object.keys(product).length === 0) { Object.assign(product, { - version: '1.46.0-dev', + version: '1.48.0-dev', nameLong: 'Visual Studio Code Web Dev', nameShort: 'VSCode Web Dev', urlProtocol: 'code-oss' diff --git a/src/vs/platform/remote/common/tunnel.ts b/src/vs/platform/remote/common/tunnel.ts index 3f6356d41de..c2275c2948c 100644 --- a/src/vs/platform/remote/common/tunnel.ts +++ b/src/vs/platform/remote/common/tunnel.ts @@ -3,10 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { URI } from 'vs/base/common/uri'; -import { Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection'; export const ITunnelService = createDecorator('tunnelService'); @@ -35,7 +37,7 @@ export interface ITunnelService { readonly onTunnelOpened: Event; readonly onTunnelClosed: Event<{ host: string, port: number }>; - openTunnel(remoteHost: string | undefined, remotePort: number, localPort?: number): Promise | undefined; + openTunnel(addressProvider: IAddressProvider | undefined, remoteHost: string | undefined, remotePort: number, localPort?: number): Promise | undefined; closeTunnel(remoteHost: string, remotePort: number): Promise; setTunnelProvider(provider: ITunnelProvider | undefined): IDisposable; } @@ -53,3 +55,144 @@ export function extractLocalHostUriMetaDataForPortMapping(uri: URI): { address: port: +localhostMatch[2], }; } + + + +export abstract class AbstractTunnelService implements ITunnelService { + declare readonly _serviceBrand: undefined; + + private _onTunnelOpened: Emitter = new Emitter(); + public onTunnelOpened: Event = this._onTunnelOpened.event; + private _onTunnelClosed: Emitter<{ host: string, port: number }> = new Emitter(); + public onTunnelClosed: Event<{ host: string, port: number }> = this._onTunnelClosed.event; + protected readonly _tunnels = new Map }>>(); + protected _tunnelProvider: ITunnelProvider | undefined; + + public constructor( + @ILogService protected readonly logService: ILogService + ) { } + + setTunnelProvider(provider: ITunnelProvider | undefined): IDisposable { + if (!provider) { + return { + dispose: () => { } + }; + } + this._tunnelProvider = provider; + return { + dispose: () => { + this._tunnelProvider = undefined; + } + }; + } + + public get tunnels(): Promise { + const promises: Promise[] = []; + Array.from(this._tunnels.values()).forEach(portMap => Array.from(portMap.values()).forEach(x => promises.push(x.value))); + return Promise.all(promises); + } + + dispose(): void { + for (const portMap of this._tunnels.values()) { + for (const { value } of portMap.values()) { + value.then(tunnel => tunnel.dispose()); + } + portMap.clear(); + } + this._tunnels.clear(); + } + + openTunnel(addressProvider: IAddressProvider | undefined, remoteHost: string | undefined, remotePort: number, localPort: number): Promise | undefined { + if (!addressProvider) { + return undefined; + } + + if (!remoteHost || (remoteHost === '127.0.0.1')) { + remoteHost = 'localhost'; + } + + const resolvedTunnel = this.retainOrCreateTunnel(addressProvider, remoteHost, remotePort, localPort); + if (!resolvedTunnel) { + return resolvedTunnel; + } + + return resolvedTunnel.then(tunnel => { + const newTunnel = this.makeTunnel(tunnel); + if (tunnel.tunnelRemoteHost !== remoteHost || tunnel.tunnelRemotePort !== remotePort) { + this.logService.warn('Created tunnel does not match requirements of requested tunnel. Host or port mismatch.'); + } + this._onTunnelOpened.fire(newTunnel); + return newTunnel; + }); + } + + private makeTunnel(tunnel: RemoteTunnel): RemoteTunnel { + return { + tunnelRemotePort: tunnel.tunnelRemotePort, + tunnelRemoteHost: tunnel.tunnelRemoteHost, + tunnelLocalPort: tunnel.tunnelLocalPort, + localAddress: tunnel.localAddress, + dispose: () => { + const existingHost = this._tunnels.get(tunnel.tunnelRemoteHost); + if (existingHost) { + const existing = existingHost.get(tunnel.tunnelRemotePort); + if (existing) { + existing.refcount--; + this.tryDisposeTunnel(tunnel.tunnelRemoteHost, tunnel.tunnelRemotePort, existing); + } + } + } + }; + } + + private async tryDisposeTunnel(remoteHost: string, remotePort: number, tunnel: { refcount: number, readonly value: Promise }): Promise { + if (tunnel.refcount <= 0) { + const disposePromise: Promise = tunnel.value.then(tunnel => { + tunnel.dispose(true); + this._onTunnelClosed.fire({ host: tunnel.tunnelRemoteHost, port: tunnel.tunnelRemotePort }); + }); + if (this._tunnels.has(remoteHost)) { + this._tunnels.get(remoteHost)!.delete(remotePort); + } + return disposePromise; + } + } + + async closeTunnel(remoteHost: string, remotePort: number): Promise { + const portMap = this._tunnels.get(remoteHost); + if (portMap && portMap.has(remotePort)) { + const value = portMap.get(remotePort)!; + value.refcount = 0; + await this.tryDisposeTunnel(remoteHost, remotePort, value); + } + } + + protected addTunnelToMap(remoteHost: string, remotePort: number, tunnel: Promise) { + if (!this._tunnels.has(remoteHost)) { + this._tunnels.set(remoteHost, new Map()); + } + this._tunnels.get(remoteHost)!.set(remotePort, { refcount: 1, value: tunnel }); + } + + protected abstract retainOrCreateTunnel(addressProvider: IAddressProvider, remoteHost: string, remotePort: number, localPort?: number): Promise | undefined; +} + +export class TunnelService extends AbstractTunnelService { + protected retainOrCreateTunnel(_addressProvider: IAddressProvider, remoteHost: string, remotePort: number, localPort?: number | undefined): Promise | undefined { + const portMap = this._tunnels.get(remoteHost); + const existing = portMap ? portMap.get(remotePort) : undefined; + if (existing) { + ++existing.refcount; + return existing.value; + } + + if (this._tunnelProvider) { + const tunnel = this._tunnelProvider.forwardPort({ remoteAddress: { host: remoteHost, port: remotePort } }); + if (tunnel) { + this.addTunnelToMap(remoteHost, remotePort, tunnel); + } + return tunnel; + } + return undefined; + } +} diff --git a/src/vs/workbench/services/remote/node/tunnelService.ts b/src/vs/platform/remote/node/tunnelService.ts similarity index 82% rename from src/vs/workbench/services/remote/node/tunnelService.ts rename to src/vs/platform/remote/node/tunnelService.ts index 6829f0ccbd5..b6b111df65c 100644 --- a/src/vs/workbench/services/remote/node/tunnelService.ts +++ b/src/vs/platform/remote/node/tunnelService.ts @@ -6,18 +6,14 @@ import * as net from 'net'; import { Barrier } from 'vs/base/common/async'; import { Disposable } from 'vs/base/common/lifecycle'; +import { findFreePortFaster } from 'vs/base/node/ports'; import { NodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; -import { connectRemoteAgentTunnel, IConnectionOptions } from 'vs/platform/remote/common/remoteAgentConnection'; -import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; +import { connectRemoteAgentTunnel, IConnectionOptions, IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection'; +import { AbstractTunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; import { nodeSocketFactory } from 'vs/platform/remote/node/nodeSocketFactory'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ILogService } from 'vs/platform/log/common/log'; -import { findFreePortFaster } from 'vs/base/node/ports'; -import { AbstractTunnelService } from 'vs/workbench/services/remote/common/tunnelService'; async function createRemoteTunnel(options: IConnectionOptions, tunnelRemoteHost: string, tunnelRemotePort: number, tunnelLocalPort?: number): Promise { const tunnel = new NodeRemoteTunnel(options, tunnelRemoteHost, tunnelRemotePort, tunnelLocalPort); @@ -128,16 +124,14 @@ class NodeRemoteTunnel extends Disposable implements RemoteTunnel { export class TunnelService extends AbstractTunnelService { public constructor( - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, @ILogService logService: ILogService, - @IRemoteAuthorityResolverService private readonly remoteAuthorityResolverService: IRemoteAuthorityResolverService, @ISignService private readonly signService: ISignService, @IProductService private readonly productService: IProductService ) { - super(environmentService, logService); + super(logService); } - protected retainOrCreateTunnel(remoteAuthority: string, remoteHost: string, remotePort: number, localPort?: number): Promise | undefined { + protected retainOrCreateTunnel(addressProvider: IAddressProvider, remoteHost: string, remotePort: number, localPort?: number): Promise | undefined { const portMap = this._tunnels.get(remoteHost); const existing = portMap ? portMap.get(remotePort) : undefined; if (existing) { @@ -155,12 +149,7 @@ export class TunnelService extends AbstractTunnelService { const options: IConnectionOptions = { commit: this.productService.commit, socketFactory: nodeSocketFactory, - addressProvider: { - getAddress: async () => { - const { authority } = await this.remoteAuthorityResolverService.resolveAuthority(remoteAuthority); - return { host: authority.host, port: authority.port }; - } - }, + addressProvider, signService: this.signService, logService: this.logService }; @@ -171,5 +160,3 @@ export class TunnelService extends AbstractTunnelService { } } } - -registerSingleton(ITunnelService, TunnelService, true); diff --git a/src/vs/platform/storage/browser/storageService.ts b/src/vs/platform/storage/browser/storageService.ts index d3e4a216ea2..59b1baf9120 100644 --- a/src/vs/platform/storage/browser/storageService.ts +++ b/src/vs/platform/storage/browser/storageService.ts @@ -5,7 +5,7 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Emitter } from 'vs/base/common/event'; -import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage, WorkspaceStorageSettings } from 'vs/platform/storage/common/storage'; +import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage } from 'vs/platform/storage/common/storage'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; @@ -20,6 +20,8 @@ export class BrowserStorageService extends Disposable implements IStorageService declare readonly _serviceBrand: undefined; + private static readonly WORKSPACE_IS_NEW_KEY = '__$__isNewStorageMarker'; + private readonly _onDidChangeStorage = this._register(new Emitter()); readonly onDidChangeStorage = this._onDidChangeStorage.event; @@ -63,17 +65,11 @@ export class BrowserStorageService extends Disposable implements IStorageService // Workspace Storage this.workspaceStorageFile = joinPath(stateRoot, `${payload.id}.json`); + this.workspaceStorageDatabase = this._register(new FileStorageDatabase(this.workspaceStorageFile, false /* do not watch for external changes */, this.fileService)); this.workspaceStorage = this._register(new Storage(this.workspaceStorageDatabase)); this._register(this.workspaceStorage.onDidChangeStorage(key => this._onDidChangeStorage.fire({ key, scope: StorageScope.WORKSPACE }))); - const firstOpen = this.workspaceStorage.getBoolean(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN); - if (firstOpen === undefined) { - this.workspaceStorage.set(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, !(await this.fileService.exists(this.workspaceStorageFile))); - } else if (firstOpen) { - this.workspaceStorage.set(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, false); - } - // Global Storage this.globalStorageFile = joinPath(stateRoot, 'global.json'); this.globalStorageDatabase = this._register(new FileStorageDatabase(this.globalStorageFile, true /* watch for external changes */, this.fileService)); @@ -86,6 +82,14 @@ export class BrowserStorageService extends Disposable implements IStorageService this.globalStorage.init() ]); + // Check to see if this is the first time we are "opening" this workspace + const firstOpen = this.workspaceStorage.getBoolean(BrowserStorageService.WORKSPACE_IS_NEW_KEY); + if (firstOpen === undefined) { + this.workspaceStorage.set(BrowserStorageService.WORKSPACE_IS_NEW_KEY, true); + } else if (firstOpen) { + this.workspaceStorage.set(BrowserStorageService.WORKSPACE_IS_NEW_KEY, false); + } + // In the browser we do not have support for long running unload sequences. As such, // we cannot ask for saving state in that moment, because that would result in a // long running operation. @@ -185,6 +189,10 @@ export class BrowserStorageService extends Disposable implements IStorageService this.dispose(); } + isNew(scope: StorageScope.WORKSPACE): boolean { + return this.getBoolean(BrowserStorageService.WORKSPACE_IS_NEW_KEY, scope) === true; + } + dispose(): void { dispose(this.runWhenIdleDisposable); this.runWhenIdleDisposable = undefined; diff --git a/src/vs/platform/storage/common/storage.ts b/src/vs/platform/storage/common/storage.ts index 8780ad7f83e..1623957cb18 100644 --- a/src/vs/platform/storage/common/storage.ts +++ b/src/vs/platform/storage/common/storage.ts @@ -9,10 +9,6 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; -export enum WorkspaceStorageSettings { - WORKSPACE_FIRST_OPEN = 'workbench.workspaceFirstOpen' -} - export const IStorageService = createDecorator('storageService'); export enum WillSaveStateReason { @@ -107,6 +103,14 @@ export interface IStorageService { */ migrate(toWorkspace: IWorkspaceInitializationPayload): Promise; + /** + * Wether the storage for the given scope was created during this session or + * existed before. + * + * Note: currently only implemented for `WORKSPACE` scope. + */ + isNew(scope: StorageScope.WORKSPACE): boolean; + /** * Allows to flush state, e.g. in cases where a shutdown is * imminent. This will send out the onWillSaveState to ask @@ -231,6 +235,10 @@ export class InMemoryStorageService extends Disposable implements IStorageServic flush(): void { this._onWillSaveState.fire({ reason: WillSaveStateReason.NONE }); } + + isNew(): boolean { + return true; // always new when in-memory + } } export async function logStorage(global: Map, workspace: Map, globalPath: string, workspacePath: string): Promise { diff --git a/src/vs/platform/storage/node/storageService.ts b/src/vs/platform/storage/node/storageService.ts index d22e9595486..703b7a841a2 100644 --- a/src/vs/platform/storage/node/storageService.ts +++ b/src/vs/platform/storage/node/storageService.ts @@ -6,7 +6,7 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Emitter } from 'vs/base/common/event'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; -import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage, WorkspaceStorageSettings } from 'vs/platform/storage/common/storage'; +import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage } from 'vs/platform/storage/common/storage'; import { SQLiteStorageDatabase, ISQLiteStorageDatabaseLoggingOptions } from 'vs/base/parts/storage/node/storage'; import { Storage, IStorageDatabase, IStorage, StorageHint } from 'vs/base/parts/storage/common/storage'; import { mark } from 'vs/base/common/performance'; @@ -25,6 +25,8 @@ export class NativeStorageService extends Disposable implements IStorageService private static readonly WORKSPACE_STORAGE_NAME = 'state.vscdb'; private static readonly WORKSPACE_META_NAME = 'workspace.json'; + private static readonly WORKSPACE_IS_NEW_KEY = '__$__isNewStorageMarker'; + private readonly _onDidChangeStorage = this._register(new Emitter()); readonly onDidChangeStorage = this._onDidChangeStorage.event; @@ -105,11 +107,12 @@ export class NativeStorageService extends Disposable implements IStorageService ); await workspaceStorage.init(); - const firstOpen = workspaceStorage.getBoolean(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN); + // Check to see if this is the first time we are "opening" this workspace + const firstOpen = workspaceStorage.getBoolean(NativeStorageService.WORKSPACE_IS_NEW_KEY); if (firstOpen === undefined) { - workspaceStorage.set(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, !result.wasCreated); + workspaceStorage.set(NativeStorageService.WORKSPACE_IS_NEW_KEY, result.wasCreated); } else if (firstOpen) { - workspaceStorage.set(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, false); + workspaceStorage.set(NativeStorageService.WORKSPACE_IS_NEW_KEY, false); } } finally { mark('didInitWorkspaceStorage'); @@ -260,7 +263,7 @@ export class NativeStorageService extends Disposable implements IStorageService async migrate(toWorkspace: IWorkspaceInitializationPayload): Promise { if (this.workspaceStoragePath === SQLiteStorageDatabase.IN_MEMORY_PATH) { - return Promise.resolve(); // no migration needed if running in memory + return; // no migration needed if running in memory } // Close workspace DB to be able to copy @@ -277,4 +280,8 @@ export class NativeStorageService extends Disposable implements IStorageService // Recreate and init workspace storage return this.createWorkspaceStorage(newWorkspaceStoragePath).init(); } + + isNew(scope: StorageScope.WORKSPACE): boolean { + return this.getBoolean(NativeStorageService.WORKSPACE_IS_NEW_KEY, scope) === true; + } } diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index c8af6e457f1..afcc3102022 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -178,7 +178,7 @@ export const errorForeground = registerColor('errorForeground', { dark: '#F48771 export const descriptionForeground = registerColor('descriptionForeground', { light: '#717171', dark: transparent(foreground, 0.7), hc: transparent(foreground, 0.7) }, nls.localize('descriptionForeground', "Foreground color for description text providing additional information, for example for a label.")); export const iconForeground = registerColor('icon.foreground', { dark: '#C5C5C5', light: '#424242', hc: '#FFFFFF' }, nls.localize('iconForeground', "The default color for icons in the workbench.")); -export const focusBorder = registerColor('focusBorder', { dark: Color.fromHex('#0E639C').transparent(0.8), light: Color.fromHex('#007ACC').transparent(0.4), hc: '#F38518' }, nls.localize('focusBorder', "Overall border color for focused elements. This color is only used if not overridden by a component.")); +export const focusBorder = registerColor('focusBorder', { dark: '#007FD4', light: '#0090F1', hc: '#F38518' }, nls.localize('focusBorder', "Overall border color for focused elements. This color is only used if not overridden by a component.")); export const contrastBorder = registerColor('contrastBorder', { light: null, dark: null, hc: '#6FC3DF' }, nls.localize('contrastBorder', "An extra border around elements to separate them from others for greater contrast.")); export const activeContrastBorder = registerColor('contrastActiveBorder', { light: null, dark: null, hc: focusBorder }, nls.localize('activeContrastBorder', "An extra border around active elements to separate them from others for greater contrast.")); @@ -202,8 +202,8 @@ export const inputBackground = registerColor('input.background', { dark: '#3C3C3 export const inputForeground = registerColor('input.foreground', { dark: foreground, light: foreground, hc: foreground }, nls.localize('inputBoxForeground', "Input box foreground.")); export const inputBorder = registerColor('input.border', { dark: null, light: null, hc: contrastBorder }, nls.localize('inputBoxBorder', "Input box border.")); export const inputActiveOptionBorder = registerColor('inputOption.activeBorder', { dark: '#007ACC00', light: '#007ACC00', hc: contrastBorder }, nls.localize('inputBoxActiveOptionBorder', "Border color of activated options in input fields.")); -export const inputActiveOptionBackground = registerColor('inputOption.activeBackground', { dark: transparent(focusBorder, 0.7), light: transparent(focusBorder, 0.5), hc: Color.transparent }, nls.localize('inputOption.activeBackground', "Background color of activated options in input fields.")); -export const inputActiveOptionForeground = registerColor('inputOption.activeForeground', { dark: '#FFFFFF', light: Color.black, hc: null }, nls.localize('inputOption.activeForeground', "Foreground color of activated options in input fields.")); +export const inputActiveOptionBackground = registerColor('inputOption.activeBackground', { dark: transparent(focusBorder, 0.4), light: transparent(focusBorder, 0.2), hc: Color.transparent }, nls.localize('inputOption.activeBackground', "Background color of activated options in input fields.")); +export const inputActiveOptionForeground = registerColor('inputOption.activeForeground', { dark: Color.white, light: Color.black, hc: null }, nls.localize('inputOption.activeForeground', "Foreground color of activated options in input fields.")); export const inputPlaceholderForeground = registerColor('input.placeholderForeground', { light: transparent(foreground, 0.5), dark: transparent(foreground, 0.5), hc: transparent(foreground, 0.7) }, nls.localize('inputPlaceholderForeground', "Input box foreground color for placeholder text.")); export const inputValidationInfoBackground = registerColor('inputValidation.infoBackground', { dark: '#063B49', light: '#D6ECF2', hc: Color.black }, nls.localize('inputValidationInfoBackground', "Input validation background color for information severity.")); @@ -229,6 +229,10 @@ export const buttonForeground = registerColor('button.foreground', { dark: Color export const buttonBackground = registerColor('button.background', { dark: '#0E639C', light: '#007ACC', hc: null }, nls.localize('buttonBackground', "Button background color.")); export const buttonHoverBackground = registerColor('button.hoverBackground', { dark: lighten(buttonBackground, 0.2), light: darken(buttonBackground, 0.2), hc: null }, nls.localize('buttonHoverBackground', "Button background color when hovering.")); +export const buttonSecondaryForeground = registerColor('button.secondaryForeground', { dark: Color.white, light: Color.white, hc: Color.white }, nls.localize('buttonSecondaryForeground', "Secondary button foreground color.")); +export const buttonSecondaryBackground = registerColor('button.secondaryBackground', { dark: '#3A3D41', light: '#5F6A79', hc: null }, nls.localize('buttonSecondaryBackground', "Secondary button background color.")); +export const buttonSecondaryHoverBackground = registerColor('button.secondaryHoverBackground', { dark: lighten(buttonSecondaryBackground, 0.2), light: darken(buttonSecondaryBackground, 0.2), hc: null }, nls.localize('buttonSecondaryHoverBackground', "Secondary button background color when hovering.")); + export const badgeBackground = registerColor('badge.background', { dark: '#4D4D4D', light: '#C4C4C4', hc: Color.black }, nls.localize('badgeBackground', "Badge background color. Badges are small information labels, e.g. for search results count.")); export const badgeForeground = registerColor('badge.foreground', { dark: Color.white, light: '#333', hc: Color.white }, nls.localize('badgeForeground', "Badge foreground color. Badges are small information labels, e.g. for search results count.")); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index 414eccc95c9..c8317017afe 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { focusBorder, inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectListBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listInactiveFocusBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, badgeBackground, badgeForeground, progressBarBackground, breadcrumbsForeground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, editorWidgetBorder, inputValidationInfoForeground, inputValidationWarningForeground, inputValidationErrorForeground, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuBorder, menuSeparatorBackground, darken, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetBackground, editorWidgetBackground, treeIndentGuidesStroke, editorWidgetForeground, simpleCheckboxBackground, simpleCheckboxBorder, simpleCheckboxForeground, ColorValue, resolveColorValue, textLinkForeground, problemsWarningIconForeground, problemsErrorIconForeground, problemsInfoIconForeground } from 'vs/platform/theme/common/colorRegistry'; +import { focusBorder, inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectListBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listInactiveFocusBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, badgeBackground, badgeForeground, progressBarBackground, breadcrumbsForeground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, editorWidgetBorder, inputValidationInfoForeground, inputValidationWarningForeground, inputValidationErrorForeground, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuBorder, menuSeparatorBackground, darken, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetBackground, editorWidgetBackground, treeIndentGuidesStroke, editorWidgetForeground, simpleCheckboxBackground, simpleCheckboxBorder, simpleCheckboxForeground, ColorValue, resolveColorValue, textLinkForeground, problemsWarningIconForeground, problemsErrorIconForeground, problemsInfoIconForeground, buttonSecondaryBackground, buttonSecondaryForeground, buttonSecondaryHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; import { IThemable, styleFn } from 'vs/base/common/styler'; @@ -262,6 +262,9 @@ export interface IButtonStyleOverrides extends IStyleOverrides { buttonForeground?: ColorIdentifier; buttonBackground?: ColorIdentifier; buttonHoverBackground?: ColorIdentifier; + buttonSecondaryForeground?: ColorIdentifier; + buttonSecondaryBackground?: ColorIdentifier; + buttonSecondaryHoverBackground?: ColorIdentifier; } export function attachButtonStyler(widget: IThemable, themeService: IThemeService, style?: IButtonStyleOverrides): IDisposable { @@ -269,6 +272,9 @@ export function attachButtonStyler(widget: IThemable, themeService: IThemeServic buttonForeground: (style && style.buttonForeground) || buttonForeground, buttonBackground: (style && style.buttonBackground) || buttonBackground, buttonHoverBackground: (style && style.buttonHoverBackground) || buttonHoverBackground, + buttonSecondaryForeground: (style && style.buttonSecondaryForeground) || buttonSecondaryForeground, + buttonSecondaryBackground: (style && style.buttonSecondaryBackground) || buttonSecondaryBackground, + buttonSecondaryHoverBackground: (style && style.buttonSecondaryHoverBackground) || buttonSecondaryHoverBackground, buttonBorder: contrastBorder } as IButtonStyleOverrides, widget); } diff --git a/src/vs/platform/undoRedo/common/undoRedo.ts b/src/vs/platform/undoRedo/common/undoRedo.ts index 7b60b057be3..ae05184da63 100644 --- a/src/vs/platform/undoRedo/common/undoRedo.ts +++ b/src/vs/platform/undoRedo/common/undoRedo.ts @@ -28,7 +28,11 @@ export interface IWorkspaceUndoRedoElement { readonly label: string; undo(): Promise | void; redo(): Promise | void; - split(): IResourceUndoRedoElement[]; + + /** + * If implemented, indicates that this undo/redo element can be split into multiple per resource elements. + */ + split?(): IResourceUndoRedoElement[]; /** * If implemented, will be invoked before calling `undo()` or `redo()`. @@ -46,17 +50,29 @@ export interface IPastFutureElements { } export interface UriComparisonKeyComputer { - /** - * Return `null` if you don't own this URI. - */ - getComparisonKey(uri: URI): string | null; + getComparisonKey(uri: URI): string; +} + +export class ResourceEditStackSnapshot { + constructor( + public readonly resource: URI, + public readonly elements: number[] + ) { } } export interface IUndoRedoService { readonly _serviceBrand: undefined; - registerUriComparisonKeyComputer(uriComparisonKeyComputer: UriComparisonKeyComputer): IDisposable; + /** + * Register an URI -> string hasher. + * This is useful for making multiple URIs share the same undo-redo stack. + */ + registerUriComparisonKeyComputer(scheme: string, uriComparisonKeyComputer: UriComparisonKeyComputer): IDisposable; + /** + * Get the hash used internally for a certain URI. + * This uses any registered `UriComparisonKeyComputer`. + */ getUriComparisonKey(resource: URI): string; /** @@ -66,14 +82,20 @@ export interface IUndoRedoService { pushElement(element: IUndoRedoElement): void; /** - * Get the last pushed element. If the last pushed element has been undone, returns null. + * Get the last pushed element for a resource. + * If the last pushed element has been undone, returns null. */ getLastElement(resource: URI): IUndoRedoElement | null; + /** + * Get all the elements associated with a resource. + * This includes the past and the future. + */ getElements(resource: URI): IPastFutureElements; - hasElements(resource: URI): boolean; - + /** + * Validate or invalidate stack elements associated with a resource. + */ setElementsValidFlag(resource: URI, isValid: boolean, filter: (element: IUndoRedoElement) => boolean): void; /** @@ -81,6 +103,15 @@ export interface IUndoRedoService { */ removeElements(resource: URI): void; + /** + * Create a snapshot of the current elements on the undo-redo stack for a resource. + */ + createSnapshot(resource: URI): ResourceEditStackSnapshot; + /** + * Attempt (as best as possible) to restore a certain snapshot previously created with `createSnapshot` for a resource. + */ + restoreSnapshot(snapshot: ResourceEditStackSnapshot): void; + canUndo(resource: URI): boolean; undo(resource: URI): Promise | void; diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index 99ef33bf606..99b06d9ed73 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { IUndoRedoService, IWorkspaceUndoRedoElement, UndoRedoElementType, IUndoRedoElement, IPastFutureElements, UriComparisonKeyComputer } from 'vs/platform/undoRedo/common/undoRedo'; +import { IUndoRedoService, IWorkspaceUndoRedoElement, UndoRedoElementType, IUndoRedoElement, IPastFutureElements, ResourceEditStackSnapshot, UriComparisonKeyComputer, IResourceUndoRedoElement } from 'vs/platform/undoRedo/common/undoRedo'; import { URI } from 'vs/base/common/uri'; import { onUnexpectedError } from 'vs/base/common/errors'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -20,7 +20,10 @@ function getResourceLabel(resource: URI): string { return resource.scheme === Schemas.file ? resource.fsPath : resource.path; } +let stackElementCounter = 0; + class ResourceStackElement { + public readonly id = (++stackElementCounter); public readonly type = UndoRedoElementType.Resource; public readonly actual: IUndoRedoElement; public readonly label: string; @@ -46,7 +49,7 @@ class ResourceStackElement { } public toString(): string { - return `[VALID] ${this.actual}`; + return `[${this.id}] [${this.isValid ? 'VALID' : 'INVALID'}] ${this.actual}`; } } @@ -105,6 +108,7 @@ class RemovedResources { } class WorkspaceStackElement { + public readonly id = (++stackElementCounter); public readonly type = UndoRedoElementType.Workspace; public readonly actual: IWorkspaceUndoRedoElement; public readonly label: string; @@ -123,6 +127,10 @@ class WorkspaceStackElement { this.invalidatedResources = null; } + public canSplit(): this is WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[]; } } { + return (typeof this.actual.split === 'function'); + } + public removeResource(resourceLabel: string, strResource: string, reason: RemovedResourceReason): void { if (!this.removedResources) { this.removedResources = new RemovedResources(); @@ -151,7 +159,7 @@ class WorkspaceStackElement { } public toString(): string { - return `[VALID] ${this.actual}`; + return `[${this.id}] [${this.invalidatedResources ? 'INVALID' : 'VALID'}] ${this.actual}`; } } @@ -263,6 +271,54 @@ class ResourceEditStack { this.versionId++; } + public createSnapshot(resource: URI): ResourceEditStackSnapshot { + const elements: number[] = []; + + for (let i = 0, len = this._past.length; i < len; i++) { + elements.push(this._past[i].id); + } + for (let i = this._future.length - 1; i >= 0; i--) { + elements.push(this._future[i].id); + } + + return new ResourceEditStackSnapshot(resource, elements); + } + + public restoreSnapshot(snapshot: ResourceEditStackSnapshot): void { + const snapshotLength = snapshot.elements.length; + let isOK = true; + let snapshotIndex = 0; + let removePastAfter = -1; + for (let i = 0, len = this._past.length; i < len; i++, snapshotIndex++) { + const element = this._past[i]; + if (isOK && (snapshotIndex >= snapshotLength || element.id !== snapshot.elements[snapshotIndex])) { + isOK = false; + removePastAfter = 0; + } + if (!isOK && element.type === UndoRedoElementType.Workspace) { + element.removeResource(this.resourceLabel, this.strResource, RemovedResourceReason.ExternalRemoval); + } + } + let removeFutureBefore = -1; + for (let i = this._future.length - 1; i >= 0; i--, snapshotIndex++) { + const element = this._future[i]; + if (isOK && (snapshotIndex >= snapshotLength || element.id !== snapshot.elements[snapshotIndex])) { + isOK = false; + removeFutureBefore = i; + } + if (!isOK && element.type === UndoRedoElementType.Workspace) { + element.removeResource(this.resourceLabel, this.strResource, RemovedResourceReason.ExternalRemoval); + } + } + if (removePastAfter !== -1) { + this._past = this._past.slice(0, removePastAfter); + } + if (removeFutureBefore !== -1) { + this._future = this._future.slice(removeFutureBefore + 1); + } + this.versionId++; + } + public getElements(): IPastFutureElements { const past: IUndoRedoElement[] = []; const future: IUndoRedoElement[] = []; @@ -367,11 +423,14 @@ class EditStackSnapshot { } } +const missingEditStack = new ResourceEditStack('', ''); +missingEditStack.locked = true; + export class UndoRedoService implements IUndoRedoService { declare readonly _serviceBrand: undefined; private readonly _editStacks: Map; - private readonly _uriComparisonKeyComputers: UriComparisonKeyComputer[]; + private readonly _uriComparisonKeyComputers: [string, UriComparisonKeyComputer][]; constructor( @IDialogService private readonly _dialogService: IDialogService, @@ -381,12 +440,12 @@ export class UndoRedoService implements IUndoRedoService { this._uriComparisonKeyComputers = []; } - public registerUriComparisonKeyComputer(uriComparisonKeyComputer: UriComparisonKeyComputer): IDisposable { - this._uriComparisonKeyComputers.push(uriComparisonKeyComputer); + public registerUriComparisonKeyComputer(scheme: string, uriComparisonKeyComputer: UriComparisonKeyComputer): IDisposable { + this._uriComparisonKeyComputers.push([scheme, uriComparisonKeyComputer]); return { dispose: () => { for (let i = 0, len = this._uriComparisonKeyComputers.length; i < len; i++) { - if (this._uriComparisonKeyComputers[i] === uriComparisonKeyComputer) { + if (this._uriComparisonKeyComputers[i][1] === uriComparisonKeyComputer) { this._uriComparisonKeyComputers.splice(i, 1); return; } @@ -397,9 +456,8 @@ export class UndoRedoService implements IUndoRedoService { public getUriComparisonKey(resource: URI): string { for (const uriComparisonKeyComputer of this._uriComparisonKeyComputers) { - const result = uriComparisonKeyComputer.getComparisonKey(resource); - if (result !== null) { - return result; + if (uriComparisonKeyComputer[0] === resource.scheme) { + return uriComparisonKeyComputer[1].getComparisonKey(resource); } } return resource.toString(); @@ -477,7 +535,7 @@ export class UndoRedoService implements IUndoRedoService { return null; } - private _splitPastWorkspaceElement(toRemove: WorkspaceStackElement, ignoreResources: RemovedResources | null): void { + private _splitPastWorkspaceElement(toRemove: WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[]; } }, ignoreResources: RemovedResources | null): void { const individualArr = toRemove.actual.split(); const individualMap = new Map(); for (const _element of individualArr) { @@ -496,7 +554,7 @@ export class UndoRedoService implements IUndoRedoService { } } - private _splitFutureWorkspaceElement(toRemove: WorkspaceStackElement, ignoreResources: RemovedResources | null): void { + private _splitFutureWorkspaceElement(toRemove: WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[]; } }, ignoreResources: RemovedResources | null): void { const individualArr = toRemove.actual.split(); const individualMap = new Map(); for (const _element of individualArr) { @@ -547,6 +605,32 @@ export class UndoRedoService implements IUndoRedoService { return false; } + public createSnapshot(resource: URI): ResourceEditStackSnapshot { + const strResource = this.getUriComparisonKey(resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource)!; + return editStack.createSnapshot(resource); + } + return new ResourceEditStackSnapshot(resource, []); + } + + public restoreSnapshot(snapshot: ResourceEditStackSnapshot): void { + const strResource = this.getUriComparisonKey(snapshot.resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource)!; + editStack.restoreSnapshot(snapshot); + + if (!editStack.hasPastElements() && !editStack.hasFutureElements()) { + // the edit stack is now empty, just remove it entirely + editStack.dispose(); + this._editStacks.delete(strResource); + } + } + if (DEBUG) { + this._print('restoreSnapshot'); + } + } + public getElements(resource: URI): IPastFutureElements { const strResource = this.getUriComparisonKey(resource); if (this._editStacks.has(strResource)) { @@ -665,23 +749,32 @@ export class UndoRedoService implements IUndoRedoService { private _getAffectedEditStacks(element: WorkspaceStackElement): EditStackSnapshot { const affectedEditStacks: ResourceEditStack[] = []; for (const strResource of element.strResources) { - affectedEditStacks.push(this._editStacks.get(strResource)!); + affectedEditStacks.push(this._editStacks.get(strResource) || missingEditStack); } return new EditStackSnapshot(affectedEditStacks); } + private _tryToSplitAndUndo(strResource: string, element: WorkspaceStackElement, ignoreResources: RemovedResources | null, message: string): WorkspaceVerificationError { + if (element.canSplit()) { + this._splitPastWorkspaceElement(element, ignoreResources); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.undo(strResource)); + } else { + // Cannot safely split this workspace element => flush all undo/redo stacks + for (const strResource of element.strResources) { + this.removeElements(strResource); + } + this._notificationService.info(message); + return new WorkspaceVerificationError(); + } + } + private _checkWorkspaceUndo(strResource: string, element: WorkspaceStackElement, editStackSnapshot: EditStackSnapshot, checkInvalidatedResources: boolean): WorkspaceVerificationError | null { if (element.removedResources) { - this._splitPastWorkspaceElement(element, element.removedResources); - const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.undo(strResource)); + return this._tryToSplitAndUndo(strResource, element, element.removedResources, nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.removedResources.createMessage())); } if (checkInvalidatedResources && element.invalidatedResources) { - this._splitPastWorkspaceElement(element, element.invalidatedResources); - const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.undo(strResource)); + return this._tryToSplitAndUndo(strResource, element, element.invalidatedResources, nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage())); } // this must be the last past element in all the impacted resources! @@ -692,10 +785,7 @@ export class UndoRedoService implements IUndoRedoService { } } if (cannotUndoDueToResources.length > 0) { - this._splitPastWorkspaceElement(element, null); - const message = nls.localize('cannotWorkspaceUndoDueToChanges', "Could not undo '{0}' across all files because changes were made to {1}", element.label, cannotUndoDueToResources.join(', ')); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.undo(strResource)); + return this._tryToSplitAndUndo(strResource, element, null, nls.localize('cannotWorkspaceUndoDueToChanges', "Could not undo '{0}' across all files because changes were made to {1}", element.label, cannotUndoDueToResources.join(', '))); } const cannotLockDueToResources: string[] = []; @@ -705,18 +795,12 @@ export class UndoRedoService implements IUndoRedoService { } } if (cannotLockDueToResources.length > 0) { - this._splitPastWorkspaceElement(element, null); - const message = nls.localize('cannotWorkspaceUndoDueToInProgressUndoRedo', "Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}", element.label, cannotLockDueToResources.join(', ')); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.undo(strResource)); + return this._tryToSplitAndUndo(strResource, element, null, nls.localize('cannotWorkspaceUndoDueToInProgressUndoRedo', "Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}", element.label, cannotLockDueToResources.join(', '))); } // check if new stack elements were added in the meantime... if (!editStackSnapshot.isValid()) { - this._splitPastWorkspaceElement(element, null); - const message = nls.localize('cannotWorkspaceUndoDueToInMeantimeUndoRedo', "Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime", element.label); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.undo(strResource)); + return this._tryToSplitAndUndo(strResource, element, null, nls.localize('cannotWorkspaceUndoDueToInMeantimeUndoRedo', "Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime", element.label)); } return null; @@ -733,36 +817,40 @@ export class UndoRedoService implements IUndoRedoService { private async _confirmAndExecuteWorkspaceUndo(strResource: string, element: WorkspaceStackElement, editStackSnapshot: EditStackSnapshot): Promise { - const result = await this._dialogService.show( - Severity.Info, - nls.localize('confirmWorkspace', "Would you like to undo '{0}' across all files?", element.label), - [ - nls.localize({ key: 'ok', comment: ['{0} denotes a number that is > 1'] }, "Undo in {0} Files", editStackSnapshot.editStacks.length), - nls.localize('nok', "Undo this File"), - nls.localize('cancel', "Cancel"), - ], - { - cancelId: 2 + if (element.canSplit()) { + // this element can be split + + const result = await this._dialogService.show( + Severity.Info, + nls.localize('confirmWorkspace', "Would you like to undo '{0}' across all files?", element.label), + [ + nls.localize({ key: 'ok', comment: ['{0} denotes a number that is > 1'] }, "Undo in {0} Files", editStackSnapshot.editStacks.length), + nls.localize('nok', "Undo this File"), + nls.localize('cancel', "Cancel"), + ], + { + cancelId: 2 + } + ); + + if (result.choice === 2) { + // choice: cancel + return; } - ); - if (result.choice === 2) { - // choice: cancel - return; - } + if (result.choice === 1) { + // choice: undo this file + this._splitPastWorkspaceElement(element, null); + return this.undo(strResource); + } - if (result.choice === 1) { - // choice: undo this file - this._splitPastWorkspaceElement(element, null); - return this.undo(strResource); - } + // choice: undo in all files - // choice: undo in all files - - // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await) - const verificationError1 = this._checkWorkspaceUndo(strResource, element, editStackSnapshot, /*invalidated resources will be checked after the prepare call*/false); - if (verificationError1) { - return verificationError1.returnValue; + // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await) + const verificationError1 = this._checkWorkspaceUndo(strResource, element, editStackSnapshot, /*invalidated resources will be checked after the prepare call*/false); + if (verificationError1) { + return verificationError1.returnValue; + } } // prepare @@ -837,18 +925,27 @@ export class UndoRedoService implements IUndoRedoService { return false; } + private _tryToSplitAndRedo(strResource: string, element: WorkspaceStackElement, ignoreResources: RemovedResources | null, message: string): WorkspaceVerificationError { + if (element.canSplit()) { + this._splitFutureWorkspaceElement(element, ignoreResources); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.redo(strResource)); + } else { + // Cannot safely split this workspace element => flush all undo/redo stacks + for (const strResource of element.strResources) { + this.removeElements(strResource); + } + this._notificationService.info(message); + return new WorkspaceVerificationError(); + } + } + private _checkWorkspaceRedo(strResource: string, element: WorkspaceStackElement, editStackSnapshot: EditStackSnapshot, checkInvalidatedResources: boolean): WorkspaceVerificationError | null { if (element.removedResources) { - this._splitFutureWorkspaceElement(element, element.removedResources); - const message = nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.redo(strResource)); + return this._tryToSplitAndRedo(strResource, element, element.removedResources, nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.removedResources.createMessage())); } if (checkInvalidatedResources && element.invalidatedResources) { - this._splitFutureWorkspaceElement(element, element.invalidatedResources); - const message = nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.redo(strResource)); + return this._tryToSplitAndRedo(strResource, element, element.invalidatedResources, nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage())); } // this must be the last future element in all the impacted resources! @@ -859,10 +956,7 @@ export class UndoRedoService implements IUndoRedoService { } } if (cannotRedoDueToResources.length > 0) { - this._splitFutureWorkspaceElement(element, null); - const message = nls.localize('cannotWorkspaceRedoDueToChanges', "Could not redo '{0}' across all files because changes were made to {1}", element.label, cannotRedoDueToResources.join(', ')); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.redo(strResource)); + return this._tryToSplitAndRedo(strResource, element, null, nls.localize('cannotWorkspaceRedoDueToChanges', "Could not redo '{0}' across all files because changes were made to {1}", element.label, cannotRedoDueToResources.join(', '))); } const cannotLockDueToResources: string[] = []; @@ -872,18 +966,12 @@ export class UndoRedoService implements IUndoRedoService { } } if (cannotLockDueToResources.length > 0) { - this._splitFutureWorkspaceElement(element, null); - const message = nls.localize('cannotWorkspaceRedoDueToInProgressUndoRedo', "Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}", element.label, cannotLockDueToResources.join(', ')); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.redo(strResource)); + return this._tryToSplitAndRedo(strResource, element, null, nls.localize('cannotWorkspaceRedoDueToInProgressUndoRedo', "Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}", element.label, cannotLockDueToResources.join(', '))); } // check if new stack elements were added in the meantime... if (!editStackSnapshot.isValid()) { - this._splitPastWorkspaceElement(element, null); - const message = nls.localize('cannotWorkspaceRedoDueToInMeantimeUndoRedo', "Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime", element.label); - this._notificationService.info(message); - return new WorkspaceVerificationError(this.redo(strResource)); + return this._tryToSplitAndRedo(strResource, element, null, nls.localize('cannotWorkspaceRedoDueToInMeantimeUndoRedo', "Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime", element.label)); } return null; diff --git a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts index 68d508d54a7..fa19ec45df4 100644 --- a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts +++ b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts @@ -7,10 +7,13 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IFileService, IFileContent, FileChangesEvent, FileOperationResult, FileOperationError } from 'vs/platform/files/common/files'; import { VSBuffer } from 'vs/base/common/buffer'; import { URI } from 'vs/base/common/uri'; -import { SyncResource, SyncStatus, IUserData, IUserDataSyncStoreService, UserDataSyncErrorCode, UserDataSyncError, IUserDataSyncLogService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, Conflict, ISyncResourceHandle, USER_DATA_SYNC_SCHEME, ISyncPreviewResult, IUserDataManifest } from 'vs/platform/userDataSync/common/userDataSync'; +import { + SyncResource, SyncStatus, IUserData, IUserDataSyncStoreService, UserDataSyncErrorCode, UserDataSyncError, IUserDataSyncLogService, IUserDataSyncUtilService, + IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, Conflict, ISyncResourceHandle, USER_DATA_SYNC_SCHEME, ISyncResourcePreview as IBaseSyncResourcePreview, IUserDataManifest, ISyncData, IRemoteUserData, PREVIEW_DIR_NAME +} from 'vs/platform/userDataSync/common/userDataSync'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { joinPath, dirname, isEqual, basename } from 'vs/base/common/resources'; -import { CancelablePromise, RunOnceScheduler } from 'vs/base/common/async'; +import { CancelablePromise, RunOnceScheduler, createCancelablePromise } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ParseError, parse } from 'vs/base/common/json'; @@ -23,22 +26,13 @@ import { uppercaseFirstLetter } from 'vs/base/common/strings'; import { equals } from 'vs/base/common/arrays'; import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IHeaders } from 'vs/base/parts/request/common/request'; type SyncSourceClassification = { source?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; }; -export interface IRemoteUserData { - ref: string; - syncData: ISyncData | null; -} - -export interface ISyncData { - version: number; - machineId?: string; - content: string; -} - function isSyncData(thing: any): thing is ISyncData { if (thing && (thing.version !== undefined && typeof thing.version === 'number') @@ -58,10 +52,17 @@ function isSyncData(thing: any): thing is ISyncData { return false; } +export interface ISyncResourcePreview extends IBaseSyncResourcePreview { + readonly remoteUserData: IRemoteUserData; + readonly lastSyncUserData: IRemoteUserData | null; +} export abstract class AbstractSynchroniser extends Disposable { + private syncPreviewPromise: CancelablePromise | null = null; + protected readonly syncFolder: URI; + protected readonly syncPreviewFolder: URI; private readonly currentMachineIdPromise: Promise; private _status: SyncStatus = SyncStatus.Idle; @@ -81,6 +82,8 @@ export abstract class AbstractSynchroniser extends Disposable { protected readonly lastSyncResource: URI; protected readonly syncResourceLogLabel: string; + private syncHeaders: IHeaders = {}; + constructor( readonly resource: SyncResource, @IFileService protected readonly fileService: IFileService, @@ -88,7 +91,7 @@ export abstract class AbstractSynchroniser extends Disposable { @IStorageService storageService: IStorageService, @IUserDataSyncStoreService protected readonly userDataSyncStoreService: IUserDataSyncStoreService, @IUserDataSyncBackupStoreService protected readonly userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, - @IUserDataSyncEnablementService protected readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService protected readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService protected readonly telemetryService: ITelemetryService, @IUserDataSyncLogService protected readonly logService: IUserDataSyncLogService, @IConfigurationService protected readonly configurationService: IConfigurationService, @@ -96,10 +99,13 @@ export abstract class AbstractSynchroniser extends Disposable { super(); this.syncResourceLogLabel = uppercaseFirstLetter(this.resource); this.syncFolder = joinPath(environmentService.userDataSyncHome, resource); + this.syncPreviewFolder = joinPath(this.syncFolder, PREVIEW_DIR_NAME); this.lastSyncResource = joinPath(this.syncFolder, `lastSync${this.resource}.json`); this.currentMachineIdPromise = getServiceMachineId(environmentService, fileService, storageService); } + protected isEnabled(): boolean { return this.userDataSyncResourceEnablementService.isResourceEnabled(this.resource); } + protected async triggerLocalChange(): Promise { if (this.isEnabled()) { this.localChangeTriggerScheduler.schedule(); @@ -107,11 +113,24 @@ export abstract class AbstractSynchroniser extends Disposable { } protected async doTriggerLocalChange(): Promise { - this.logService.trace(`${this.syncResourceLogLabel}: Checking for local changes...`); - const lastSyncUserData = await this.getLastSyncUserData(); - const hasRemoteChanged = lastSyncUserData ? (await this.generatePreview(lastSyncUserData, lastSyncUserData)).hasRemoteChanged : true; - if (hasRemoteChanged) { - this._onDidChangeLocal.fire(); + + // Sync again if current status is in conflicts + if (this.status === SyncStatus.HasConflicts) { + this.logService.info(`${this.syncResourceLogLabel}: In conflicts state and local change detected. Syncing again...`); + const preview = await this.syncPreviewPromise!; + this.syncPreviewPromise = null; + const status = await this.performSync(preview.remoteUserData, preview.lastSyncUserData); + this.setStatus(status); + } + + // Check if local change causes remote change + else { + this.logService.trace(`${this.syncResourceLogLabel}: Checking for local changes...`); + const lastSyncUserData = await this.getLastSyncUserData(); + const hasRemoteChanged = lastSyncUserData ? (await this.generatePreview(lastSyncUserData, lastSyncUserData, CancellationToken.None)).hasRemoteChanged : true; + if (hasRemoteChanged) { + this._onDidChangeLocal.fire(); + } } } @@ -141,41 +160,91 @@ export abstract class AbstractSynchroniser extends Disposable { } } - protected isEnabled(): boolean { return this.userDataSyncEnablementService.isResourceEnabled(this.resource); } - - async sync(manifest: IUserDataManifest | null): Promise { + async pull(): Promise { if (!this.isEnabled()) { - if (this.status !== SyncStatus.Idle) { - await this.stop(); - } - this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as it is disabled.`); - return; - } - if (this.status === SyncStatus.HasConflicts) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as there are conflicts.`); - return; - } - if (this.status === SyncStatus.Syncing) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as it is running already.`); + this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling ${this.syncResourceLogLabel.toLowerCase()} as it is disabled.`); return; } - this.logService.trace(`${this.syncResourceLogLabel}: Started synchronizing ${this.resource.toLowerCase()}...`); - this.setStatus(SyncStatus.Syncing); + await this.stop(); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getLatestRemoteUserData(manifest, lastSyncUserData); - - let status: SyncStatus = SyncStatus.Idle; try { - status = await this.doSync(remoteUserData, lastSyncUserData); - if (status === SyncStatus.HasConflicts) { - this.logService.info(`${this.syncResourceLogLabel}: Detected conflicts while synchronizing ${this.resource.toLowerCase()}.`); - } else if (status === SyncStatus.Idle) { - this.logService.trace(`${this.syncResourceLogLabel}: Finished synchronizing ${this.resource.toLowerCase()}.`); + this.logService.info(`${this.syncResourceLogLabel}: Started pulling ${this.syncResourceLogLabel.toLowerCase()}...`); + this.setStatus(SyncStatus.Syncing); + + const lastSyncUserData = await this.getLastSyncUserData(); + const remoteUserData = await this.getRemoteUserData(lastSyncUserData); + const preview = await this.generatePullPreview(remoteUserData, lastSyncUserData, CancellationToken.None); + + await this.applyPreview(preview, false); + this.logService.info(`${this.syncResourceLogLabel}: Finished pulling ${this.syncResourceLogLabel.toLowerCase()}.`); + } finally { + this.setStatus(SyncStatus.Idle); + } + } + + async push(): Promise { + if (!this.isEnabled()) { + this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing ${this.syncResourceLogLabel.toLowerCase()} as it is disabled.`); + return; + } + + this.stop(); + + try { + this.logService.info(`${this.syncResourceLogLabel}: Started pushing ${this.syncResourceLogLabel.toLowerCase()}...`); + this.setStatus(SyncStatus.Syncing); + + const lastSyncUserData = await this.getLastSyncUserData(); + const remoteUserData = await this.getRemoteUserData(lastSyncUserData); + const preview = await this.generatePushPreview(remoteUserData, lastSyncUserData, CancellationToken.None); + + await this.applyPreview(preview, true); + this.logService.info(`${this.syncResourceLogLabel}: Finished pushing ${this.syncResourceLogLabel.toLowerCase()}.`); + + } finally { + this.setStatus(SyncStatus.Idle); + } + } + + async sync(manifest: IUserDataManifest | null, headers: IHeaders = {}): Promise { + try { + this.syncHeaders = { ...headers }; + if (!this.isEnabled()) { + if (this.status !== SyncStatus.Idle) { + await this.stop(); + } + this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as it is disabled.`); + return; + } + if (this.status === SyncStatus.HasConflicts) { + this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as there are conflicts.`); + return; + } + if (this.status === SyncStatus.Syncing) { + this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as it is running already.`); + return; + } + + this.logService.trace(`${this.syncResourceLogLabel}: Started synchronizing ${this.resource.toLowerCase()}...`); + this.setStatus(SyncStatus.Syncing); + + const lastSyncUserData = await this.getLastSyncUserData(); + const remoteUserData = await this.getLatestRemoteUserData(manifest, lastSyncUserData); + + let status: SyncStatus = SyncStatus.Idle; + try { + status = await this.performSync(remoteUserData, lastSyncUserData); + if (status === SyncStatus.HasConflicts) { + this.logService.info(`${this.syncResourceLogLabel}: Detected conflicts while synchronizing ${this.resource.toLowerCase()}.`); + } else if (status === SyncStatus.Idle) { + this.logService.trace(`${this.syncResourceLogLabel}: Finished synchronizing ${this.resource.toLowerCase()}.`); + } + } finally { + this.setStatus(status); } } finally { - this.setStatus(status); + this.syncHeaders = {}; } } @@ -197,7 +266,8 @@ export abstract class AbstractSynchroniser extends Disposable { this.setStatus(SyncStatus.Syncing); const lastSyncUserData = await this.getLastSyncUserData(); const remoteUserData = await this.getLatestRemoteUserData(null, lastSyncUserData); - await this.performReplace(syncData, remoteUserData, lastSyncUserData); + const preview = await this.generateReplacePreview(syncData, remoteUserData, lastSyncUserData); + await this.applyPreview(preview, false); this.logService.info(`${this.syncResourceLogLabel}: Finished resetting ${this.resource.toLowerCase()}.`); } finally { this.setStatus(SyncStatus.Idle); @@ -224,28 +294,33 @@ export abstract class AbstractSynchroniser extends Disposable { return this.getRemoteUserData(lastSyncUserData); } - async getSyncPreview(): Promise { - if (!this.isEnabled()) { - return { hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false }; + async generateSyncPreview(): Promise { + if (this.isEnabled()) { + const lastSyncUserData = await this.getLastSyncUserData(); + const remoteUserData = await this.getRemoteUserData(lastSyncUserData); + return this.generatePreview(remoteUserData, lastSyncUserData, CancellationToken.None); } - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - return this.generatePreview(remoteUserData, lastSyncUserData); + return null; } - protected async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + private async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { if (remoteUserData.syncData && remoteUserData.syncData.version > this.version) { // current version is not compatible with cloud version this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/incompatible', { source: this.resource }); throw new UserDataSyncError(localize({ key: 'incompatible', comment: ['This is an error while syncing a resource that its local version is not compatible with its remote version.'] }, "Cannot sync {0} as its local version {1} is not compatible with its remote version {2}", this.resource, this.version, remoteUserData.syncData.version), UserDataSyncErrorCode.Incompatible, this.resource); } + try { - const status = await this.performSync(remoteUserData, lastSyncUserData); - return status; + return await this.doSync(remoteUserData, lastSyncUserData); } catch (e) { if (e instanceof UserDataSyncError) { switch (e.code) { + + case UserDataSyncErrorCode.LocalPreconditionFailed: + // Rejected as there is a new local version. Syncing again... + this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize ${this.syncResourceLogLabel} as there is a new local version available. Synchronizing again...`); + return this.performSync(remoteUserData, lastSyncUserData); + case UserDataSyncErrorCode.PreconditionFailed: // Rejected as there is a new remote version. Syncing again... this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize as there is a new remote version available. Synchronizing again...`); @@ -257,13 +332,69 @@ export abstract class AbstractSynchroniser extends Disposable { // and one of them successfully updated remote and last sync state. lastSyncUserData = await this.getLastSyncUserData(); - return this.doSync(remoteUserData, lastSyncUserData); + return this.performSync(remoteUserData, lastSyncUserData); } } throw e; } } + protected async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + try { + // generate or use existing preview + if (!this.syncPreviewPromise) { + this.syncPreviewPromise = createCancelablePromise(token => this.generatePreview(remoteUserData, lastSyncUserData, token)); + } + const preview = await this.syncPreviewPromise; + + if (preview.hasConflicts) { + return SyncStatus.HasConflicts; + } + + // apply preview + await this.applyPreview(preview, false); + + // reset preview + this.syncPreviewPromise = null; + + return SyncStatus.Idle; + } catch (error) { + + // reset preview on error + this.syncPreviewPromise = null; + + throw error; + } + } + + protected async getSyncPreviewInProgress(): Promise { + return this.syncPreviewPromise ? this.syncPreviewPromise : null; + } + + async acceptConflict(conflictUri: URI, conflictContent: string): Promise { + let preview = await this.getSyncPreviewInProgress(); + + if (!preview || !preview.hasConflicts) { + return; + } + + + this.syncPreviewPromise = createCancelablePromise(token => this.updatePreviewWithConflict(preview!, conflictUri, conflictContent, token)); + preview = await this.syncPreviewPromise; + + if (!preview.hasConflicts) { + + // apply preview + await this.applyPreview(preview, false); + + // reset preview + this.syncPreviewPromise = null; + + this.setStatus(SyncStatus.Idle); + } + + } + async hasPreviouslySynced(): Promise { const lastSyncData = await this.getLastSyncUserData(); return !!lastSyncData; @@ -378,14 +509,14 @@ export abstract class AbstractSynchroniser extends Disposable { return { ref: refOrLastSyncData, content }; } else { const lastSyncUserData: IUserData | null = refOrLastSyncData ? { ref: refOrLastSyncData.ref, content: refOrLastSyncData.syncData ? JSON.stringify(refOrLastSyncData.syncData) : null } : null; - return this.userDataSyncStoreService.read(this.resource, lastSyncUserData); + return this.userDataSyncStoreService.read(this.resource, lastSyncUserData, this.syncHeaders); } } protected async updateRemoteUserData(content: string, ref: string | null): Promise { const machineId = await this.currentMachineIdPromise; const syncData: ISyncData = { version: this.version, machineId, content }; - ref = await this.userDataSyncStoreService.write(this.resource, JSON.stringify(syncData), ref); + ref = await this.userDataSyncStoreService.write(this.resource, JSON.stringify(syncData), ref, this.syncHeaders); return { ref, syncData }; } @@ -394,26 +525,31 @@ export abstract class AbstractSynchroniser extends Disposable { return this.userDataSyncBackupStoreService.backup(this.resource, JSON.stringify(syncData)); } - abstract stop(): Promise; + async stop(): Promise { + this.logService.info(`${this.syncResourceLogLabel}: Stopped synchronizing ${this.resource.toLowerCase()}.`); + if (this.syncPreviewPromise) { + this.syncPreviewPromise.cancel(); + this.syncPreviewPromise = null; + } + this.setStatus(SyncStatus.Idle); + } protected abstract readonly version: number; - protected abstract performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise; - protected abstract performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise; - protected abstract generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise; + protected abstract generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise; + protected abstract generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise; + protected abstract generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise; + protected abstract generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise; + protected abstract updatePreviewWithConflict(preview: ISyncResourcePreview, conflictResource: URI, content: string, token: CancellationToken): Promise; + protected abstract applyPreview(preview: ISyncResourcePreview, forcePush: boolean): Promise; } -export interface IFileSyncPreviewResult extends ISyncPreviewResult { +export interface IFileSyncPreview extends ISyncResourcePreview { readonly fileContent: IFileContent | null; - readonly remoteUserData: IRemoteUserData; - readonly lastSyncUserData: IRemoteUserData | null; readonly content: string | null; - readonly hasConflicts: boolean; } export abstract class AbstractFileSynchroniser extends AbstractSynchroniser { - protected syncPreviewResultPromise: CancelablePromise | null = null; - constructor( protected readonly file: URI, resource: SyncResource, @@ -422,34 +558,32 @@ export abstract class AbstractFileSynchroniser extends AbstractSynchroniser { @IStorageService storageService: IStorageService, @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IConfigurationService configurationService: IConfigurationService, ) { - super(resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); this._register(this.fileService.watch(dirname(file))); this._register(this.fileService.onDidFilesChange(e => this.onFileChanges(e))); } async stop(): Promise { - this.cancel(); - this.logService.info(`${this.syncResourceLogLabel}: Stopped synchronizing ${this.resource.toLowerCase()}.`); + await super.stop(); try { await this.fileService.del(this.localPreviewResource); } catch (e) { /* ignore */ } - this.setStatus(SyncStatus.Idle); } - protected async getConflictContent(conflictResource: URI): Promise { + protected async resolvePreviewContent(conflictResource: URI): Promise { if (isEqual(this.remotePreviewResource, conflictResource) || isEqual(this.localPreviewResource, conflictResource)) { - if (this.syncPreviewResultPromise) { - const result = await this.syncPreviewResultPromise; + const syncPreview = await this.getSyncPreviewInProgress(); + if (syncPreview) { if (isEqual(this.remotePreviewResource, conflictResource)) { - return result.remoteUserData && result.remoteUserData.syncData ? result.remoteUserData.syncData.content : null; + return syncPreview.remoteUserData && syncPreview.remoteUserData.syncData ? syncPreview.remoteUserData.syncData.content : null; } if (isEqual(this.localPreviewResource, conflictResource)) { - return result.fileContent ? result.fileContent.value.toString() : null; + return (syncPreview as IFileSyncPreview).fileContent ? (syncPreview as IFileSyncPreview).fileContent!.value.toString() : null; } } } @@ -487,31 +621,7 @@ export abstract class AbstractFileSynchroniser extends AbstractSynchroniser { if (!e.contains(this.file)) { return; } - - if (!this.isEnabled()) { - return; - } - - // Sync again if local file has changed and current status is in conflicts - if (this.status === SyncStatus.HasConflicts) { - this.syncPreviewResultPromise?.then(result => { - this.cancel(); - this.doSync(result.remoteUserData, result.lastSyncUserData).then(status => this.setStatus(status)); - }); - } - - // Otherwise fire change event - else { - this.triggerLocalChange(); - } - - } - - protected cancel(): void { - if (this.syncPreviewResultPromise) { - this.syncPreviewResultPromise.cancel(); - this.syncPreviewResultPromise = null; - } + this.triggerLocalChange(); } protected abstract readonly localPreviewResource: URI; @@ -528,13 +638,13 @@ export abstract class AbstractJsonFileSynchroniser extends AbstractFileSynchroni @IStorageService storageService: IStorageService, @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IUserDataSyncUtilService protected readonly userDataSyncUtilService: IUserDataSyncUtilService, @IConfigurationService configurationService: IConfigurationService, ) { - super(file, resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(file, resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); } protected hasErrors(content: string): boolean { diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 866ad0804f3..4cce10a6179 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -3,7 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, IUserDataSyncStoreService, ISyncExtension, IUserDataSyncLogService, IUserDataSynchroniser, SyncResource, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, ISyncResourceHandle, ISyncPreviewResult, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync'; +import { + IUserDataSyncStoreService, ISyncExtension, IUserDataSyncLogService, IUserDataSynchroniser, SyncResource, IUserDataSyncResourceEnablementService, + IUserDataSyncBackupStoreService, ISyncResourceHandle, USER_DATA_SYNC_SCHEME, IRemoteUserData, ISyncData, IResourcePreview +} from 'vs/platform/userDataSync/common/userDataSync'; import { Event } from 'vs/base/common/event'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IExtensionManagementService, IExtensionGalleryService, IGlobalExtensionEnablementService, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -11,8 +14,8 @@ import { ExtensionType, IExtensionIdentifier } from 'vs/platform/extensions/comm import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { merge, getIgnoredExtensions } from 'vs/platform/userDataSync/common/extensionsMerge'; -import { AbstractSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { merge, getIgnoredExtensions, IMergeResult } from 'vs/platform/userDataSync/common/extensionsMerge'; +import { AbstractSynchroniser, ISyncResourcePreview } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { URI } from 'vs/base/common/uri'; import { joinPath, dirname, basename, isEqual } from 'vs/base/common/resources'; @@ -20,10 +23,10 @@ import { format } from 'vs/base/common/jsonFormatter'; import { applyEdits } from 'vs/base/common/jsonEdit'; import { compare } from 'vs/base/common/strings'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { CancellationToken } from 'vs/base/common/cancellation'; -interface IExtensionsSyncPreviewResult extends ISyncPreviewResult { +interface IExtensionsSyncPreview extends ISyncResourcePreview { readonly localExtensions: ISyncExtension[]; - readonly remoteUserData: IRemoteUserData; readonly lastSyncUserData: ILastSyncUserData | null; readonly added: ISyncExtension[]; readonly removed: IExtensionIdentifier[]; @@ -36,7 +39,6 @@ interface ILastSyncUserData extends IRemoteUserData { skippedExtensions: ISyncExtension[] | undefined; } - export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUserDataSynchroniser { private static readonly EXTENSIONS_DATA_URI = URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: 'extensions', path: `/current.json` }); @@ -45,6 +47,8 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse */ protected readonly version: number = 3; protected isEnabled(): boolean { return super.isEnabled() && this.extensionGalleryService.isEnabled(); } + private readonly localPreviewResource: URI = joinPath(this.syncPreviewFolder, 'extensions.json'); + private readonly remotePreviewResource: URI = this.localPreviewResource.with({ scheme: USER_DATA_SYNC_SCHEME }); constructor( @IEnvironmentService environmentService: IEnvironmentService, @@ -57,10 +61,10 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse @IUserDataSyncLogService logService: IUserDataSyncLogService, @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @IConfigurationService configurationService: IConfigurationService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, ) { - super(SyncResource.Extensions, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(SyncResource.Extensions, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); this._register( Event.debounce( Event.any( @@ -70,79 +74,158 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse () => undefined, 500)(() => this.triggerLocalChange())); } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling extensions as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling extensions...`); - this.setStatus(SyncStatus.Syncing); - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - - if (remoteUserData.syncData !== null) { - const installedExtensions = await this.extensionManagementService.getInstalled(); - const localExtensions = this.getLocalExtensions(installedExtensions); - const remoteExtensions = await this.parseAndMigrateExtensions(remoteUserData.syncData); - const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); - const { added, updated, remote, removed } = merge(localExtensions, remoteExtensions, localExtensions, [], ignoredExtensions); - await this.apply({ - added, removed, updated, remote, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, - hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, - hasRemoteChanged: remote !== null, - isLastSyncFromCurrentMachine: false - }); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote extensions does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling extensions.`); - } finally { - this.setStatus(SyncStatus.Idle); + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const installedExtensions = await this.extensionManagementService.getInstalled(); + const localExtensions = this.getLocalExtensions(installedExtensions); + const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); + if (remoteUserData.syncData !== null) { + const remoteExtensions = await this.parseAndMigrateExtensions(remoteUserData.syncData); + const mergeResult = merge(localExtensions, remoteExtensions, localExtensions, [], ignoredExtensions); + const { added, removed, updated, remote } = mergeResult; + const resourcePreviews: IResourcePreview[] = this.getResourcePreviews(mergeResult); + return { + remoteUserData, lastSyncUserData, + added, removed, updated, remote, localExtensions, skippedExtensions: [], + hasLocalChanged: resourcePreviews.some(({ hasLocalChanged }) => hasLocalChanged), + hasRemoteChanged: resourcePreviews.some(({ hasRemoteChanged }) => hasRemoteChanged), + hasConflicts: false, + isLastSyncFromCurrentMachine: false, + resourcePreviews, + }; + } else { + return { + remoteUserData, lastSyncUserData, + added: [], removed: [], updated: [], remote: null, localExtensions, skippedExtensions: [], + hasLocalChanged: false, + hasRemoteChanged: false, + hasConflicts: false, + isLastSyncFromCurrentMachine: false, + resourcePreviews: [], + }; } } - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing extensions as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing extensions...`); - this.setStatus(SyncStatus.Syncing); - - const installedExtensions = await this.extensionManagementService.getInstalled(); - const localExtensions = this.getLocalExtensions(installedExtensions); - const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); - const { added, removed, updated, remote } = merge(localExtensions, null, null, [], ignoredExtensions); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - await this.apply({ - added, removed, updated, remote, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, - hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, - hasRemoteChanged: remote !== null, - isLastSyncFromCurrentMachine: false - }, true); - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing extensions.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const installedExtensions = await this.extensionManagementService.getInstalled(); + const localExtensions = this.getLocalExtensions(installedExtensions); + const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); + const mergeResult = merge(localExtensions, null, null, [], ignoredExtensions); + const { added, removed, updated, remote } = mergeResult; + const resourcePreviews: IResourcePreview[] = this.getResourcePreviews(mergeResult); + return { + added, removed, updated, remote, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, + hasLocalChanged: resourcePreviews.some(({ hasLocalChanged }) => hasLocalChanged), + hasRemoteChanged: resourcePreviews.some(({ hasRemoteChanged }) => hasRemoteChanged), + isLastSyncFromCurrentMachine: false, + hasConflicts: false, + resourcePreviews + }; } - async stop(): Promise { } + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { + const installedExtensions = await this.extensionManagementService.getInstalled(); + const localExtensions = this.getLocalExtensions(installedExtensions); + const syncExtensions = await this.parseAndMigrateExtensions(syncData); + const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); + const mergeResult = merge(localExtensions, syncExtensions, localExtensions, [], ignoredExtensions); + const { added, removed, updated } = mergeResult; + const resourcePreviews: IResourcePreview[] = this.getResourcePreviews(mergeResult); + return { + added, removed, updated, remote: syncExtensions, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, + hasLocalChanged: resourcePreviews.some(({ hasLocalChanged }) => hasLocalChanged), + hasRemoteChanged: true, + isLastSyncFromCurrentMachine: false, + hasConflicts: false, + resourcePreviews + }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { + const remoteExtensions: ISyncExtension[] | null = remoteUserData.syncData ? await this.parseAndMigrateExtensions(remoteUserData.syncData) : null; + const skippedExtensions: ISyncExtension[] = lastSyncUserData ? lastSyncUserData.skippedExtensions || [] : []; + const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); + let lastSyncExtensions: ISyncExtension[] | null = null; + if (lastSyncUserData === null) { + if (isLastSyncFromCurrentMachine) { + lastSyncExtensions = await this.parseAndMigrateExtensions(remoteUserData.syncData!); + } + } else { + lastSyncExtensions = await this.parseAndMigrateExtensions(lastSyncUserData.syncData!); + } + + const installedExtensions = await this.extensionManagementService.getInstalled(); + const localExtensions = this.getLocalExtensions(installedExtensions); + const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); + + if (remoteExtensions) { + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote extensions with local extensions...`); + } else { + this.logService.trace(`${this.syncResourceLogLabel}: Remote extensions does not exist. Synchronizing extensions for the first time.`); + } + + const mergeResult = merge(localExtensions, remoteExtensions, lastSyncExtensions, skippedExtensions, ignoredExtensions); + const { added, removed, updated, remote } = mergeResult; + const resourcePreviews: IResourcePreview[] = this.getResourcePreviews(mergeResult); + + return { + added, + removed, + updated, + remote, + skippedExtensions, + remoteUserData, + localExtensions, + lastSyncUserData, + hasLocalChanged: resourcePreviews.some(({ hasLocalChanged }) => hasLocalChanged), + hasRemoteChanged: resourcePreviews.some(({ hasRemoteChanged }) => hasRemoteChanged), + isLastSyncFromCurrentMachine, + hasConflicts: false, + resourcePreviews + }; + } + + protected async updatePreviewWithConflict(preview: IExtensionsSyncPreview, conflictResource: URI, content: string, token: CancellationToken): Promise { + throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`); + } + + protected async applyPreview({ added, removed, updated, remote, remoteUserData, skippedExtensions, lastSyncUserData, localExtensions, hasLocalChanged, hasRemoteChanged }: IExtensionsSyncPreview, forcePush: boolean): Promise { + + if (!hasLocalChanged && !hasRemoteChanged) { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing extensions.`); + } + + if (hasLocalChanged) { + await this.backupLocal(JSON.stringify(localExtensions)); + skippedExtensions = await this.updateLocalExtensions(added, removed, updated, skippedExtensions); + } + + if (remote) { + // update remote + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote extensions...`); + const content = JSON.stringify(remote); + remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote extensions`); + } + + if (lastSyncUserData?.ref !== remoteUserData.ref) { + // update last sync + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized extensions...`); + await this.updateLastSyncUserData(remoteUserData, { skippedExtensions }); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized extensions`); + } + } + + private getResourcePreviews({ added, removed, updated, remote }: IMergeResult): IResourcePreview[] { + const hasLocalChanged = added.length > 0 || removed.length > 0 || updated.length > 0; + const hasRemoteChanged = remote !== null; + return [{ + hasLocalChanged, + hasConflicts: false, + hasRemoteChanged, + localResouce: ExtensionsSynchroniser.EXTENSIONS_DATA_URI, + remoteResource: this.remotePreviewResource + }]; + } async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { return [{ resource: joinPath(uri, 'extensions.json'), comparableResource: ExtensionsSynchroniser.EXTENSIONS_DATA_URI }]; @@ -189,10 +272,6 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse return applyEdits(content, edits); } - async acceptConflict(conflict: URI, content: string): Promise { - throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`); - } - async hasLocalData(): Promise { try { const installedExtensions = await this.extensionManagementService.getInstalled(); @@ -206,94 +285,6 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse return false; } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const previewResult = await this.generatePreview(remoteUserData, lastSyncUserData); - await this.apply(previewResult); - return SyncStatus.Idle; - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const installedExtensions = await this.extensionManagementService.getInstalled(); - const localExtensions = this.getLocalExtensions(installedExtensions); - const syncExtensions = await this.parseAndMigrateExtensions(syncData); - const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); - const { added, updated, removed } = merge(localExtensions, syncExtensions, localExtensions, [], ignoredExtensions); - - await this.apply({ - added, removed, updated, remote: syncExtensions, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, - hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, - hasRemoteChanged: true, - isLastSyncFromCurrentMachine: false - }); - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const remoteExtensions: ISyncExtension[] | null = remoteUserData.syncData ? await this.parseAndMigrateExtensions(remoteUserData.syncData) : null; - const skippedExtensions: ISyncExtension[] = lastSyncUserData ? lastSyncUserData.skippedExtensions || [] : []; - const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); - let lastSyncExtensions: ISyncExtension[] | null = null; - if (lastSyncUserData === null) { - if (isLastSyncFromCurrentMachine) { - lastSyncExtensions = await this.parseAndMigrateExtensions(remoteUserData.syncData!); - } - } else { - lastSyncExtensions = await this.parseAndMigrateExtensions(lastSyncUserData.syncData!); - } - - const installedExtensions = await this.extensionManagementService.getInstalled(); - const localExtensions = this.getLocalExtensions(installedExtensions); - const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); - - if (remoteExtensions) { - this.logService.trace(`${this.syncResourceLogLabel}: Merging remote extensions with local extensions...`); - } else { - this.logService.trace(`${this.syncResourceLogLabel}: Remote extensions does not exist. Synchronizing extensions for the first time.`); - } - - const { added, removed, updated, remote } = merge(localExtensions, remoteExtensions, lastSyncExtensions, skippedExtensions, ignoredExtensions); - - return { - added, - removed, - updated, - remote, - skippedExtensions, - remoteUserData, - localExtensions, - lastSyncUserData, - hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, - hasRemoteChanged: remote !== null, - isLastSyncFromCurrentMachine - }; - } - - private async apply({ added, removed, updated, remote, remoteUserData, skippedExtensions, lastSyncUserData, localExtensions, hasLocalChanged, hasRemoteChanged }: IExtensionsSyncPreviewResult, forcePush?: boolean): Promise { - - if (!hasLocalChanged && !hasRemoteChanged) { - this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing extensions.`); - } - - if (hasLocalChanged) { - await this.backupLocal(JSON.stringify(localExtensions)); - skippedExtensions = await this.updateLocalExtensions(added, removed, updated, skippedExtensions); - } - - if (remote) { - // update remote - this.logService.trace(`${this.syncResourceLogLabel}: Updating remote extensions...`); - const content = JSON.stringify(remote); - remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); - this.logService.info(`${this.syncResourceLogLabel}: Updated remote extensions`); - } - - if (lastSyncUserData?.ref !== remoteUserData.ref) { - // update last sync - this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized extensions...`); - await this.updateLastSyncUserData(remoteUserData, { skippedExtensions }); - this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized extensions`); - } - } - private async updateLocalExtensions(added: ISyncExtension[], removed: IExtensionIdentifier[], updated: ISyncExtension[], skippedExtensions: ISyncExtension[]): Promise { const removeFromSkipped: IExtensionIdentifier[] = []; const addToSkipped: ISyncExtension[] = []; diff --git a/src/vs/platform/userDataSync/common/globalStateSync.ts b/src/vs/platform/userDataSync/common/globalStateSync.ts index f19f415fe67..77dc7dee3a0 100644 --- a/src/vs/platform/userDataSync/common/globalStateSync.ts +++ b/src/vs/platform/userDataSync/common/globalStateSync.ts @@ -3,7 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IGlobalState, SyncResource, IUserDataSynchroniser, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, ISyncResourceHandle, IStorageValue, ISyncPreviewResult, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync'; +import { + IUserDataSyncStoreService, IUserDataSyncLogService, IGlobalState, SyncResource, IUserDataSynchroniser, IUserDataSyncResourceEnablementService, + IUserDataSyncBackupStoreService, ISyncResourceHandle, IStorageValue, USER_DATA_SYNC_SCHEME, IRemoteUserData, ISyncData, IResourcePreview +} from 'vs/platform/userDataSync/common/userDataSync'; import { VSBuffer } from 'vs/base/common/buffer'; import { Event } from 'vs/base/common/event'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -11,9 +14,9 @@ import { dirname, joinPath, basename, isEqual } from 'vs/base/common/resources'; import { IFileService } from 'vs/platform/files/common/files'; import { IStringDictionary } from 'vs/base/common/collections'; import { edit } from 'vs/platform/userDataSync/common/content'; -import { merge } from 'vs/platform/userDataSync/common/globalStateMerge'; +import { merge, IMergeResult } from 'vs/platform/userDataSync/common/globalStateMerge'; import { parse } from 'vs/base/common/json'; -import { AbstractSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { AbstractSynchroniser, ISyncResourcePreview } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { URI } from 'vs/base/common/uri'; @@ -22,16 +25,16 @@ import { applyEdits } from 'vs/base/common/jsonEdit'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IStorageKeysSyncRegistryService, IStorageKey } from 'vs/platform/userDataSync/common/storageKeys'; import { equals } from 'vs/base/common/arrays'; +import { CancellationToken } from 'vs/base/common/cancellation'; const argvStoragePrefx = 'globalState.argv.'; const argvProperties: string[] = ['locale']; -interface IGlobalSyncPreviewResult extends ISyncPreviewResult { +interface IGlobalStateSyncPreview extends ISyncResourcePreview { readonly local: { added: IStringDictionary, removed: string[], updated: IStringDictionary }; readonly remote: IStringDictionary | null; readonly skippedStorageKeys: string[]; readonly localUserData: IGlobalState; - readonly remoteUserData: IRemoteUserData; readonly lastSyncUserData: ILastSyncUserData | null; } @@ -43,6 +46,8 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs private static readonly GLOBAL_STATE_DATA_URI = URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: 'globalState', path: `/current.json` }); protected readonly version: number = 1; + private readonly localPreviewResource: URI = joinPath(this.syncPreviewFolder, 'globalState.json'); + private readonly remotePreviewResource: URI = this.localPreviewResource.with({ scheme: USER_DATA_SYNC_SCHEME }); constructor( @IFileService fileService: IFileService, @@ -50,13 +55,13 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IEnvironmentService private readonly environmentService: IEnvironmentService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @IStorageService private readonly storageService: IStorageService, @IStorageKeysSyncRegistryService private readonly storageKeysSyncRegistryService: IStorageKeysSyncRegistryService, ) { - super(SyncResource.GlobalState, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(SyncResource.GlobalState, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); this._register(this.fileService.watch(dirname(this.environmentService.argvResource))); this._register( Event.any( @@ -70,76 +75,145 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs ); } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling ui state as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling ui state...`); - this.setStatus(SyncStatus.Syncing); - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - - if (remoteUserData.syncData !== null) { - const localGlobalState = await this.getLocalGlobalState(); - const remoteGlobalState: IGlobalState = JSON.parse(remoteUserData.syncData.content); - const { local, remote, skipped } = merge(localGlobalState.storage, remoteGlobalState.storage, null, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); - await this.apply({ - local, remote, remoteUserData, localUserData: localGlobalState, lastSyncUserData, - skippedStorageKeys: skipped, - hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, - hasRemoteChanged: remote !== null, - isLastSyncFromCurrentMachine: false - }); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote UI state does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling UI state.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - } - - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing UI State as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing UI State...`); - this.setStatus(SyncStatus.Syncing); - - const localUserData = await this.getLocalGlobalState(); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - await this.apply({ - local: { added: {}, removed: [], updated: {} }, remote: localUserData.storage, remoteUserData, localUserData, lastSyncUserData, - skippedStorageKeys: [], + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const localGlobalState = await this.getLocalGlobalState(); + if (remoteUserData.syncData !== null) { + const remoteGlobalState: IGlobalState = JSON.parse(remoteUserData.syncData.content); + const mergeResult = merge(localGlobalState.storage, remoteGlobalState.storage, null, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); + const { local, remote, skipped } = mergeResult; + const resourcePreviews: IResourcePreview[] = this.getResourcePreviews(mergeResult); + return { + remoteUserData, lastSyncUserData, + local, remote, localUserData: localGlobalState, skippedStorageKeys: skipped, + hasLocalChanged: resourcePreviews.some(({ hasLocalChanged }) => hasLocalChanged), + hasRemoteChanged: resourcePreviews.some(({ hasRemoteChanged }) => hasRemoteChanged), + hasConflicts: false, + isLastSyncFromCurrentMachine: false, + resourcePreviews + }; + } else { + return { + remoteUserData, lastSyncUserData, + local: { added: {}, removed: [], updated: {} }, remote: null, localUserData: localGlobalState, skippedStorageKeys: [], hasLocalChanged: false, - hasRemoteChanged: true, - isLastSyncFromCurrentMachine: false - }, true); - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing UI State.`); - } finally { - this.setStatus(SyncStatus.Idle); + hasRemoteChanged: false, + hasConflicts: false, + isLastSyncFromCurrentMachine: false, + resourcePreviews: [] + }; } - } - async stop(): Promise { } + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const localUserData = await this.getLocalGlobalState(); + return { + local: { added: {}, removed: [], updated: {} }, remote: localUserData.storage, remoteUserData, localUserData, lastSyncUserData, + skippedStorageKeys: [], + hasLocalChanged: false, + hasRemoteChanged: true, + isLastSyncFromCurrentMachine: false, + hasConflicts: false, + resourcePreviews: this.getResourcePreviews({ local: { added: {}, removed: [], updated: {} }, remote: localUserData.storage, skipped: [] }) + }; + } + + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { + const localUserData = await this.getLocalGlobalState(); + const syncGlobalState: IGlobalState = JSON.parse(syncData.content); + const mergeResult = merge(localUserData.storage, syncGlobalState.storage, localUserData.storage, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); + const { local, skipped } = mergeResult; + const resourcePreviews: IResourcePreview[] = this.getResourcePreviews(mergeResult); + return { + local, remote: syncGlobalState.storage, remoteUserData, localUserData, lastSyncUserData, + skippedStorageKeys: skipped, + hasLocalChanged: resourcePreviews.some(({ hasLocalChanged }) => hasLocalChanged), + hasRemoteChanged: true, + isLastSyncFromCurrentMachine: false, + hasConflicts: false, + resourcePreviews: [], + }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const remoteGlobalState: IGlobalState = remoteUserData.syncData ? JSON.parse(remoteUserData.syncData.content) : null; + const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); + let lastSyncGlobalState: IGlobalState | null = null; + if (lastSyncUserData === null) { + if (isLastSyncFromCurrentMachine) { + lastSyncGlobalState = remoteUserData.syncData ? JSON.parse(remoteUserData.syncData.content) : null; + } + } else { + lastSyncGlobalState = lastSyncUserData.syncData ? JSON.parse(lastSyncUserData.syncData.content) : null; + } + + const localGloablState = await this.getLocalGlobalState(); + + if (remoteGlobalState) { + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote ui state with local ui state...`); + } else { + this.logService.trace(`${this.syncResourceLogLabel}: Remote ui state does not exist. Synchronizing ui state for the first time.`); + } + + const mergeResult = merge(localGloablState.storage, remoteGlobalState ? remoteGlobalState.storage : null, lastSyncGlobalState ? lastSyncGlobalState.storage : null, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); + const { local, remote, skipped } = mergeResult; + const resourcePreviews: IResourcePreview[] = this.getResourcePreviews(mergeResult); + + return { + local, remote, remoteUserData, localUserData: localGloablState, lastSyncUserData, + skippedStorageKeys: skipped, + hasLocalChanged: resourcePreviews.some(({ hasLocalChanged }) => hasLocalChanged), + hasRemoteChanged: resourcePreviews.some(({ hasRemoteChanged }) => hasRemoteChanged), + isLastSyncFromCurrentMachine, + hasConflicts: false, + resourcePreviews + }; + } + + protected async updatePreviewWithConflict(preview: IGlobalStateSyncPreview, conflictResource: URI, content: string, token: CancellationToken): Promise { + throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`); + } + + protected async applyPreview({ local, remote, remoteUserData, lastSyncUserData, localUserData, hasLocalChanged, hasRemoteChanged, skippedStorageKeys }: IGlobalStateSyncPreview, forcePush: boolean): Promise { + + if (!hasLocalChanged && !hasRemoteChanged) { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing ui state.`); + } + + if (hasLocalChanged) { + // update local + this.logService.trace(`${this.syncResourceLogLabel}: Updating local ui state...`); + await this.backupLocal(JSON.stringify(localUserData)); + await this.writeLocalGlobalState(local); + this.logService.info(`${this.syncResourceLogLabel}: Updated local ui state`); + } + + if (hasRemoteChanged) { + // update remote + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote ui state...`); + const content = JSON.stringify({ storage: remote }); + remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote ui state`); + } + + if (lastSyncUserData?.ref !== remoteUserData.ref || !equals(lastSyncUserData.skippedStorageKeys, skippedStorageKeys)) { + // update last sync + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized ui state...`); + await this.updateLastSyncUserData(remoteUserData, { skippedStorageKeys }); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized ui state`); + } + } + + private getResourcePreviews({ local, remote }: IMergeResult): IResourcePreview[] { + const hasLocalChanged = Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0; + const hasRemoteChanged = remote !== null; + return [{ + hasLocalChanged, + hasConflicts: false, + hasRemoteChanged, + localResouce: GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI, + remoteResource: this.remotePreviewResource + }]; + } async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { return [{ resource: joinPath(uri, 'globalState.json'), comparableResource: GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI }]; @@ -180,10 +254,6 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs return applyEdits(content, edits); } - async acceptConflict(conflict: URI, content: string): Promise { - throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`); - } - async hasLocalData(): Promise { try { const { storage } = await this.getLocalGlobalState(); @@ -196,86 +266,6 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs return false; } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const result = await this.generatePreview(remoteUserData, lastSyncUserData); - await this.apply(result); - return SyncStatus.Idle; - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const localUserData = await this.getLocalGlobalState(); - const syncGlobalState: IGlobalState = JSON.parse(syncData.content); - const { local, skipped } = merge(localUserData.storage, syncGlobalState.storage, localUserData.storage, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); - await this.apply({ - local, remote: syncGlobalState.storage, remoteUserData, localUserData, lastSyncUserData, - skippedStorageKeys: skipped, - hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, - hasRemoteChanged: true, - isLastSyncFromCurrentMachine: false, - }); - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const remoteGlobalState: IGlobalState = remoteUserData.syncData ? JSON.parse(remoteUserData.syncData.content) : null; - const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); - let lastSyncGlobalState: IGlobalState | null = null; - if (lastSyncUserData === null) { - if (isLastSyncFromCurrentMachine) { - lastSyncGlobalState = remoteUserData.syncData ? JSON.parse(remoteUserData.syncData.content) : null; - } - } else { - lastSyncGlobalState = lastSyncUserData.syncData ? JSON.parse(lastSyncUserData.syncData.content) : null; - } - - const localGloablState = await this.getLocalGlobalState(); - - if (remoteGlobalState) { - this.logService.trace(`${this.syncResourceLogLabel}: Merging remote ui state with local ui state...`); - } else { - this.logService.trace(`${this.syncResourceLogLabel}: Remote ui state does not exist. Synchronizing ui state for the first time.`); - } - - const { local, remote, skipped } = merge(localGloablState.storage, remoteGlobalState ? remoteGlobalState.storage : null, lastSyncGlobalState ? lastSyncGlobalState.storage : null, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); - - return { - local, remote, remoteUserData, localUserData: localGloablState, lastSyncUserData, - skippedStorageKeys: skipped, - hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, - hasRemoteChanged: remote !== null, - isLastSyncFromCurrentMachine - }; - } - - private async apply({ local, remote, remoteUserData, lastSyncUserData, localUserData, hasLocalChanged, hasRemoteChanged, skippedStorageKeys }: IGlobalSyncPreviewResult, forcePush?: boolean): Promise { - - if (!hasLocalChanged && !hasRemoteChanged) { - this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing ui state.`); - } - - if (hasLocalChanged) { - // update local - this.logService.trace(`${this.syncResourceLogLabel}: Updating local ui state...`); - await this.backupLocal(JSON.stringify(localUserData)); - await this.writeLocalGlobalState(local); - this.logService.info(`${this.syncResourceLogLabel}: Updated local ui state`); - } - - if (hasRemoteChanged) { - // update remote - this.logService.trace(`${this.syncResourceLogLabel}: Updating remote ui state...`); - const content = JSON.stringify({ storage: remote }); - remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); - this.logService.info(`${this.syncResourceLogLabel}: Updated remote ui state`); - } - - if (lastSyncUserData?.ref !== remoteUserData.ref || !equals(lastSyncUserData.skippedStorageKeys, skippedStorageKeys)) { - // update last sync - this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized ui state...`); - await this.updateLastSyncUserData(remoteUserData, { skippedStorageKeys }); - this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized ui state`); - } - } - private async getLocalGlobalState(): Promise { const storage: IStringDictionary = {}; const argvContent: string = await this.getLocalArgvContent(); diff --git a/src/vs/platform/userDataSync/common/keybindingsSync.ts b/src/vs/platform/userDataSync/common/keybindingsSync.ts index 56ca4b4d9c7..ba5c85f34c1 100644 --- a/src/vs/platform/userDataSync/common/keybindingsSync.ts +++ b/src/vs/platform/userDataSync/common/keybindingsSync.ts @@ -4,19 +4,22 @@ *--------------------------------------------------------------------------------------------*/ import { IFileService, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; -import { UserDataSyncError, UserDataSyncErrorCode, SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSyncUtilService, SyncResource, IUserDataSynchroniser, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncResourceHandle } from 'vs/platform/userDataSync/common/userDataSync'; +import { + UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSyncUtilService, SyncResource, + IUserDataSynchroniser, IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, USER_DATA_SYNC_SCHEME, ISyncResourceHandle, + IRemoteUserData, ISyncData, IResourcePreview +} from 'vs/platform/userDataSync/common/userDataSync'; import { merge } from 'vs/platform/userDataSync/common/keybindingsMerge'; import { VSBuffer } from 'vs/base/common/buffer'; import { parse } from 'vs/base/common/json'; import { localize } from 'vs/nls'; -import { createCancelablePromise } from 'vs/base/common/async'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { CancellationToken } from 'vs/base/common/cancellation'; import { OS, OperatingSystem } from 'vs/base/common/platform'; import { isUndefined } from 'vs/base/common/types'; import { isNonEmptyArray } from 'vs/base/common/arrays'; -import { IFileSyncPreviewResult, AbstractJsonFileSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { IFileSyncPreview, AbstractJsonFileSynchroniser } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { URI } from 'vs/base/common/uri'; import { joinPath, isEqual, dirname, basename } from 'vs/base/common/resources'; @@ -32,7 +35,7 @@ interface ISyncContent { export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implements IUserDataSynchroniser { protected readonly version: number = 1; - protected readonly localPreviewResource: URI = joinPath(this.syncFolder, PREVIEW_DIR_NAME, 'keybindings.json'); + protected readonly localPreviewResource: URI = joinPath(this.syncPreviewFolder, 'keybindings.json'); protected readonly remotePreviewResource: URI = this.localPreviewResource.with({ scheme: USER_DATA_SYNC_SCHEME }); constructor( @@ -40,255 +43,99 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IConfigurationService configurationService: IConfigurationService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IFileService fileService: IFileService, @IEnvironmentService environmentService: IEnvironmentService, @IStorageService storageService: IStorageService, @IUserDataSyncUtilService userDataSyncUtilService: IUserDataSyncUtilService, @ITelemetryService telemetryService: ITelemetryService, ) { - super(environmentService.keybindingsResource, SyncResource.Keybindings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService); + super(environmentService.keybindingsResource, SyncResource.Keybindings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService); } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling keybindings as it is disabled.`); - return; - } + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + const fileContent = await this.getLocalFileContent(); + const content = remoteUserData.syncData !== null ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null; + const hasLocalChanged = content !== null; + const hasRemoteChanged = false; + const hasConflicts = false; - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling keybindings...`); - this.setStatus(SyncStatus.Syncing); - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - const content = remoteUserData.syncData !== null ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null; - - if (content !== null) { - const fileContent = await this.getLocalFileContent(); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasConflicts: false, - hasLocalChanged: true, - hasRemoteChanged: false, - isLastSyncFromCurrentMachine: false - })); - await this.apply(); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote keybindings does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling keybindings.`); - } finally { - this.setStatus(SyncStatus.Idle); - } + const resourcePreviews: IResourcePreview[] = [{ + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + localResouce: this.file, + remoteResource: this.remotePreviewResource, + }]; + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + isLastSyncFromCurrentMachine: false, + resourcePreviews + }; } - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing keybindings as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing keybindings...`); - this.setStatus(SyncStatus.Syncing); - - const fileContent = await this.getLocalFileContent(); - - if (fileContent !== null) { - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content: fileContent.value.toString(), - hasLocalChanged: false, - hasRemoteChanged: true, - hasConflicts: false, - isLastSyncFromCurrentMachine: false - })); - await this.apply(true); - } - - // No local exists to push - else { - this.logService.info(`${this.syncResourceLogLabel}: Local keybindings does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing keybindings.`); - } finally { - this.setStatus(SyncStatus.Idle); - } + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + const fileContent = await this.getLocalFileContent(); + const content: string | null = fileContent ? fileContent.value.toString() : null; + const hasLocalChanged = false; + const hasRemoteChanged = content !== null; + const hasConflicts = false; + const resourcePreviews: IResourcePreview[] = [{ + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + localResouce: this.file, + remoteResource: this.remotePreviewResource, + }]; + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasLocalChanged, + hasRemoteChanged, + hasConflicts, + isLastSyncFromCurrentMachine: false, + resourcePreviews + }; } - async acceptConflict(conflict: URI, content: string): Promise { - if (this.status === SyncStatus.HasConflicts - && (isEqual(this.localPreviewResource, conflict) || isEqual(this.remotePreviewResource, conflict)) - ) { - const preview = await this.syncPreviewResultPromise!; - this.cancel(); - this.syncPreviewResultPromise = createCancelablePromise(async () => ({ ...preview, content })); - await this.apply(true); - this.setStatus(SyncStatus.Idle); - } - } - - async hasLocalData(): Promise { - try { - const localFileContent = await this.getLocalFileContent(); - if (localFileContent) { - const keybindings = parse(localFileContent.value.toString()); - if (isNonEmptyArray(keybindings)) { - return true; - } - } - } catch (error) { - if ((error).fileOperationResult !== FileOperationResult.FILE_NOT_FOUND) { - return true; - } - } - return false; - } - - async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { - return [{ resource: joinPath(uri, 'keybindings.json'), comparableResource: this.file }]; - } - - async resolveContent(uri: URI): Promise { - if (isEqual(this.remotePreviewResource, uri)) { - return this.getConflictContent(uri); - } - let content = await super.resolveContent(uri); - if (content) { - return content; - } - content = await super.resolveContent(dirname(uri)); - if (content) { - const syncData = this.parseSyncData(content); - if (syncData) { - switch (basename(uri)) { - case 'keybindings.json': - return this.getKeybindingsContentFromSyncContent(syncData.content); - } - } - } - return null; - } - - protected async getConflictContent(conflictResource: URI): Promise { - const content = await super.getConflictContent(conflictResource); - return content !== null ? this.getKeybindingsContentFromSyncContent(content) : null; - } - - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - try { - const result = await this.getPreview(remoteUserData, lastSyncUserData); - if (result.hasConflicts) { - return SyncStatus.HasConflicts; - } - await this.apply(); - return SyncStatus.Idle; - } catch (e) { - this.syncPreviewResultPromise = null; - if (e instanceof UserDataSyncError) { - switch (e.code) { - case UserDataSyncErrorCode.LocalPreconditionFailed: - // Rejected as there is a new local version. Syncing again. - this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize keybindings as there is a new local version available. Synchronizing again...`); - return this.performSync(remoteUserData, lastSyncUserData); - } - } - throw e; - } - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + const fileContent = await this.getLocalFileContent(); const content = this.getKeybindingsContentFromSyncContent(syncData.content); + const hasLocalChanged = content !== null; + const hasRemoteChanged = content !== null; + const hasConflicts = false; - if (content !== null) { - const fileContent = await this.getLocalFileContent(); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasConflicts: false, - hasLocalChanged: true, - hasRemoteChanged: true, - isLastSyncFromCurrentMachine: false - })); - await this.apply(); - } + const resourcePreviews: IResourcePreview[] = [{ + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + localResouce: this.file, + remoteResource: this.remotePreviewResource, + }]; + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + isLastSyncFromCurrentMachine: false, + resourcePreviews + }; } - private async apply(forcePush?: boolean): Promise { - if (!this.syncPreviewResultPromise) { - return; - } - - let { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged } = await this.syncPreviewResultPromise; - - if (content !== null) { - if (this.hasErrors(content)) { - throw new UserDataSyncError(localize('errorInvalidSettings', "Unable to sync keybindings because the content in the file is not valid. Please open the file and correct it."), UserDataSyncErrorCode.LocalInvalidContent, this.resource); - } - - if (hasLocalChanged) { - this.logService.trace(`${this.syncResourceLogLabel}: Updating local keybindings...`); - if (fileContent) { - await this.backupLocal(this.toSyncContent(fileContent.value.toString(), null)); - } - await this.updateLocalFileContent(content, fileContent); - this.logService.info(`${this.syncResourceLogLabel}: Updated local keybindings`); - } - - if (hasRemoteChanged) { - this.logService.trace(`${this.syncResourceLogLabel}: Updating remote keybindings...`); - const remoteContents = this.toSyncContent(content, remoteUserData.syncData ? remoteUserData.syncData.content : null); - remoteUserData = await this.updateRemoteUserData(remoteContents, forcePush ? null : remoteUserData.ref); - this.logService.info(`${this.syncResourceLogLabel}: Updated remote keybindings`); - } - - // Delete the preview - try { - await this.fileService.del(this.localPreviewResource); - } catch (e) { /* ignore */ } - } else { - this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing keybindings.`); - } - - if (lastSyncUserData?.ref !== remoteUserData.ref) { - this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized keybindings...`); - const lastSyncContent = content !== null || fileContent !== null ? this.toSyncContent(content !== null ? content : fileContent!.value.toString(), null) : null; - await this.updateLastSyncUserData({ ref: remoteUserData.ref, syncData: lastSyncContent ? { version: remoteUserData.syncData!.version, machineId: remoteUserData.syncData!.machineId, content: lastSyncContent } : null }); - this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized keybindings`); - } - - this.syncPreviewResultPromise = null; - } - - private getPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - if (!this.syncPreviewResultPromise) { - this.syncPreviewResultPromise = createCancelablePromise(token => this.generatePreview(remoteUserData, lastSyncUserData, token)); - } - return this.syncPreviewResultPromise; - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { const remoteContent = remoteUserData.syncData ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null; const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); let lastSyncContent: string | null = null; @@ -343,8 +190,111 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem } this.setConflicts(hasConflicts && !token.isCancellationRequested ? [{ local: this.localPreviewResource, remote: this.remotePreviewResource }] : []); + const resourcePreviews: IResourcePreview[] = [{ + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + localResouce: this.file, + remoteResource: this.remotePreviewResource, + previewResource: this.localPreviewResource + }]; - return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts, isLastSyncFromCurrentMachine }; + return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts, isLastSyncFromCurrentMachine, resourcePreviews }; + } + + protected async updatePreviewWithConflict(preview: IFileSyncPreview, conflictResource: URI, conflictContent: string, token: CancellationToken): Promise { + if (isEqual(this.localPreviewResource, conflictResource) || isEqual(this.remotePreviewResource, conflictResource)) { + preview = { ...preview, content: conflictContent, hasConflicts: false }; + } + return preview; + } + + protected async applyPreview(preview: IFileSyncPreview, forcePush: boolean): Promise { + let { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged } = preview; + + if (content !== null) { + if (this.hasErrors(content)) { + throw new UserDataSyncError(localize('errorInvalidSettings', "Unable to sync keybindings because the content in the file is not valid. Please open the file and correct it."), UserDataSyncErrorCode.LocalInvalidContent, this.resource); + } + + if (hasLocalChanged) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating local keybindings...`); + if (fileContent) { + await this.backupLocal(this.toSyncContent(fileContent.value.toString(), null)); + } + await this.updateLocalFileContent(content, fileContent); + this.logService.info(`${this.syncResourceLogLabel}: Updated local keybindings`); + } + + if (hasRemoteChanged) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote keybindings...`); + const remoteContents = this.toSyncContent(content, remoteUserData.syncData ? remoteUserData.syncData.content : null); + remoteUserData = await this.updateRemoteUserData(remoteContents, forcePush ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote keybindings`); + } + + // Delete the preview + try { + await this.fileService.del(this.localPreviewResource); + } catch (e) { /* ignore */ } + } else { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing keybindings.`); + } + + if (lastSyncUserData?.ref !== remoteUserData.ref) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized keybindings...`); + const lastSyncContent = content !== null || fileContent !== null ? this.toSyncContent(content !== null ? content : fileContent!.value.toString(), null) : null; + await this.updateLastSyncUserData({ ref: remoteUserData.ref, syncData: lastSyncContent ? { version: remoteUserData.syncData!.version, machineId: remoteUserData.syncData!.machineId, content: lastSyncContent } : null }); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized keybindings`); + } + + } + + async hasLocalData(): Promise { + try { + const localFileContent = await this.getLocalFileContent(); + if (localFileContent) { + const keybindings = parse(localFileContent.value.toString()); + if (isNonEmptyArray(keybindings)) { + return true; + } + } + } catch (error) { + if ((error).fileOperationResult !== FileOperationResult.FILE_NOT_FOUND) { + return true; + } + } + return false; + } + + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { + return [{ resource: joinPath(uri, 'keybindings.json'), comparableResource: this.file }]; + } + + async resolveContent(uri: URI): Promise { + if (isEqual(this.remotePreviewResource, uri)) { + return this.resolvePreviewContent(uri); + } + let content = await super.resolveContent(uri); + if (content) { + return content; + } + content = await super.resolveContent(dirname(uri)); + if (content) { + const syncData = this.parseSyncData(content); + if (syncData) { + switch (basename(uri)) { + case 'keybindings.json': + return this.getKeybindingsContentFromSyncContent(syncData.content); + } + } + } + return null; + } + + protected async resolvePreviewContent(conflictResource: URI): Promise { + const content = await super.resolvePreviewContent(conflictResource); + return content !== null ? this.getKeybindingsContentFromSyncContent(content) : null; } getKeybindingsContentFromSyncContent(syncContent: string): string | null { diff --git a/src/vs/platform/userDataSync/common/settingsSync.ts b/src/vs/platform/userDataSync/common/settingsSync.ts index 5e87e009449..f5dea9f8686 100644 --- a/src/vs/platform/userDataSync/common/settingsSync.ts +++ b/src/vs/platform/userDataSync/common/settingsSync.ts @@ -4,17 +4,20 @@ *--------------------------------------------------------------------------------------------*/ import { IFileService, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; -import { UserDataSyncError, UserDataSyncErrorCode, SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSyncUtilService, CONFIGURATION_SYNC_STORE_KEY, SyncResource, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncResourceHandle } from 'vs/platform/userDataSync/common/userDataSync'; +import { + UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSyncUtilService, CONFIGURATION_SYNC_STORE_KEY, + SyncResource, IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, USER_DATA_SYNC_SCHEME, ISyncResourceHandle, IUserDataSynchroniser, + IRemoteUserData, ISyncData, IResourcePreview +} from 'vs/platform/userDataSync/common/userDataSync'; import { VSBuffer } from 'vs/base/common/buffer'; import { localize } from 'vs/nls'; import { Event } from 'vs/base/common/event'; -import { createCancelablePromise } from 'vs/base/common/async'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { CancellationToken } from 'vs/base/common/cancellation'; import { updateIgnoredSettings, merge, getIgnoredSettings, isEmpty } from 'vs/platform/userDataSync/common/settingsMerge'; import { edit } from 'vs/platform/userDataSync/common/content'; -import { IFileSyncPreviewResult, AbstractJsonFileSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { IFileSyncPreview, AbstractJsonFileSynchroniser } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { URI } from 'vs/base/common/uri'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -33,12 +36,10 @@ function isSettingsSyncContent(thing: any): thing is ISettingsSyncContent { && Object.keys(thing).length === 1; } -export class SettingsSynchroniser extends AbstractJsonFileSynchroniser { - - _serviceBrand: any; +export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implements IUserDataSynchroniser { protected readonly version: number = 1; - protected readonly localPreviewResource: URI = joinPath(this.syncFolder, PREVIEW_DIR_NAME, 'settings.json'); + protected readonly localPreviewResource: URI = joinPath(this.syncPreviewFolder, 'settings.json'); protected readonly remotePreviewResource: URI = this.localPreviewResource.with({ scheme: USER_DATA_SYNC_SCHEME }); constructor( @@ -50,247 +51,196 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser { @IUserDataSyncLogService logService: IUserDataSyncLogService, @IUserDataSyncUtilService userDataSyncUtilService: IUserDataSyncUtilService, @IConfigurationService configurationService: IConfigurationService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, @IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService, ) { - super(environmentService.settingsResource, SyncResource.Settings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService); + super(environmentService.settingsResource, SyncResource.Settings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService); } - protected setStatus(status: SyncStatus): void { - super.setStatus(status); - if (this.status !== SyncStatus.HasConflicts) { - this.setConflicts([]); + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + + const fileContent = await this.getLocalFileContent(); + const formatUtils = await this.getFormattingOptions(); + const ignoredSettings = await this.getIgnoredSettings(); + const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); + + let content: string | null = null; + if (remoteSettingsSyncContent !== null) { + // Update ignored settings from local file content + content = updateIgnoredSettings(remoteSettingsSyncContent.settings, fileContent ? fileContent.value.toString() : '{}', ignoredSettings, formatUtils); } + + const hasLocalChanged = content !== null; + const hasRemoteChanged = false; + const hasConflicts = false; + + const resourcePreviews: IResourcePreview[] = [{ + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + localResouce: this.file, + remoteResource: this.remotePreviewResource, + }]; + + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasLocalChanged, + hasRemoteChanged, + hasConflicts, + isLastSyncFromCurrentMachine: false, + resourcePreviews + }; } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling settings as it is disabled.`); - return; + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + + const fileContent = await this.getLocalFileContent(); + const formatUtils = await this.getFormattingOptions(); + const ignoredSettings = await this.getIgnoredSettings(); + + let content: string | null = null; + if (fileContent !== null) { + // Remove ignored settings + content = updateIgnoredSettings(fileContent.value.toString(), '{}', ignoredSettings, formatUtils); } - this.stop(); + const hasLocalChanged = false; + const hasRemoteChanged = content !== null; + const hasConflicts = false; - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling settings...`); - this.setStatus(SyncStatus.Syncing); + const resourcePreviews: IResourcePreview[] = [{ + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + localResouce: this.file, + remoteResource: this.remotePreviewResource, + }]; - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); - - if (remoteSettingsSyncContent !== null) { - const fileContent = await this.getLocalFileContent(); - const formatUtils = await this.getFormattingOptions(); - // Update ignored settings from local file content - const ignoredSettings = await this.getIgnoredSettings(); - const content = updateIgnoredSettings(remoteSettingsSyncContent.settings, fileContent ? fileContent.value.toString() : '{}', ignoredSettings, formatUtils); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasLocalChanged: true, - hasRemoteChanged: false, - hasConflicts: false, - isLastSyncFromCurrentMachine: false - })); - - await this.apply(); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote settings does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling settings.`); - } finally { - this.setStatus(SyncStatus.Idle); - } + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasLocalChanged, + hasRemoteChanged, + hasConflicts, + isLastSyncFromCurrentMachine: false, + resourcePreviews + }; } - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing settings as it is disabled.`); - return; + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + + const fileContent = await this.getLocalFileContent(); + const formatUtils = await this.getFormattingOptions(); + const ignoredSettings = await this.getIgnoredSettings(); + + let content: string | null = null; + const settingsSyncContent = this.parseSettingsSyncContent(syncData.content); + if (settingsSyncContent) { + content = updateIgnoredSettings(settingsSyncContent.settings, fileContent ? fileContent.value.toString() : '{}', ignoredSettings, formatUtils); } - this.stop(); + const hasLocalChanged = content !== null; + const hasRemoteChanged = content !== null; + const hasConflicts = false; - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing settings...`); - this.setStatus(SyncStatus.Syncing); + const resourcePreviews: IResourcePreview[] = [{ + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + localResouce: this.file, + remoteResource: this.remotePreviewResource, + }]; - const fileContent = await this.getLocalFileContent(); - - if (fileContent !== null) { - const formatUtils = await this.getFormattingOptions(); - // Remove ignored settings - const ignoredSettings = await this.getIgnoredSettings(); - const content = updateIgnoredSettings(fileContent.value.toString(), '{}', ignoredSettings, formatUtils); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasRemoteChanged: true, - hasLocalChanged: false, - hasConflicts: false, - isLastSyncFromCurrentMachine: false - })); - - await this.apply(true); - } - - // No local exists to push - else { - this.logService.info(`${this.syncResourceLogLabel}: Local settings does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing settings.`); - } finally { - this.setStatus(SyncStatus.Idle); - } + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasLocalChanged, + hasRemoteChanged, + hasConflicts, + resourcePreviews, + isLastSyncFromCurrentMachine: false + }; } - async hasLocalData(): Promise { - try { - const localFileContent = await this.getLocalFileContent(); - if (localFileContent) { - const formatUtils = await this.getFormattingOptions(); - const content = edit(localFileContent.value.toString(), [CONFIGURATION_SYNC_STORE_KEY], undefined, formatUtils); - return !isEmpty(content); - } - } catch (error) { - if ((error).fileOperationResult !== FileOperationResult.FILE_NOT_FOUND) { - return true; + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { + const fileContent = await this.getLocalFileContent(); + const formattingOptions = await this.getFormattingOptions(); + const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); + const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); + let lastSettingsSyncContent: ISettingsSyncContent | null = null; + if (lastSyncUserData === null) { + if (isLastSyncFromCurrentMachine) { + lastSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); } + } else { + lastSettingsSyncContent = this.getSettingsSyncContent(lastSyncUserData); } - return false; - } - async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { - return [{ resource: joinPath(uri, 'settings.json'), comparableResource: this.file }]; - } + let content: string | null = null; + let hasLocalChanged: boolean = false; + let hasRemoteChanged: boolean = false; + let hasConflicts: boolean = false; - async resolveContent(uri: URI): Promise { - if (isEqual(this.remotePreviewResource, uri)) { - return this.getConflictContent(uri); - } - let content = await super.resolveContent(uri); - if (content) { - return content; - } - content = await super.resolveContent(dirname(uri)); - if (content) { - const syncData = this.parseSyncData(content); - if (syncData) { - const settingsSyncContent = this.parseSettingsSyncContent(syncData.content); - if (settingsSyncContent) { - switch (basename(uri)) { - case 'settings.json': - return settingsSyncContent.settings; - } - } - } - } - return null; - } - - protected async getConflictContent(conflictResource: URI): Promise { - let content = await super.getConflictContent(conflictResource); - if (content !== null) { - const settingsSyncContent = this.parseSettingsSyncContent(content); - content = settingsSyncContent ? settingsSyncContent.settings : null; - } - if (content !== null) { - const formatUtils = await this.getFormattingOptions(); - // remove ignored settings from the remote content for preview + if (remoteSettingsSyncContent) { + const localContent: string = fileContent ? fileContent.value.toString() : '{}'; + this.validateContent(localContent); + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote settings with local settings...`); const ignoredSettings = await this.getIgnoredSettings(); - content = updateIgnoredSettings(content, '{}', ignoredSettings, formatUtils); + const result = merge(localContent, remoteSettingsSyncContent.settings, lastSettingsSyncContent ? lastSettingsSyncContent.settings : null, ignoredSettings, [], formattingOptions); + content = result.localContent || result.remoteContent; + hasLocalChanged = result.localContent !== null; + hasRemoteChanged = result.remoteContent !== null; + hasConflicts = result.hasConflicts; } - return content; + + // First time syncing to remote + else if (fileContent) { + this.logService.trace(`${this.syncResourceLogLabel}: Remote settings does not exist. Synchronizing settings for the first time.`); + content = fileContent.value.toString(); + hasRemoteChanged = true; + } + + if (content && !token.isCancellationRequested) { + // Remove the ignored settings from the preview. + const ignoredSettings = await this.getIgnoredSettings(); + const previewContent = updateIgnoredSettings(content, '{}', ignoredSettings, formattingOptions); + await this.fileService.writeFile(this.localPreviewResource, VSBuffer.fromString(previewContent)); + } + + this.setConflicts(hasConflicts && !token.isCancellationRequested ? [{ local: this.localPreviewResource, remote: this.remotePreviewResource }] : []); + const resourcePreviews: IResourcePreview[] = [{ + hasConflicts, + hasLocalChanged, + hasRemoteChanged, + localResouce: this.file, + remoteResource: this.remotePreviewResource, + previewResource: this.localPreviewResource + }]; + + return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts, isLastSyncFromCurrentMachine, resourcePreviews }; } - async acceptConflict(conflict: URI, content: string): Promise { - if (this.status === SyncStatus.HasConflicts - && (isEqual(this.localPreviewResource, conflict) || isEqual(this.remotePreviewResource, conflict)) - ) { - const preview = await this.syncPreviewResultPromise!; - this.cancel(); + protected async updatePreviewWithConflict(preview: IFileSyncPreview, conflictResource: URI, conflictContent: string, token: CancellationToken): Promise { + if (isEqual(this.localPreviewResource, conflictResource) || isEqual(this.remotePreviewResource, conflictResource)) { const formatUtils = await this.getFormattingOptions(); // Add ignored settings from local file content const ignoredSettings = await this.getIgnoredSettings(); - content = updateIgnoredSettings(content, preview.fileContent ? preview.fileContent.value.toString() : '{}', ignoredSettings, formatUtils); - this.syncPreviewResultPromise = createCancelablePromise(async () => ({ ...preview, content })); - await this.apply(true); - this.setStatus(SyncStatus.Idle); + const content = updateIgnoredSettings(conflictContent, preview.fileContent ? preview.fileContent.value.toString() : '{}', ignoredSettings, formatUtils); + preview = { ...preview, content, hasConflicts: false }; } + return preview; } - async resolveSettingsConflicts(resolvedConflicts: { key: string, value: any | undefined }[]): Promise { - if (this.status === SyncStatus.HasConflicts) { - const preview = await this.syncPreviewResultPromise!; - this.cancel(); - await this.performSync(preview.remoteUserData, preview.lastSyncUserData, resolvedConflicts); - } - } - - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: { key: string, value: any | undefined }[] = []): Promise { - try { - const result = await this.getPreview(remoteUserData, lastSyncUserData, resolvedConflicts); - if (result.hasConflicts) { - return SyncStatus.HasConflicts; - } - await this.apply(); - return SyncStatus.Idle; - } catch (e) { - this.syncPreviewResultPromise = null; - if (e instanceof UserDataSyncError) { - switch (e.code) { - case UserDataSyncErrorCode.LocalPreconditionFailed: - // Rejected as there is a new local version. Syncing again. - this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize settings as there is a new local version available. Synchronizing again...`); - return this.performSync(remoteUserData, lastSyncUserData, resolvedConflicts); - } - } - throw e; - } - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - const settingsSyncContent = this.parseSettingsSyncContent(syncData.content); - if (settingsSyncContent) { - const fileContent = await this.getLocalFileContent(); - const formatUtils = await this.getFormattingOptions(); - const ignoredSettings = await this.getIgnoredSettings(); - const content = updateIgnoredSettings(settingsSyncContent.settings, fileContent ? fileContent.value.toString() : '{}', ignoredSettings, formatUtils); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasLocalChanged: true, - hasRemoteChanged: true, - hasConflicts: false, - isLastSyncFromCurrentMachine: false - })); - - await this.apply(); - } - } - - private async apply(forcePush?: boolean): Promise { - if (!this.syncPreviewResultPromise) { - return; - } - - let { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged } = await this.syncPreviewResultPromise; + protected async applyPreview(preview: IFileSyncPreview, forcePush: boolean): Promise { + let { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged } = preview; if (content !== null) { @@ -329,64 +279,65 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser { this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized settings`); } - this.syncPreviewResultPromise = null; } - private getPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: { key: string, value: any }[] = []): Promise { - if (!this.syncPreviewResultPromise) { - this.syncPreviewResultPromise = createCancelablePromise(token => this.generatePreview(remoteUserData, lastSyncUserData, resolvedConflicts, token)); - } - return this.syncPreviewResultPromise; - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: { key: string, value: any }[] = [], token: CancellationToken = CancellationToken.None): Promise { - const fileContent = await this.getLocalFileContent(); - const formattingOptions = await this.getFormattingOptions(); - const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); - const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); - let lastSettingsSyncContent: ISettingsSyncContent | null = null; - if (lastSyncUserData === null) { - if (isLastSyncFromCurrentMachine) { - lastSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); + async hasLocalData(): Promise { + try { + const localFileContent = await this.getLocalFileContent(); + if (localFileContent) { + const formatUtils = await this.getFormattingOptions(); + const content = edit(localFileContent.value.toString(), [CONFIGURATION_SYNC_STORE_KEY], undefined, formatUtils); + return !isEmpty(content); + } + } catch (error) { + if ((error).fileOperationResult !== FileOperationResult.FILE_NOT_FOUND) { + return true; } - } else { - lastSettingsSyncContent = this.getSettingsSyncContent(lastSyncUserData); } + return false; + } - let content: string | null = null; - let hasLocalChanged: boolean = false; - let hasRemoteChanged: boolean = false; - let hasConflicts: boolean = false; + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { + return [{ resource: joinPath(uri, 'settings.json'), comparableResource: this.file }]; + } - if (remoteSettingsSyncContent) { - const localContent: string = fileContent ? fileContent.value.toString() : '{}'; - this.validateContent(localContent); - this.logService.trace(`${this.syncResourceLogLabel}: Merging remote settings with local settings...`); + async resolveContent(uri: URI): Promise { + if (isEqual(this.remotePreviewResource, uri)) { + return this.resolvePreviewContent(uri); + } + let content = await super.resolveContent(uri); + if (content) { + return content; + } + content = await super.resolveContent(dirname(uri)); + if (content) { + const syncData = this.parseSyncData(content); + if (syncData) { + const settingsSyncContent = this.parseSettingsSyncContent(syncData.content); + if (settingsSyncContent) { + switch (basename(uri)) { + case 'settings.json': + return settingsSyncContent.settings; + } + } + } + } + return null; + } + + protected async resolvePreviewContent(conflictResource: URI): Promise { + let content = await super.resolvePreviewContent(conflictResource); + if (content !== null) { + const settingsSyncContent = this.parseSettingsSyncContent(content); + content = settingsSyncContent ? settingsSyncContent.settings : null; + } + if (content !== null) { + const formatUtils = await this.getFormattingOptions(); + // remove ignored settings from the remote content for preview const ignoredSettings = await this.getIgnoredSettings(); - const result = merge(localContent, remoteSettingsSyncContent.settings, lastSettingsSyncContent ? lastSettingsSyncContent.settings : null, ignoredSettings, resolvedConflicts, formattingOptions); - content = result.localContent || result.remoteContent; - hasLocalChanged = result.localContent !== null; - hasRemoteChanged = result.remoteContent !== null; - hasConflicts = result.hasConflicts; + content = updateIgnoredSettings(content, '{}', ignoredSettings, formatUtils); } - - // First time syncing to remote - else if (fileContent) { - this.logService.trace(`${this.syncResourceLogLabel}: Remote settings does not exist. Synchronizing settings for the first time.`); - content = fileContent.value.toString(); - hasRemoteChanged = true; - } - - if (content && !token.isCancellationRequested) { - // Remove the ignored settings from the preview. - const ignoredSettings = await this.getIgnoredSettings(); - const previewContent = updateIgnoredSettings(content, '{}', ignoredSettings, formattingOptions); - await this.fileService.writeFile(this.localPreviewResource, VSBuffer.fromString(previewContent)); - } - - this.setConflicts(hasConflicts && !token.isCancellationRequested ? [{ local: this.localPreviewResource, remote: this.remotePreviewResource }] : []); - - return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts, isLastSyncFromCurrentMachine }; + return content; } private getSettingsSyncContent(remoteUserData: IRemoteUserData): ISettingsSyncContent | null { @@ -408,7 +359,7 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser { } private _defaultIgnoredSettings: Promise | undefined = undefined; - protected async getIgnoredSettings(content?: string): Promise { + private async getIgnoredSettings(content?: string): Promise { if (!this._defaultIgnoredSettings) { this._defaultIgnoredSettings = this.userDataSyncUtilService.resolveDefaultIgnoredSettings(); const disposable = Event.any( diff --git a/src/vs/platform/userDataSync/common/snippetsSync.ts b/src/vs/platform/userDataSync/common/snippetsSync.ts index b28535ea524..e73a65f5411 100644 --- a/src/vs/platform/userDataSync/common/snippetsSync.ts +++ b/src/vs/platform/userDataSync/common/snippetsSync.ts @@ -3,25 +3,25 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSynchroniser, SyncResource, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, Conflict, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, UserDataSyncError, UserDataSyncErrorCode, ISyncResourceHandle, ISyncPreviewResult } from 'vs/platform/userDataSync/common/userDataSync'; +import { + IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSynchroniser, SyncResource, IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, + Conflict, USER_DATA_SYNC_SCHEME, ISyncResourceHandle, IRemoteUserData, ISyncData, IResourcePreview +} from 'vs/platform/userDataSync/common/userDataSync'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService, FileChangesEvent, IFileStat, IFileContent, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { AbstractSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { AbstractSynchroniser, ISyncResourcePreview } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStringDictionary } from 'vs/base/common/collections'; import { URI } from 'vs/base/common/uri'; import { joinPath, extname, relativePath, isEqualOrParent, isEqual, basename, dirname } from 'vs/base/common/resources'; import { VSBuffer } from 'vs/base/common/buffer'; -import { merge } from 'vs/platform/userDataSync/common/snippetsMerge'; -import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; +import { merge, IMergeResult } from 'vs/platform/userDataSync/common/snippetsMerge'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IStorageService } from 'vs/platform/storage/common/storage'; -interface ISinppetsSyncPreviewResult extends ISyncPreviewResult { +interface ISinppetsSyncPreview extends ISyncResourcePreview { readonly local: IStringDictionary; - readonly remoteUserData: IRemoteUserData; - readonly lastSyncUserData: IRemoteUserData | null; readonly added: IStringDictionary; readonly updated: IStringDictionary; readonly removed: string[]; @@ -34,8 +34,6 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD protected readonly version: number = 1; private readonly snippetsFolder: URI; - private readonly snippetsPreviewFolder: URI; - private syncPreviewResultPromise: CancelablePromise | null = null; constructor( @IEnvironmentService environmentService: IEnvironmentService, @@ -45,12 +43,11 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IConfigurationService configurationService: IConfigurationService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, ) { - super(SyncResource.Snippets, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(SyncResource.Snippets, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); this.snippetsFolder = environmentService.snippetsHome; - this.snippetsPreviewFolder = joinPath(this.syncFolder, PREVIEW_DIR_NAME); this._register(this.fileService.watch(environmentService.userRoamingDataHome)); this._register(this.fileService.watch(this.snippetsFolder)); this._register(this.fileService.onDidFilesChange(e => this.onFileChanges(e))); @@ -60,247 +57,74 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD if (!e.changes.some(change => isEqualOrParent(change.resource, this.snippetsFolder))) { return; } - if (!this.isEnabled()) { - return; - } - // Sync again if local file has changed and current status is in conflicts - if (this.status === SyncStatus.HasConflicts) { - this.syncPreviewResultPromise!.then(result => { - this.cancel(); - this.doSync(result.remoteUserData, result.lastSyncUserData).then(status => this.setStatus(status)); - }); - } - // Otherwise fire change event - else { - this.triggerLocalChange(); - } + this.triggerLocalChange(); } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling snippets as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling snippets...`); - this.setStatus(SyncStatus.Syncing); - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - - if (remoteUserData.syncData !== null) { - const local = await this.getSnippetsFileContents(); - const localSnippets = this.toSnippetsContents(local); - const remoteSnippets = this.parseSnippets(remoteUserData.syncData); - const { added, updated, remote, removed } = merge(localSnippets, remoteSnippets, localSnippets); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - added, removed, updated, remote, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, - hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, - hasRemoteChanged: remote !== null, - isLastSyncFromCurrentMachine: false - })); - await this.apply(); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote snippets does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling snippets.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - } - - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing snippets as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing snippets...`); - this.setStatus(SyncStatus.Syncing); - + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + if (remoteUserData.syncData !== null) { const local = await this.getSnippetsFileContents(); const localSnippets = this.toSnippetsContents(local); - const { added, removed, updated, remote } = merge(localSnippets, null, null); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - added, removed, updated, remote, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, + const remoteSnippets = this.parseSnippets(remoteUserData.syncData); + const mergeResult = merge(localSnippets, remoteSnippets, localSnippets); + const { added, updated, remote, removed } = mergeResult; + return { + remoteUserData, lastSyncUserData, + added, removed, updated, remote, local, hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, hasRemoteChanged: remote !== null, - isLastSyncFromCurrentMachine: false - })); - - await this.apply(true); - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing snippets.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - - } - - async stop(): Promise { - await this.clearConflicts(); - this.cancel(); - this.logService.info(`${this.syncResourceLogLabel}: Stopped synchronizing ${this.syncResourceLogLabel}.`); - this.setStatus(SyncStatus.Idle); - } - - async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { - let content = await super.resolveContent(uri); - if (content) { - const syncData = this.parseSyncData(content); - if (syncData) { - const snippets = this.parseSnippets(syncData); - const result = []; - for (const snippet of Object.keys(snippets)) { - const resource = joinPath(uri, snippet); - const comparableResource = joinPath(this.snippetsFolder, snippet); - const exists = await this.fileService.exists(comparableResource); - result.push({ resource, comparableResource: exists ? comparableResource : undefined }); - } - return result; - } - } - return []; - } - - async resolveContent(uri: URI): Promise { - if (isEqualOrParent(uri.with({ scheme: this.syncFolder.scheme }), this.snippetsPreviewFolder)) { - return this.getConflictContent(uri); - } - let content = await super.resolveContent(uri); - if (content) { - return content; - } - content = await super.resolveContent(dirname(uri)); - if (content) { - const syncData = this.parseSyncData(content); - if (syncData) { - const snippets = this.parseSnippets(syncData); - return snippets[basename(uri)] || null; - } - } - return null; - } - - protected async getConflictContent(conflictResource: URI): Promise { - if (this.syncPreviewResultPromise) { - const result = await this.syncPreviewResultPromise; - const key = relativePath(this.snippetsPreviewFolder, conflictResource.with({ scheme: this.snippetsPreviewFolder.scheme }))!; - if (conflictResource.scheme === this.snippetsPreviewFolder.scheme) { - return result.local[key] ? result.local[key].value.toString() : null; - } else if (result.remoteUserData && result.remoteUserData.syncData) { - const snippets = this.parseSnippets(result.remoteUserData.syncData); - return snippets[key] || null; - } - } - return null; - } - - async acceptConflict(conflictResource: URI, content: string): Promise { - const conflict = this.conflicts.filter(({ local, remote }) => isEqual(local, conflictResource) || isEqual(remote, conflictResource))[0]; - if (this.status === SyncStatus.HasConflicts && conflict) { - const key = relativePath(this.snippetsPreviewFolder, conflict.local)!; - let previewResult = await this.syncPreviewResultPromise!; - this.cancel(); - previewResult.resolvedConflicts[key] = content || null; - this.syncPreviewResultPromise = createCancelablePromise(token => this.doGeneratePreview(previewResult.local, previewResult.remoteUserData, previewResult.lastSyncUserData, previewResult.resolvedConflicts, token)); - previewResult = await this.syncPreviewResultPromise; - this.setConflicts(previewResult.conflicts); - if (!this.conflicts.length) { - await this.apply(); - this.setStatus(SyncStatus.Idle); - } + conflicts: [], resolvedConflicts: {}, hasConflicts: false, + isLastSyncFromCurrentMachine: false, + resourcePreviews: this.getResourcePreviews(mergeResult) + }; + } else { + return { + remoteUserData, lastSyncUserData, + added: {}, removed: [], updated: {}, remote: null, local: {}, + hasLocalChanged: false, + hasRemoteChanged: false, + conflicts: [], resolvedConflicts: {}, hasConflicts: false, + isLastSyncFromCurrentMachine: false, + resourcePreviews: [] + }; } } - async hasLocalData(): Promise { - try { - const localSnippets = await this.getSnippetsFileContents(); - if (Object.keys(localSnippets).length) { - return true; - } - } catch (error) { - /* ignore error */ - } - return false; + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + const local = await this.getSnippetsFileContents(); + const localSnippets = this.toSnippetsContents(local); + const mergeResult = merge(localSnippets, null, null); + const { added, updated, remote, removed } = mergeResult; + return { + added, removed, updated, remote, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, + hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, + hasRemoteChanged: remote !== null, + isLastSyncFromCurrentMachine: false, + hasConflicts: false, + resourcePreviews: this.getResourcePreviews(mergeResult) + }; } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - try { - const previewResult = await this.getPreview(remoteUserData, lastSyncUserData); - this.setConflicts(previewResult.conflicts); - if (this.conflicts.length) { - return SyncStatus.HasConflicts; - } - await this.apply(); - return SyncStatus.Idle; - } catch (e) { - this.syncPreviewResultPromise = null; - if (e instanceof UserDataSyncError) { - switch (e.code) { - case UserDataSyncErrorCode.LocalPreconditionFailed: - // Rejected as there is a new local version. Syncing again. - this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize snippets as there is a new local version available. Synchronizing again...`); - return this.performSync(remoteUserData, lastSyncUserData); - } - } - throw e; - } - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { const local = await this.getSnippetsFileContents(); const localSnippets = this.toSnippetsContents(local); const snippets = this.parseSnippets(syncData); - const { added, updated, removed } = merge(localSnippets, snippets, localSnippets); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - added, removed, updated, remote: snippets, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, + const mergeResult = merge(localSnippets, snippets, localSnippets); + const { added, updated, removed } = mergeResult; + return { + added, removed, updated, remote: snippets, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, hasConflicts: false, hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, hasRemoteChanged: true, - isLastSyncFromCurrentMachine: false - })); - await this.apply(); + isLastSyncFromCurrentMachine: false, + resourcePreviews: this.getResourcePreviews(mergeResult) + }; } - protected getPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - if (!this.syncPreviewResultPromise) { - this.syncPreviewResultPromise = createCancelablePromise(token => this.generatePreview(remoteUserData, lastSyncUserData, token)); - } - return this.syncPreviewResultPromise; + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { + const local = await this.getSnippetsFileContents(); + return this.doGeneratePreview(local, remoteUserData, lastSyncUserData, {}, token); } - protected cancel(): void { - if (this.syncPreviewResultPromise) { - this.syncPreviewResultPromise.cancel(); - this.syncPreviewResultPromise = null; - } - } - - private async clearConflicts(): Promise { - if (this.conflicts.length) { - await Promise.all(this.conflicts.map(({ local }) => this.fileService.del(local))); - this.setConflicts([]); - } - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { - return this.getSnippetsFileContents() - .then(local => this.doGeneratePreview(local, remoteUserData, lastSyncUserData, {}, token)); - } - - private async doGeneratePreview(local: IStringDictionary, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: IStringDictionary = {}, token: CancellationToken = CancellationToken.None): Promise { + private async doGeneratePreview(local: IStringDictionary, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: IStringDictionary = {}, token: CancellationToken = CancellationToken.None): Promise { const localSnippets = this.toSnippetsContents(local); const remoteSnippets: IStringDictionary | null = remoteUserData.syncData ? this.parseSnippets(remoteUserData.syncData) : null; const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); @@ -321,10 +145,11 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD } const mergeResult = merge(localSnippets, remoteSnippets, lastSyncSnippets, resolvedConflicts); + const resourcePreviews = this.getResourcePreviews(mergeResult); const conflicts: Conflict[] = []; for (const key of mergeResult.conflicts) { - const localPreview = joinPath(this.snippetsPreviewFolder, key); + const localPreview = joinPath(this.syncPreviewFolder, key); conflicts.push({ local: localPreview, remote: localPreview.with({ scheme: USER_DATA_SYNC_SCHEME }) }); const content = local[key]; if (!token.isCancellationRequested) { @@ -344,6 +169,8 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD } } + this.setConflicts(conflicts); + return { remoteUserData, local, lastSyncUserData, @@ -351,20 +178,28 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD removed: mergeResult.removed, updated: mergeResult.updated, conflicts, + hasConflicts: conflicts.length > 0, remote: mergeResult.remote, resolvedConflicts, hasLocalChanged: Object.keys(mergeResult.added).length > 0 || mergeResult.removed.length > 0 || Object.keys(mergeResult.updated).length > 0, hasRemoteChanged: mergeResult.remote !== null, - isLastSyncFromCurrentMachine + isLastSyncFromCurrentMachine, + resourcePreviews }; } - private async apply(forcePush?: boolean): Promise { - if (!this.syncPreviewResultPromise) { - return; + protected async updatePreviewWithConflict(preview: ISinppetsSyncPreview, conflictResource: URI, content: string, token: CancellationToken): Promise { + const conflict = this.conflicts.filter(({ local, remote }) => isEqual(local, conflictResource) || isEqual(remote, conflictResource))[0]; + if (conflict) { + const key = relativePath(this.syncPreviewFolder, conflict.local)!; + preview.resolvedConflicts[key] = content || null; + preview = await this.doGeneratePreview(preview.local, preview.remoteUserData, preview.lastSyncUserData, preview.resolvedConflicts, token); } + return preview; + } - let { added, removed, updated, local, remote, remoteUserData, lastSyncUserData, hasLocalChanged, hasRemoteChanged } = await this.syncPreviewResultPromise; + protected async applyPreview(preview: ISinppetsSyncPreview, forcePush: boolean): Promise { + let { added, removed, updated, local, remote, remoteUserData, lastSyncUserData, hasLocalChanged, hasRemoteChanged } = preview; if (!hasLocalChanged && !hasRemoteChanged) { this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing snippets.`); @@ -391,7 +226,123 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized snippets`); } - this.syncPreviewResultPromise = null; + } + + private getResourcePreviews(mergeResult: IMergeResult): IResourcePreview[] { + const resourcePreviews: IResourcePreview[] = []; + for (const key of Object.keys(mergeResult.added)) { + resourcePreviews.push({ + remoteResource: joinPath(this.syncPreviewFolder, key).with({ scheme: USER_DATA_SYNC_SCHEME }), + hasConflicts: false, + hasLocalChanged: true, + hasRemoteChanged: false + }); + } + for (const key of Object.keys(mergeResult.updated)) { + resourcePreviews.push({ + remoteResource: joinPath(this.syncPreviewFolder, key).with({ scheme: USER_DATA_SYNC_SCHEME }), + localResouce: joinPath(this.snippetsFolder, key), + hasConflicts: false, + hasLocalChanged: true, + hasRemoteChanged: true + }); + } + for (const key of mergeResult.removed) { + resourcePreviews.push({ + localResouce: joinPath(this.snippetsFolder, key), + hasConflicts: false, + hasLocalChanged: true, + hasRemoteChanged: false + }); + } + for (const key of mergeResult.conflicts) { + resourcePreviews.push({ + localResouce: joinPath(this.snippetsFolder, key), + remoteResource: joinPath(this.syncPreviewFolder, key).with({ scheme: USER_DATA_SYNC_SCHEME }), + previewResource: joinPath(this.syncPreviewFolder, key), + hasConflicts: true, + hasLocalChanged: true, + hasRemoteChanged: true + }); + } + + return resourcePreviews; + } + + async stop(): Promise { + await this.clearConflicts(); + return super.stop(); + } + + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { + let content = await super.resolveContent(uri); + if (content) { + const syncData = this.parseSyncData(content); + if (syncData) { + const snippets = this.parseSnippets(syncData); + const result = []; + for (const snippet of Object.keys(snippets)) { + const resource = joinPath(uri, snippet); + const comparableResource = joinPath(this.snippetsFolder, snippet); + const exists = await this.fileService.exists(comparableResource); + result.push({ resource, comparableResource: exists ? comparableResource : undefined }); + } + return result; + } + } + return []; + } + + async resolveContent(uri: URI): Promise { + if (isEqualOrParent(uri.with({ scheme: this.syncFolder.scheme }), this.syncPreviewFolder)) { + return this.resolvePreviewContent(uri); + } + let content = await super.resolveContent(uri); + if (content) { + return content; + } + content = await super.resolveContent(dirname(uri)); + if (content) { + const syncData = this.parseSyncData(content); + if (syncData) { + const snippets = this.parseSnippets(syncData); + return snippets[basename(uri)] || null; + } + } + return null; + } + + private async resolvePreviewContent(conflictResource: URI): Promise { + const syncPreview = await this.getSyncPreviewInProgress(); + if (syncPreview) { + const key = relativePath(this.syncPreviewFolder, conflictResource.with({ scheme: this.syncPreviewFolder.scheme }))!; + if (conflictResource.scheme === this.syncPreviewFolder.scheme) { + return (syncPreview as ISinppetsSyncPreview).local[key] ? (syncPreview as ISinppetsSyncPreview).local[key].value.toString() : null; + } else if (syncPreview.remoteUserData && syncPreview.remoteUserData.syncData) { + const snippets = this.parseSnippets(syncPreview.remoteUserData.syncData); + return snippets[key] || null; + } + } + return null; + } + + async hasLocalData(): Promise { + try { + const localSnippets = await this.getSnippetsFileContents(); + if (Object.keys(localSnippets).length) { + return true; + } + } catch (error) { + /* ignore error */ + } + return false; + } + + private async clearConflicts(): Promise { + if (this.conflicts.length) { + await Promise.all(this.conflicts.map(({ local }) => this.fileService.del(local))); + this.setConflicts([]); + } } private async updateLocalSnippets(added: IStringDictionary, removed: string[], updated: IStringDictionary, local: IStringDictionary): Promise { diff --git a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts index 5f0a3f2bb70..cb5c8d665f7 100644 --- a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts @@ -3,20 +3,73 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Delayer, disposableTimeout } from 'vs/base/common/async'; +import { Delayer, disposableTimeout, CancelablePromise, createCancelablePromise, timeout } from 'vs/base/common/async'; import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, toDisposable, MutableDisposable, IDisposable } from 'vs/base/common/lifecycle'; -import { IUserDataSyncLogService, IUserDataSyncService, IUserDataAutoSyncService, UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncEnablementService, ALL_SYNC_RESOURCES, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncLogService, IUserDataSyncService, IUserDataAutoSyncService, UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, UserDataAutoSyncError } from 'vs/platform/userDataSync/common/userDataSync'; import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { isPromiseCanceledError } from 'vs/base/common/errors'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IStorageService, StorageScope, IWorkspaceStorageChangeEvent } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; +import { localize } from 'vs/nls'; type AutoSyncClassification = { sources: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; }; -export const RESOURCE_ENABLEMENT_SOURCE = 'resourceEnablement'; +type AutoSyncEnablementClassification = { + enabled?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; +}; -export class UserDataAutoSyncService extends Disposable implements IUserDataAutoSyncService { +type AutoSyncErrorClassification = { + code: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; +}; + +const enablementKey = 'sync.enable'; +const disableMachineEventuallyKey = 'sync.disableMachineEventually'; +const sessionIdKey = 'sync.sessionId'; + +export class UserDataAutoSyncEnablementService extends Disposable { + + private _onDidChangeEnablement = new Emitter(); + readonly onDidChangeEnablement: Event = this._onDidChangeEnablement.event; + + constructor( + @IStorageService protected readonly storageService: IStorageService, + @IEnvironmentService private readonly environmentService: IEnvironmentService + ) { + super(); + this._register(storageService.onDidChangeStorage(e => this.onDidStorageChange(e))); + } + + isEnabled(): boolean { + switch (this.environmentService.sync) { + case 'on': + return true; + case 'off': + return false; + } + return this.storageService.getBoolean(enablementKey, StorageScope.GLOBAL, this.environmentService.enableSyncByDefault); + } + + canToggleEnablement(): boolean { + return this.environmentService.sync === undefined; + } + + private onDidStorageChange(workspaceStorageChangeEvent: IWorkspaceStorageChangeEvent): void { + if (workspaceStorageChangeEvent.scope === StorageScope.GLOBAL) { + if (enablementKey === workspaceStorageChangeEvent.key) { + this._onDidChangeEnablement.fire(this.isEnabled()); + } + } + } + +} + +export class UserDataAutoSyncService extends UserDataAutoSyncEnablementService implements IUserDataAutoSyncService { _serviceBrand: any; @@ -28,21 +81,34 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto private readonly _onError: Emitter = this._register(new Emitter()); readonly onError: Event = this._onError.event; + private readonly _onTurnOnSync: Emitter = this._register(new Emitter()); + readonly onTurnOnSync: Event = this._onTurnOnSync.event; + + private readonly _onDidTurnOnSync: Emitter = this._register(new Emitter()); + readonly onDidTurnOnSync: Event = this._onDidTurnOnSync.event; + constructor( - @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncStoreService private readonly userDataSyncStoreService: IUserDataSyncStoreService, + @IUserDataSyncResourceEnablementService private readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, @IUserDataSyncLogService private readonly logService: IUserDataSyncLogService, - @IUserDataSyncAccountService private readonly authTokenService: IUserDataSyncAccountService, - @ITelemetryService private readonly telemetryService: ITelemetryService + @IUserDataSyncAccountService private readonly userDataSyncAccountService: IUserDataSyncAccountService, + @ITelemetryService private readonly telemetryService: ITelemetryService, + @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, + @IStorageService storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService ) { - super(); + super(storageService, environmentService); this.syncTriggerDelayer = this._register(new Delayer(0)); if (userDataSyncStoreService.userDataSyncStore) { this.updateAutoSync(); - this._register(Event.any(authTokenService.onDidChangeAccount, this.userDataSyncEnablementService.onDidChangeEnablement)(() => this.updateAutoSync())); - this._register(Event.filter(this.userDataSyncEnablementService.onDidChangeResourceEnablement, ([, enabled]) => enabled)(() => this.triggerAutoSync([RESOURCE_ENABLEMENT_SOURCE]))); + if (this.hasToDisableMachineEventually()) { + this.disableMachineEventually(); + } + this._register(userDataSyncAccountService.onDidChangeAccount(() => this.updateAutoSync())); + this._register(Event.debounce(userDataSyncService.onDidChangeLocal, (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerSync(sources, false))); + this._register(Event.filter(this.userDataSyncResourceEnablementService.onDidChangeResourceEnablement, ([, enabled]) => enabled)(() => this.triggerSync(['resourceEnablement'], false))); } } @@ -50,7 +116,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto const { enabled, reason } = this.isAutoSyncEnabled(); if (enabled) { if (this.autoSync.value === undefined) { - this.autoSync.value = new AutoSync(1000 * 60 * 5 /* 5 miutes */, this.userDataSyncService, this.logService); + this.autoSync.value = new AutoSync(1000 * 60 * 5 /* 5 miutes */, this.userDataSyncStoreService, this.userDataSyncService, this.userDataSyncMachinesService, this.logService, this.storageService); this.autoSync.value.register(this.autoSync.value.onDidStartSync(() => this.lastSyncTriggerTime = new Date().getTime())); this.autoSync.value.register(this.autoSync.value.onDidFinishSync(e => this.onDidFinishSync(e))); if (this.startAutoSync()) { @@ -66,29 +132,78 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto } } - enable(): void { - this.userDataSyncEnablementService.setEnablement(true); - this.updateAutoSync(); - } - - disable(): void { - this.userDataSyncEnablementService.setEnablement(false); - this.updateAutoSync(); - } - // For tests purpose only protected startAutoSync(): boolean { return true; } private isAutoSyncEnabled(): { enabled: boolean, reason?: string } { - if (!this.userDataSyncEnablementService.isEnabled()) { + if (!this.isEnabled()) { return { enabled: false, reason: 'sync is disabled' }; } - if (!this.authTokenService.account) { + if (!this.userDataSyncAccountService.account) { return { enabled: false, reason: 'token is not avaialable' }; } return { enabled: true }; } + async turnOn(pullFirst: boolean): Promise { + this._onTurnOnSync.fire(); + + try { + this.stopDisableMachineEventually(); + + if (pullFirst) { + await this.userDataSyncService.pull(); + } else { + await this.userDataSyncService.sync(); + } + + this.setEnablement(true); + this._onDidTurnOnSync.fire(undefined); + } catch (error) { + this._onDidTurnOnSync.fire(error); + throw error; + } + } + + async turnOff(everywhere: boolean, softTurnOffOnError?: boolean, donotRemoveMachine?: boolean): Promise { + try { + + // Remove machine + if (this.userDataSyncAccountService.account && !donotRemoveMachine) { + await this.userDataSyncMachinesService.removeCurrentMachine(); + } + + // Disable Auto Sync + this.setEnablement(false); + + // Reset Session + this.storageService.remove(sessionIdKey, StorageScope.GLOBAL); + + // Reset + if (everywhere) { + this.telemetryService.publicLog2('sync/turnOffEveryWhere'); + await this.userDataSyncService.reset(); + } else { + await this.userDataSyncService.resetLocal(); + } + } catch (error) { + if (softTurnOffOnError) { + this.logService.error(error); + this.setEnablement(false); + } else { + throw error; + } + } + } + + private setEnablement(enabled: boolean): void { + if (this.isEnabled() !== enabled) { + this.telemetryService.publicLog2<{ enabled: boolean }, AutoSyncEnablementClassification>(enablementKey, { enabled }); + this.storageService.store(enablementKey, enabled, StorageScope.GLOBAL); + this.updateAutoSync(); + } + } + private async onDidFinishSync(error: Error | undefined): Promise { if (!error) { // Sync finished without errors @@ -98,35 +213,74 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto // Error while syncing const userDataSyncError = UserDataSyncError.toUserDataSyncError(error); - if (userDataSyncError.code === UserDataSyncErrorCode.TurnedOff || userDataSyncError.code === UserDataSyncErrorCode.SessionExpired) { - this.logService.info('Auto Sync: Sync is turned off in the cloud.'); - await this.userDataSyncService.resetLocal(); - this.disable(); + + // Log to telemetry + if (userDataSyncError instanceof UserDataAutoSyncError) { + this.telemetryService.publicLog2<{ code: string }, AutoSyncErrorClassification>(`autosync/error`, { code: userDataSyncError.code }); + } + + // Session got expired + if (userDataSyncError.code === UserDataSyncErrorCode.SessionExpired) { + await this.turnOff(false, true /* force soft turnoff on error */); + this.logService.info('Auto Sync: Turned off sync because current session is expired'); + } + + // Turned off from another device + if (userDataSyncError.code === UserDataSyncErrorCode.TurnedOff) { + await this.turnOff(false, true /* force soft turnoff on error */); this.logService.info('Auto Sync: Turned off sync because sync is turned off in the cloud'); - } else if (userDataSyncError.code === UserDataSyncErrorCode.LocalTooManyRequests) { - this.disable(); + } + + // Exceeded Rate Limit + else if (userDataSyncError.code === UserDataSyncErrorCode.LocalTooManyRequests || userDataSyncError.code === UserDataSyncErrorCode.TooManyRequests) { + await this.turnOff(false, true /* force soft turnoff on error */, + true /* do not disable machine because disabling a machine makes request to server and can fail with TooManyRequests */); + this.disableMachineEventually(); this.logService.info('Auto Sync: Turned off sync because of making too many requests to server'); - } else { + } + + else { this.logService.error(userDataSyncError); this.successiveFailures++; } + this._onError.fire(userDataSyncError); } + private async disableMachineEventually(): Promise { + this.storageService.store(disableMachineEventuallyKey, true, StorageScope.GLOBAL); + await timeout(1000 * 60 * 10); + + // Return if got stopped meanwhile. + if (!this.hasToDisableMachineEventually()) { + return; + } + + this.stopDisableMachineEventually(); + + // disable only if sync is disabled + if (!this.isEnabled() && this.userDataSyncAccountService.account) { + await this.userDataSyncMachinesService.removeCurrentMachine(); + } + } + + private hasToDisableMachineEventually(): boolean { + return this.storageService.getBoolean(disableMachineEventuallyKey, StorageScope.GLOBAL, false); + } + + private stopDisableMachineEventually(): void { + this.storageService.remove(disableMachineEventuallyKey, StorageScope.GLOBAL); + } + private sources: string[] = []; - async triggerAutoSync(sources: string[]): Promise { + async triggerSync(sources: string[], skipIfSyncedRecently: boolean): Promise { if (this.autoSync.value === undefined) { return this.syncTriggerDelayer.cancel(); } - /* - If sync is not triggered by sync resource (triggered by other sources like window focus etc.,) or by resource enablement - then limit sync to once per 10s - */ - const hasToLimitSync = sources.indexOf(RESOURCE_ENABLEMENT_SOURCE) === -1 && ALL_SYNC_RESOURCES.every(syncResource => sources.indexOf(syncResource) === -1); - if (hasToLimitSync && this.lastSyncTriggerTime + if (skipIfSyncedRecently && this.lastSyncTriggerTime && Math.round((new Date().getTime() - this.lastSyncTriggerTime) / 1000) < 10) { - this.logService.debug('Auto Sync Skipped: Limited to once per 10 seconds.'); + this.logService.debug('Auto Sync: Skipped. Limited to once per 10 seconds.'); return; } @@ -162,10 +316,15 @@ class AutoSync extends Disposable { private readonly _onDidFinishSync = this._register(new Emitter()); readonly onDidFinishSync = this._onDidFinishSync.event; + private syncPromise: CancelablePromise | undefined; + constructor( private readonly interval: number /* in milliseconds */, + private readonly userDataSyncStoreService: IUserDataSyncStoreService, private readonly userDataSyncService: IUserDataSyncService, + private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, private readonly logService: IUserDataSyncLogService, + private readonly storageService: IStorageService, ) { super(); } @@ -173,6 +332,11 @@ class AutoSync extends Disposable { start(): void { this._register(this.onDidFinishSync(() => this.waitUntilNextIntervalAndSync())); this._register(toDisposable(() => { + if (this.syncPromise) { + this.syncPromise.cancel(); + this.logService.info('Auto sync: Canelled sync that is in progress'); + this.syncPromise = undefined; + } this.userDataSyncService.stop(); this.logService.info('Auto Sync: Stopped'); })); @@ -184,16 +348,87 @@ class AutoSync extends Disposable { this.intervalHandler.value = disposableTimeout(() => this.sync(AutoSync.INTERVAL_SYNCING), this.interval); } - async sync(reason: string): Promise { + sync(reason: string): Promise { + const syncPromise = createCancelablePromise(async token => { + if (this.syncPromise) { + try { + // Wait until existing sync is finished + this.logService.debug('Auto Sync: Waiting until sync is finished.'); + await this.syncPromise; + } catch (error) { + if (isPromiseCanceledError(error)) { + // Cancelled => Disposed. Donot continue sync. + return; + } + } + } + return this.doSync(reason, token); + }); + this.syncPromise = syncPromise; + this.syncPromise.finally(() => this.syncPromise = undefined); + return this.syncPromise; + } + + private async doSync(reason: string, token: CancellationToken): Promise { this.logService.info(`Auto Sync: Triggered by ${reason}`); this._onDidStartSync.fire(); let error: Error | undefined; try { - await this.userDataSyncService.sync(); + const syncTask = await this.userDataSyncService.createSyncTask(); + let manifest = syncTask.manifest; + + // Server has no data but this machine was synced before + if (manifest === null && await this.userDataSyncService.hasPreviouslySynced()) { + // Sync was turned off in the cloud + throw new UserDataAutoSyncError(localize('turned off', "Cannot sync because syncing is turned off in the cloud"), UserDataSyncErrorCode.TurnedOff); + } + + const sessionId = this.storageService.get(sessionIdKey, StorageScope.GLOBAL); + // Server session is different from client session + if (sessionId && manifest && sessionId !== manifest.session) { + throw new UserDataAutoSyncError(localize('session expired', "Cannot sync because current session is expired"), UserDataSyncErrorCode.SessionExpired); + } + + const machines = await this.userDataSyncMachinesService.getMachines(manifest || undefined); + // Return if cancellation is requested + if (token.isCancellationRequested) { + return; + } + + const currentMachine = machines.find(machine => machine.isCurrent); + // Check if sync was turned off from other machine + if (currentMachine?.disabled) { + // Throw TurnedOff error + throw new UserDataAutoSyncError(localize('turned off machine', "Cannot sync because syncing is turned off on this machine from another machine."), UserDataSyncErrorCode.TurnedOff); + } + + await syncTask.run(token); + + // After syncing, get the manifest if it was not available before + if (manifest === null) { + manifest = await this.userDataSyncStoreService.manifest(); + } + + // Update local session id + if (manifest && manifest.session !== sessionId) { + this.storageService.store(sessionIdKey, manifest.session, StorageScope.GLOBAL); + } + + // Return if cancellation is requested + if (token.isCancellationRequested) { + return; + } + + // Add current machine + if (!currentMachine) { + await this.userDataSyncMachinesService.addCurrentMachine(manifest || undefined); + } + } catch (e) { this.logService.error(e); error = e; } + this._onDidFinishSync.fire(error); } diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index 8290cc50bc5..2183252b50d 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -22,6 +22,8 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IProductService, ConfigurationSyncStore } from 'vs/platform/product/common/productService'; import { distinct } from 'vs/base/common/arrays'; import { isArray, isString, isObject } from 'vs/base/common/types'; +import { IHeaders } from 'vs/base/parts/request/common/request'; +import { CancellationToken } from 'vs/base/common/cancellation'; export const CONFIGURATION_SYNC_STORE_KEY = 'configurationSync.store'; @@ -162,16 +164,20 @@ export type ServerResource = SyncResource | 'machines'; export interface IUserDataSyncStoreService { readonly _serviceBrand: undefined; readonly userDataSyncStore: IUserDataSyncStore | undefined; + readonly onTokenFailed: Event; readonly onTokenSucceed: Event; setAuthToken(token: string, type: string): void; - read(resource: ServerResource, oldValue: IUserData | null): Promise; - write(resource: ServerResource, content: string, ref: string | null): Promise; - manifest(): Promise; + + // Sync requests + manifest(headers?: IHeaders): Promise; + read(resource: ServerResource, oldValue: IUserData | null, headers?: IHeaders): Promise; + write(resource: ServerResource, content: string, ref: string | null, headers?: IHeaders): Promise; clear(): Promise; + delete(resource: ServerResource): Promise; + getAllRefs(resource: ServerResource): Promise; resolveContent(resource: ServerResource, ref: string): Promise; - delete(resource: ServerResource): Promise; } export const IUserDataSyncBackupStoreService = createDecorator('IUserDataSyncBackupStoreService'); @@ -218,7 +224,7 @@ export class UserDataSyncError extends Error { } static toUserDataSyncError(error: Error): UserDataSyncError { - if (error instanceof UserDataSyncStoreError) { + if (error instanceof UserDataSyncError) { return error; } const match = /^(.+) \(UserDataSyncError\) (.+)?$/.exec(error.name); @@ -236,6 +242,12 @@ export class UserDataSyncStoreError extends UserDataSyncError { } } +export class UserDataAutoSyncError extends UserDataSyncError { + constructor(message: string, code: UserDataSyncErrorCode) { + super(message, code); + } +} + //#endregion // #region User Data Synchroniser @@ -270,10 +282,32 @@ export interface ISyncResourceHandle { export type Conflict = { remote: URI, local: URI }; -export interface ISyncPreviewResult { +export interface IRemoteUserData { + ref: string; + syncData: ISyncData | null; +} + +export interface ISyncData { + version: number; + machineId?: string; + content: string; +} + +export interface IResourcePreview { + readonly remoteResource?: URI; + readonly localResouce?: URI; + readonly previewResource?: URI; + readonly hasLocalChanged: boolean; + readonly hasRemoteChanged: boolean; + readonly hasConflicts: boolean; +} + +export interface ISyncResourcePreview { readonly isLastSyncFromCurrentMachine: boolean; readonly hasLocalChanged: boolean; readonly hasRemoteChanged: boolean; + readonly hasConflicts: boolean; + readonly resourcePreviews: IResourcePreview[]; } export interface IUserDataSynchroniser { @@ -287,11 +321,11 @@ export interface IUserDataSynchroniser { pull(): Promise; push(): Promise; - sync(manifest: IUserDataManifest | null): Promise; + sync(manifest: IUserDataManifest | null, headers?: IHeaders): Promise; replace(uri: URI): Promise; stop(): Promise; - getSyncPreview(): Promise + generateSyncPreview(): Promise hasPreviouslySynced(): Promise hasLocalData(): Promise; resetLocal(): Promise; @@ -309,29 +343,29 @@ export interface IUserDataSynchroniser { // #region User Data Sync Services -export const IUserDataSyncEnablementService = createDecorator('IUserDataSyncEnablementService'); -export interface IUserDataSyncEnablementService { +export const IUserDataSyncResourceEnablementService = createDecorator('IUserDataSyncResourceEnablementService'); +export interface IUserDataSyncResourceEnablementService { _serviceBrand: any; - readonly onDidChangeEnablement: Event; readonly onDidChangeResourceEnablement: Event<[SyncResource, boolean]>; - - isEnabled(): boolean; - setEnablement(enabled: boolean): void; - canToggleEnablement(): boolean; - isResourceEnabled(resource: SyncResource): boolean; setResourceEnablement(resource: SyncResource, enabled: boolean): void; } export type SyncResourceConflicts = { syncResource: SyncResource, conflicts: Conflict[] }; +export interface ISyncTask { + manifest: IUserDataManifest | null; + run(token: CancellationToken): Promise; +} + export const IUserDataSyncService = createDecorator('IUserDataSyncService'); export interface IUserDataSyncService { _serviceBrand: any; readonly status: SyncStatus; readonly onDidChangeStatus: Event; + readonly onSynchronizeResource: Event; readonly conflicts: SyncResourceConflicts[]; readonly onDidChangeConflicts: Event; @@ -349,7 +383,10 @@ export interface IUserDataSyncService { reset(): Promise; resetLocal(): Promise; + createSyncTask(): Promise + isFirstTimeSyncingWithAnotherMachine(): Promise; + hasPreviouslySynced(): Promise; resolveContent(resource: URI): Promise; acceptConflict(conflictResource: URI, content: string): Promise; @@ -362,10 +399,15 @@ export interface IUserDataSyncService { export const IUserDataAutoSyncService = createDecorator('IUserDataAutoSyncService'); export interface IUserDataAutoSyncService { _serviceBrand: any; + readonly onTurnOnSync: Event + readonly onDidTurnOnSync: Event readonly onError: Event; - enable(): void; - disable(): void; - triggerAutoSync(sources: string[]): Promise; + readonly onDidChangeEnablement: Event; + isEnabled(): boolean; + canToggleEnablement(): boolean; + turnOn(pullFirst: boolean): Promise; + turnOff(everywhere: boolean): Promise; + triggerSync(sources: string[], hasToLimitSync: boolean): Promise; } export const IUserDataSyncUtilService = createDecorator('IUserDataSyncUtilService'); diff --git a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts index 1e82668fdca..33a87aa165c 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts @@ -22,6 +22,7 @@ export class UserDataSyncChannel implements IServerChannel { listen(_: unknown, event: string): Event { switch (event) { case 'onDidChangeStatus': return this.service.onDidChangeStatus; + case 'onSynchronizeResource': return this.service.onSynchronizeResource; case 'onDidChangeConflicts': return this.service.onDidChangeConflicts; case 'onDidChangeLocal': return this.service.onDidChangeLocal; case 'onDidChangeLastSyncTime': return this.service.onDidChangeLastSyncTime; @@ -49,6 +50,7 @@ export class UserDataSyncChannel implements IServerChannel { case 'replace': return this.service.replace(URI.revive(args[0])); case 'reset': return this.service.reset(); case 'resetLocal': return this.service.resetLocal(); + case 'hasPreviouslySynced': return this.service.hasPreviouslySynced(); case 'isFirstTimeSyncingWithAnotherMachine': return this.service.isFirstTimeSyncingWithAnotherMachine(); case 'acceptConflict': return this.service.acceptConflict(URI.revive(args[0]), args[1]); case 'resolveContent': return this.service.resolveContent(URI.revive(args[0])); @@ -67,6 +69,8 @@ export class UserDataAutoSyncChannel implements IServerChannel { listen(_: unknown, event: string): Event { switch (event) { + case 'onTurnOnSync': return this.service.onTurnOnSync; + case 'onDidTurnOnSync': return this.service.onDidTurnOnSync; case 'onError': return this.service.onError; } throw new Error(`Event not found: ${event}`); @@ -74,9 +78,9 @@ export class UserDataAutoSyncChannel implements IServerChannel { call(context: any, command: string, args?: any): Promise { switch (command) { - case 'triggerAutoSync': return this.service.triggerAutoSync(args[0]); - case 'enable': return Promise.resolve(this.service.enable()); - case 'disable': return Promise.resolve(this.service.disable()); + case 'triggerSync': return this.service.triggerSync(args[0], args[1]); + case 'turnOn': return this.service.turnOn(args[0]); + case 'turnOff': return this.service.turnOff(args[0]); } throw new Error('Invalid call'); } @@ -180,10 +184,10 @@ export class UserDataSyncMachinesServiceChannel implements IServerChannel { async call(context: any, command: string, args?: any): Promise { switch (command) { case 'getMachines': return this.service.getMachines(); - case 'addCurrentMachine': return this.service.addCurrentMachine(args[0]); + case 'addCurrentMachine': return this.service.addCurrentMachine(); case 'removeCurrentMachine': return this.service.removeCurrentMachine(); case 'renameMachine': return this.service.renameMachine(args[0], args[1]); - case 'disableMachine': return this.service.disableMachine(args[0]); + case 'setEnablement': return this.service.setEnablement(args[0], args[1]); } throw new Error('Invalid call'); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncMachines.ts b/src/vs/platform/userDataSync/common/userDataSyncMachines.ts index e52d8658793..0bd7cd93992 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncMachines.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncMachines.ts @@ -8,10 +8,12 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; -import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IUserDataSyncStoreService, IUserData, IUserDataSyncLogService, IUserDataManifest } from 'vs/platform/userDataSync/common/userDataSync'; import { localize } from 'vs/nls'; import { IProductService } from 'vs/platform/product/common/productService'; +import { PlatformToString, isWeb, Platform, platform } from 'vs/base/common/platform'; +import { escapeRegExpCharacters } from 'vs/base/common/strings'; interface IMachineData { id: string; @@ -26,20 +28,20 @@ interface IMachinesData { export type IUserDataSyncMachine = Readonly & { readonly isCurrent: boolean }; - export const IUserDataSyncMachinesService = createDecorator('IUserDataSyncMachinesService'); export interface IUserDataSyncMachinesService { _serviceBrand: any; getMachines(manifest?: IUserDataManifest): Promise; - addCurrentMachine(name: string, manifest?: IUserDataManifest): Promise; + addCurrentMachine(manifest?: IUserDataManifest): Promise; removeCurrentMachine(manifest?: IUserDataManifest): Promise; - renameMachine(machineId: string, name: string): Promise; - disableMachine(machineId: string): Promise + setEnablement(machineId: string, enabled: boolean): Promise; } +const currentMachineNameKey = 'sync.currentMachineName'; + export class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMachinesService { private static readonly VERSION = 1; @@ -53,7 +55,7 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData constructor( @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, - @IStorageService storageService: IStorageService, + @IStorageService private readonly storageService: IStorageService, @IUserDataSyncStoreService private readonly userDataSyncStoreService: IUserDataSyncStoreService, @IUserDataSyncLogService private readonly logService: IUserDataSyncLogService, @IProductService private readonly productService: IProductService, @@ -68,16 +70,13 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData return machineData.machines.map(machine => ({ ...machine, ...{ isCurrent: machine.id === currentMachineId } })); } - async addCurrentMachine(name: string, manifest?: IUserDataManifest): Promise { + async addCurrentMachine(manifest?: IUserDataManifest): Promise { const currentMachineId = await this.currentMachineIdPromise; const machineData = await this.readMachinesData(manifest); - let currentMachine = machineData.machines.find(({ id }) => id === currentMachineId); - if (currentMachine) { - currentMachine.name = name; - } else { - machineData.machines.push({ id: currentMachineId, name }); + if (!machineData.machines.some(({ id }) => id === currentMachineId)) { + machineData.machines.push({ id: currentMachineId, name: this.computeCurrentMachineName(machineData.machines) }); + await this.writeMachinesData(machineData); } - await this.writeMachinesData(machineData); } async removeCurrentMachine(manifest?: IUserDataManifest): Promise { @@ -91,21 +90,42 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData } async renameMachine(machineId: string, name: string, manifest?: IUserDataManifest): Promise { + const currentMachineId = await this.currentMachineIdPromise; const machineData = await this.readMachinesData(manifest); - const currentMachine = machineData.machines.find(({ id }) => id === machineId); - if (currentMachine) { - currentMachine.name = name; + const machine = machineData.machines.find(({ id }) => id === machineId); + if (machine) { + machine.name = name; + await this.writeMachinesData(machineData); + if (machineData.machines.some(({ id }) => id === currentMachineId)) { + this.storageService.store(currentMachineNameKey, name, StorageScope.GLOBAL); + } + } + } + + async setEnablement(machineId: string, enabled: boolean): Promise { + const machineData = await this.readMachinesData(); + const machine = machineData.machines.find(({ id }) => id === machineId); + if (machine) { + machine.disabled = enabled ? undefined : true; await this.writeMachinesData(machineData); } } - async disableMachine(machineId: string): Promise { - const machineData = await this.readMachinesData(); - const machine = machineData.machines.find(({ id }) => id === machineId); - if (machine) { - machine.disabled = true; - await this.writeMachinesData(machineData); + private computeCurrentMachineName(machines: IMachineData[]): string { + const previousName = this.storageService.get(currentMachineNameKey, StorageScope.GLOBAL); + if (previousName) { + return previousName; } + + const namePrefix = `${this.productService.nameLong} (${PlatformToString(isWeb ? Platform.Web : platform)})`; + const nameRegEx = new RegExp(`${escapeRegExpCharacters(namePrefix)}\\s#(\\d)`); + let nameIndex = 0; + for (const machine of machines) { + const matches = nameRegEx.exec(machine.name); + const index = matches ? parseInt(matches[1]) : 0; + nameIndex = index > nameIndex ? index : nameIndex; + } + return `${namePrefix} #${nameIndex + 1}`; } private async readMachinesData(manifest?: IUserDataManifest): Promise { diff --git a/src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts b/src/vs/platform/userDataSync/common/userDataSyncResourceEnablementService.ts similarity index 64% rename from src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts rename to src/vs/platform/userDataSync/common/userDataSyncResourceEnablementService.ts index 28b4b68e882..0ca0decce1c 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncResourceEnablementService.ts @@ -3,12 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncEnablementService, ALL_SYNC_RESOURCES, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncResourceEnablementService, ALL_SYNC_RESOURCES, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; import { Disposable } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; import { IStorageService, IWorkspaceStorageChangeEvent, StorageScope } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; type SyncEnablementClassification = { enabled?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; @@ -17,46 +16,21 @@ type SyncEnablementClassification = { const enablementKey = 'sync.enable'; function getEnablementKey(resource: SyncResource) { return `${enablementKey}.${resource}`; } -export class UserDataSyncEnablementService extends Disposable implements IUserDataSyncEnablementService { +export class UserDataSyncResourceEnablementService extends Disposable implements IUserDataSyncResourceEnablementService { _serviceBrand: any; - private _onDidChangeEnablement = new Emitter(); - readonly onDidChangeEnablement: Event = this._onDidChangeEnablement.event; - private _onDidChangeResourceEnablement = new Emitter<[SyncResource, boolean]>(); readonly onDidChangeResourceEnablement: Event<[SyncResource, boolean]> = this._onDidChangeResourceEnablement.event; constructor( @IStorageService private readonly storageService: IStorageService, @ITelemetryService private readonly telemetryService: ITelemetryService, - @IEnvironmentService private readonly environmentService: IEnvironmentService, ) { super(); this._register(storageService.onDidChangeStorage(e => this.onDidStorageChange(e))); } - canToggleEnablement(): boolean { - return this.environmentService.sync === undefined; - } - - isEnabled(): boolean { - switch (this.environmentService.sync) { - case 'on': - return true; - case 'off': - return false; - } - return this.storageService.getBoolean(enablementKey, StorageScope.GLOBAL, this.environmentService.enableSyncByDefault); - } - - setEnablement(enabled: boolean): void { - if (this.isEnabled() !== enabled) { - this.telemetryService.publicLog2<{ enabled: boolean }, SyncEnablementClassification>(enablementKey, { enabled }); - this.storageService.store(enablementKey, enabled, StorageScope.GLOBAL); - } - } - isResourceEnabled(resource: SyncResource): boolean { return this.storageService.getBoolean(getEnablementKey(resource), StorageScope.GLOBAL, true); } @@ -71,13 +45,9 @@ export class UserDataSyncEnablementService extends Disposable implements IUserDa private onDidStorageChange(workspaceStorageChangeEvent: IWorkspaceStorageChangeEvent): void { if (workspaceStorageChangeEvent.scope === StorageScope.GLOBAL) { - if (enablementKey === workspaceStorageChangeEvent.key) { - this._onDidChangeEnablement.fire(this.isEnabled()); - return; - } const resourceKey = ALL_SYNC_RESOURCES.filter(resourceKey => getEnablementKey(resourceKey) === workspaceStorageChangeEvent.key)[0]; if (resourceKey) { - this._onDidChangeResourceEnablement.fire([resourceKey, this.isEnabled()]); + this._onDidChangeResourceEnablement.fire([resourceKey, this.isResourceEnabled(resourceKey)]); return; } } diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index 130aac2804e..24d128981dc 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, SyncStatus, IUserDataSyncStoreService, SyncResource, IUserDataSyncLogService, IUserDataSynchroniser, UserDataSyncErrorCode, UserDataSyncError, SyncResourceConflicts, ISyncResourceHandle } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, SyncStatus, IUserDataSyncStoreService, SyncResource, IUserDataSyncLogService, IUserDataSynchroniser, UserDataSyncErrorCode, UserDataSyncError, SyncResourceConflicts, ISyncResourceHandle, IUserDataManifest, ISyncTask } from 'vs/platform/userDataSync/common/userDataSync'; import { Disposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Emitter, Event } from 'vs/base/common/event'; @@ -13,32 +13,26 @@ import { GlobalStateSynchroniser } from 'vs/platform/userDataSync/common/globalS import { toErrorMessage } from 'vs/base/common/errorMessage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { equals } from 'vs/base/common/arrays'; -import { localize } from 'vs/nls'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { URI } from 'vs/base/common/uri'; import { SettingsSynchroniser } from 'vs/platform/userDataSync/common/settingsSync'; import { isEqual } from 'vs/base/common/resources'; import { SnippetsSynchroniser } from 'vs/platform/userDataSync/common/snippetsSync'; -import { Throttler, createCancelablePromise, CancelablePromise } from 'vs/base/common/async'; -import { IUserDataSyncMachinesService, IUserDataSyncMachine } from 'vs/platform/userDataSync/common/userDataSyncMachines'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { platform, PlatformToString, isWeb, Platform } from 'vs/base/common/platform'; -import { escapeRegExpCharacters } from 'vs/base/common/strings'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { IHeaders } from 'vs/base/parts/request/common/request'; +import { generateUuid } from 'vs/base/common/uuid'; -type SyncClassification = { +type SyncErrorClassification = { resource?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + executionId?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; }; -const SESSION_ID_KEY = 'sync.sessionId'; const LAST_SYNC_TIME_KEY = 'sync.lastSyncTime'; export class UserDataSyncService extends Disposable implements IUserDataSyncService { _serviceBrand: any; - private readonly syncThrottler: Throttler; - private syncPromise: CancelablePromise | undefined; private readonly synchronisers: IUserDataSynchroniser[]; private _status: SyncStatus = SyncStatus.Uninitialized; @@ -46,6 +40,9 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ private _onDidChangeStatus: Emitter = this._register(new Emitter()); readonly onDidChangeStatus: Event = this._onDidChangeStatus.event; + private _onSynchronizeResource: Emitter = this._register(new Emitter()); + readonly onSynchronizeResource: Event = this._onSynchronizeResource.event; + readonly onDidChangeLocal: Event; private _conflicts: SyncResourceConflicts[] = []; @@ -74,11 +71,8 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ @IUserDataSyncLogService private readonly logService: IUserDataSyncLogService, @ITelemetryService private readonly telemetryService: ITelemetryService, @IStorageService private readonly storageService: IStorageService, - @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, - @IProductService private readonly productService: IProductService ) { super(); - this.syncThrottler = new Throttler(); this.settingsSynchroniser = this._register(this.instantiationService.createInstance(SettingsSynchroniser)); this.keybindingsSynchroniser = this._register(this.instantiationService.createInstance(KeybindingsSynchroniser)); this.snippetsSynchroniser = this._register(this.instantiationService.createInstance(SnippetsSynchroniser)); @@ -101,6 +95,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ try { for (const synchroniser of this.synchronisers) { try { + this._onSynchronizeResource.fire(synchroniser.resource); await synchroniser.pull(); } catch (e) { this.handleSynchronizerError(e, synchroniser.resource); @@ -109,7 +104,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.updateLastSyncTime(); } catch (error) { if (error instanceof UserDataSyncError) { - this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${error.code}`, { resource: error.resource }); + this.telemetryService.publicLog2<{ resource?: string, executionId?: string }, SyncErrorClassification>(`sync/error/${error.code}`, { resource: error.resource }); } throw error; } @@ -128,7 +123,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.updateLastSyncTime(); } catch (error) { if (error instanceof UserDataSyncError) { - this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${error.code}`, { resource: error.resource }); + this.telemetryService.publicLog2<{ resource?: string, executionId?: string }, SyncErrorClassification>(`sync/error/${error.code}`, { resource: error.resource }); } throw error; } @@ -136,6 +131,37 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ private recoveredSettings: boolean = false; async sync(): Promise { + const syncTask = await this.createSyncTask(); + return syncTask.run(CancellationToken.None); + } + + async createSyncTask(): Promise { + this.telemetryService.publicLog2('sync/getmanifest'); + const executionId = generateUuid(); + let manifest: IUserDataManifest | null; + try { + manifest = await this.userDataSyncStoreService.manifest({ 'X-Execution-Id': executionId }); + } catch (error) { + if (error instanceof UserDataSyncError) { + this.telemetryService.publicLog2<{ resource?: string, executionId?: string }, SyncErrorClassification>(`sync/error/${error.code}`, { resource: error.resource, executionId }); + } + throw error; + } + + let executed = false; + const that = this; + return { + manifest, + run(token: CancellationToken): Promise { + if (executed) { + throw new Error('Can run a task only once'); + } + return that.doSync(manifest, executionId, token); + } + }; + } + + private async doSync(manifest: IUserDataManifest | null, executionId: string, token: CancellationToken): Promise { await this.checkEnablement(); if (!this.recoveredSettings) { @@ -143,13 +169,11 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.recoveredSettings = true; } - await this.syncThrottler.queue(() => { - this.syncPromise = createCancelablePromise(token => this.doSync(token)); - return this.syncPromise; - }); - } + // Return if cancellation is requested + if (token.isCancellationRequested) { + return; + } - private async doSync(token: CancellationToken): Promise { const startTime = new Date().getTime(); this._syncErrors = []; try { @@ -158,36 +182,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.setStatus(SyncStatus.Syncing); } - this.telemetryService.publicLog2('sync/getmanifest'); - let manifest = await this.userDataSyncStoreService.manifest(); - - // Server has no data but this machine was synced before - if (manifest === null && await this.hasPreviouslySynced()) { - // Sync was turned off in the cloud - throw new UserDataSyncError(localize('turned off', "Cannot sync because syncing is turned off in the cloud"), UserDataSyncErrorCode.TurnedOff); - } - - const sessionId = this.storageService.get(SESSION_ID_KEY, StorageScope.GLOBAL); - // Server session is different from client session - if (sessionId && manifest && sessionId !== manifest.session) { - throw new UserDataSyncError(localize('session expired', "Cannot sync because current session is expired"), UserDataSyncErrorCode.SessionExpired); - } - - const machines = await this.userDataSyncMachinesService.getMachines(manifest || undefined); - const currentMachine = machines.find(machine => machine.isCurrent); - - // Return if cancellation is requested - if (token.isCancellationRequested) { - return; - } - - // Check if sync was turned off from other machine - if (currentMachine?.disabled) { - // Unset the current machine - await this.userDataSyncMachinesService.removeCurrentMachine(manifest || undefined); - // Throw TurnedOff error - throw new UserDataSyncError(localize('turned off machine', "Cannot sync because syncing is turned off on this machine from another machine."), UserDataSyncErrorCode.TurnedOff); - } + const syncHeaders: IHeaders = { 'X-Execution-Id': executionId }; for (const synchroniser of this.synchronisers) { // Return if cancellation is requested @@ -195,50 +190,19 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return; } try { - await synchroniser.sync(manifest); + this._onSynchronizeResource.fire(synchroniser.resource); + await synchroniser.sync(manifest, syncHeaders); } catch (e) { this.handleSynchronizerError(e, synchroniser.resource); this._syncErrors.push([synchroniser.resource, UserDataSyncError.toUserDataSyncError(e)]); } } - // After syncing, get the manifest if it was not available before - if (manifest === null) { - manifest = await this.userDataSyncStoreService.manifest(); - } - - // Return if cancellation is requested - if (token.isCancellationRequested) { - return; - } - - // Update local session id - if (manifest && manifest.session !== sessionId) { - this.storageService.store(SESSION_ID_KEY, manifest.session, StorageScope.GLOBAL); - } - - // Return if cancellation is requested - if (token.isCancellationRequested) { - return; - } - - // Add current machine - if (!currentMachine) { - const name = this.computeDefaultMachineName(machines); - await this.userDataSyncMachinesService.addCurrentMachine(name, manifest || undefined); - } - - // Return if cancellation is requested - if (token.isCancellationRequested) { - return; - } - this.logService.info(`Sync done. Took ${new Date().getTime() - startTime}ms`); this.updateLastSyncTime(); - } catch (error) { if (error instanceof UserDataSyncError) { - this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${error.code}`, { resource: error.resource }); + this.telemetryService.publicLog2<{ resource?: string, executionId?: string }, SyncErrorClassification>(`sync/error/${error.code}`, { resource: error.resource, executionId }); } throw error; } finally { @@ -259,12 +223,6 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ async stop(): Promise { await this.checkEnablement(); - if (this.syncPromise) { - this.syncPromise.cancel(); - this.logService.info('Canelled sync that is in progress'); - this.syncPromise = undefined; - } - if (this.status === SyncStatus.Idle) { return; } @@ -339,8 +297,8 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ } for (const synchroniser of synchronizers) { - const preview = await synchroniser.getSyncPreview(); - if (!preview.isLastSyncFromCurrentMachine && (preview.hasLocalChanged || preview.hasRemoteChanged)) { + const preview = await synchroniser.generateSyncPreview(); + if (preview && !preview.isLastSyncFromCurrentMachine && (preview.hasLocalChanged || preview.hasRemoteChanged)) { return true; } } @@ -351,16 +309,12 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ async reset(): Promise { await this.checkEnablement(); await this.resetRemote(); - await this.resetLocal(true); + await this.resetLocal(); } - async resetLocal(donotUnsetMachine?: boolean): Promise { + async resetLocal(): Promise { await this.checkEnablement(); - this.storageService.remove(SESSION_ID_KEY, StorageScope.GLOBAL); this.storageService.remove(LAST_SYNC_TIME_KEY, StorageScope.GLOBAL); - if (!donotUnsetMachine) { - await this.userDataSyncMachinesService.removeCurrentMachine(); - } for (const synchroniser of this.synchronisers) { try { await synchroniser.resetLocal(); @@ -372,7 +326,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.logService.info('Did reset the local sync state.'); } - private async hasPreviouslySynced(): Promise { + async hasPreviouslySynced(): Promise { for (const synchroniser of this.synchronisers) { if (await synchroniser.hasPreviouslySynced()) { return true; @@ -460,20 +414,6 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ .map(s => ({ syncResource: s.resource, conflicts: s.conflicts })); } - private computeDefaultMachineName(machines: IUserDataSyncMachine[]): string { - const namePrefix = `${this.productService.nameLong} (${PlatformToString(isWeb ? Platform.Web : platform)})`; - const nameRegEx = new RegExp(`${escapeRegExpCharacters(namePrefix)}\\s#(\\d)`); - - let nameIndex = 0; - for (const machine of machines) { - const matches = nameRegEx.exec(machine.name); - const index = matches ? parseInt(matches[1]) : 0; - nameIndex = index > nameIndex ? index : nameIndex; - } - - return `${namePrefix} #${nameIndex + 1}`; - } - getSynchroniser(source: SyncResource): IUserDataSynchroniser { return this.synchronisers.filter(s => s.resource === source)[0]; } diff --git a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts index 320a11ed626..199ac53f228 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts @@ -124,13 +124,13 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn } } - async read(resource: ServerResource, oldValue: IUserData | null): Promise { + async read(resource: ServerResource, oldValue: IUserData | null, headers: IHeaders = {}): Promise { if (!this.userDataSyncStore) { throw new Error('No settings sync store url configured.'); } const url = joinPath(this.userDataSyncStore.url, 'resource', resource, 'latest').toString(); - const headers: IHeaders = {}; + headers = { ...headers }; // Disable caching as they are cached by synchronisers headers['Cache-Control'] = 'no-cache'; if (oldValue) { @@ -156,13 +156,14 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn return { ref, content }; } - async write(resource: ServerResource, data: string, ref: string | null): Promise { + async write(resource: ServerResource, data: string, ref: string | null, headers: IHeaders = {}): Promise { if (!this.userDataSyncStore) { throw new Error('No settings sync store url configured.'); } const url = joinPath(this.userDataSyncStore.url, 'resource', resource).toString(); - const headers: IHeaders = { 'Content-Type': 'text/plain' }; + headers = { ...headers }; + headers['Content-Type'] = 'text/plain'; if (ref) { headers['If-Match'] = ref; } @@ -180,13 +181,14 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn return newRef; } - async manifest(): Promise { + async manifest(headers: IHeaders = {}): Promise { if (!this.userDataSyncStore) { throw new Error('No settings sync store url configured.'); } const url = joinPath(this.userDataSyncStore.url, 'manifest').toString(); - const headers: IHeaders = { 'Content-Type': 'application/json' }; + headers = { ...headers }; + headers['Content-Type'] = 'application/json'; const context = await this.request({ type: 'GET', url, headers }, CancellationToken.None); if (!isSuccess(context)) { diff --git a/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts index f9cf9b1ffd4..7868c0ebc2e 100644 --- a/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts @@ -3,31 +3,36 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; import { Event } from 'vs/base/common/event'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { UserDataAutoSyncService as BaseUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; export class UserDataAutoSyncService extends BaseUserDataAutoSyncService { constructor( @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IUserDataSyncService userDataSyncService: IUserDataSyncService, @IElectronService electronService: IElectronService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IUserDataSyncAccountService authTokenService: IUserDataSyncAccountService, @ITelemetryService telemetryService: ITelemetryService, + @IUserDataSyncMachinesService userDataSyncMachinesService: IUserDataSyncMachinesService, + @IStorageService storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService, ) { - super(userDataSyncStoreService, userDataSyncEnablementService, userDataSyncService, logService, authTokenService, telemetryService); + super(userDataSyncStoreService, userDataSyncResourceEnablementService, userDataSyncService, logService, authTokenService, telemetryService, userDataSyncMachinesService, storageService, environmentService); this._register(Event.debounce(Event.any( Event.map(electronService.onWindowFocus, () => 'windowFocus'), Event.map(electronService.onWindowOpen, () => 'windowOpen'), - userDataSyncService.onDidChangeLocal, - ), (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerAutoSync(sources))); + ), (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerSync(sources, true))); } } diff --git a/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts b/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts index 7a1f331d5fa..a6c7b761025 100644 --- a/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts @@ -4,13 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, SyncStatus, IGlobalState } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, SyncStatus, IGlobalState, ISyncData } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; import { IFileService } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { GlobalStateSynchroniser } from 'vs/platform/userDataSync/common/globalStateSync'; import { VSBuffer } from 'vs/base/common/buffer'; diff --git a/src/vs/platform/userDataSync/test/common/settingsSync.test.ts b/src/vs/platform/userDataSync/test/common/settingsSync.test.ts index 4ccf9800534..4cd232beb27 100644 --- a/src/vs/platform/userDataSync/test/common/settingsSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/settingsSync.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, UserDataSyncError, UserDataSyncErrorCode } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, UserDataSyncError, UserDataSyncErrorCode, ISyncData } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { SettingsSynchroniser, ISettingsSyncContent } from 'vs/platform/userDataSync/common/settingsSync'; @@ -12,7 +12,6 @@ import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyn import { IFileService } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { VSBuffer } from 'vs/base/common/buffer'; -import { ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts b/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts index 87da32e3a01..d1ad340d577 100644 --- a/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts @@ -4,14 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, SyncStatus, Conflict, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, SyncStatus, Conflict, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncData } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; import { IFileService } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { VSBuffer } from 'vs/base/common/buffer'; -import { ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { SnippetsSynchroniser } from 'vs/platform/userDataSync/common/snippetsSync'; import { joinPath } from 'vs/base/common/resources'; import { IStringDictionary } from 'vs/base/common/collections'; diff --git a/src/vs/platform/userDataSync/test/common/synchronizer.test.ts b/src/vs/platform/userDataSync/test/common/synchronizer.test.ts index 24c95ffeac4..df32970dea9 100644 --- a/src/vs/platform/userDataSync/test/common/synchronizer.test.ts +++ b/src/vs/platform/userDataSync/test/common/synchronizer.test.ts @@ -4,17 +4,23 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncStoreService, SyncResource, SyncStatus, IUserDataSyncEnablementService, ISyncPreviewResult } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncStoreService, SyncResource, SyncStatus, IUserDataSyncResourceEnablementService, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; -import { AbstractSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { AbstractSynchroniser, ISyncResourcePreview } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { Barrier } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { URI } from 'vs/base/common/uri'; + +interface ITestSyncPreview extends ISyncResourcePreview { + ref?: string; +} class TestSynchroniser extends AbstractSynchroniser { syncBarrier: Barrier = new Barrier(); - syncResult: { status?: SyncStatus, error?: boolean } = {}; + syncResult: { hasConflicts: boolean, hasError: boolean } = { hasConflicts: false, hasError: false }; onDoSyncCall: Emitter = this._register(new Emitter()); readonly resource: SyncResource = SyncResource.Settings; @@ -22,7 +28,7 @@ class TestSynchroniser extends AbstractSynchroniser { private cancelled: boolean = false; - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + protected async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { this.cancelled = false; this.onDoSyncCall.fire(); await this.syncBarrier.wait(); @@ -31,15 +37,37 @@ class TestSynchroniser extends AbstractSynchroniser { return SyncStatus.Idle; } - if (this.syncResult.error) { - throw new Error('failed'); - } - - await this.apply(remoteUserData.ref); - return this.syncResult.status || SyncStatus.Idle; + return super.doSync(remoteUserData, lastSyncUserData); } - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { } + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + return { hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false, hasConflicts: this.syncResult.hasConflicts, remoteUserData, lastSyncUserData, resourcePreviews: [] }; + } + + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + return { hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false, hasConflicts: this.syncResult.hasConflicts, remoteUserData, lastSyncUserData, resourcePreviews: [] }; + } + + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + return { hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false, hasConflicts: this.syncResult.hasConflicts, remoteUserData, lastSyncUserData, resourcePreviews: [] }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + if (this.syncResult.hasError) { + throw new Error('failed'); + } + return { ref: remoteUserData.ref, hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false, hasConflicts: this.syncResult.hasConflicts, remoteUserData, lastSyncUserData, resourcePreviews: [] }; + } + + protected async updatePreviewWithConflict(preview: ISyncResourcePreview, conflictResource: URI, conflictContent: string): Promise { + return preview; + } + + protected async applyPreview({ ref }: ITestSyncPreview, forcePush: boolean): Promise { + if (ref) { + await this.apply(ref); + } + } async apply(ref: string): Promise { const remoteUserData = await this.updateRemoteUserData('', ref); @@ -49,6 +77,7 @@ class TestSynchroniser extends AbstractSynchroniser { async stop(): Promise { this.cancelled = true; this.syncBarrier.open(); + super.stop(); } async triggerLocalChange(): Promise { @@ -61,10 +90,6 @@ class TestSynchroniser extends AbstractSynchroniser { this.onDidTriggerLocalChangeCall.fire(); } - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - return { hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false }; - } - } suite('TestSynchronizer', () => { @@ -114,7 +139,7 @@ suite('TestSynchronizer', () => { test('status is set correctly when sync has conflicts', async () => { const testObject: TestSynchroniser = client.instantiationService.createInstance(TestSynchroniser, SyncResource.Settings); - testObject.syncResult = { status: SyncStatus.HasConflicts }; + testObject.syncResult = { hasConflicts: true, hasError: false }; testObject.syncBarrier.open(); const actual: SyncStatus[] = []; @@ -127,7 +152,7 @@ suite('TestSynchronizer', () => { test('status is set correctly when sync has errors', async () => { const testObject: TestSynchroniser = client.instantiationService.createInstance(TestSynchroniser, SyncResource.Settings); - testObject.syncResult = { error: true }; + testObject.syncResult = { hasError: true, hasConflicts: false }; testObject.syncBarrier.open(); const actual: SyncStatus[] = []; @@ -161,7 +186,7 @@ suite('TestSynchronizer', () => { test('sync should not run if disabled', async () => { const testObject: TestSynchroniser = client.instantiationService.createInstance(TestSynchroniser, SyncResource.Settings); - client.instantiationService.get(IUserDataSyncEnablementService).setResourceEnablement(testObject.resource, false); + client.instantiationService.get(IUserDataSyncResourceEnablementService).setResourceEnablement(testObject.resource, false); const actual: SyncStatus[] = []; disposableStore.add(testObject.onDidChangeStatus(status => actual.push(status))); @@ -174,7 +199,7 @@ suite('TestSynchronizer', () => { test('sync should not run if there are conflicts', async () => { const testObject: TestSynchroniser = client.instantiationService.createInstance(TestSynchroniser, SyncResource.Settings); - testObject.syncResult = { status: SyncStatus.HasConflicts }; + testObject.syncResult = { hasConflicts: true, hasError: false }; testObject.syncBarrier.open(); await testObject.sync(await client.manifest()); diff --git a/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts b/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts index f2c772fb7ae..42900db5f06 100644 --- a/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts @@ -7,11 +7,21 @@ import * as assert from 'assert'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { UserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; -import { IUserDataSyncService, SyncResource, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, SyncResource, UserDataAutoSyncError, UserDataSyncErrorCode, UserDataSyncStoreError } from 'vs/platform/userDataSync/common/userDataSync'; +import { Event } from 'vs/base/common/event'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { joinPath } from 'vs/base/common/resources'; +import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; class TestUserDataAutoSyncService extends UserDataAutoSyncService { protected startAutoSync(): boolean { return false; } protected getSyncTriggerDelayTime(): number { return 50; } + + sync(): Promise { + return this.triggerSync(['sync'], false); + } } suite('UserDataAutoSyncService', () => { @@ -30,14 +40,16 @@ suite('UserDataAutoSyncService', () => { await client.instantiationService.get(IUserDataSyncService).sync(); target.reset(); - client.instantiationService.get(IUserDataSyncEnablementService).setEnablement(true); const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); // Trigger auto sync with settings change - await testObject.triggerAutoSync([SyncResource.Settings]); + await testObject.triggerSync([SyncResource.Settings], false); - // Make sure only one request is made - assert.deepEqual(target.requests, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); + // Filter out machine requests + const actual = target.requests.filter(request => !request.url.startsWith(`${target.url}/v1/resource/machines`)); + + // Make sure only one manifest request is made + assert.deepEqual(actual, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); }); test('test auto sync with sync resource change triggers sync for every change', async () => { @@ -50,15 +62,17 @@ suite('UserDataAutoSyncService', () => { await client.instantiationService.get(IUserDataSyncService).sync(); target.reset(); - client.instantiationService.get(IUserDataSyncEnablementService).setEnablement(true); const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); // Trigger auto sync with settings change multiple times for (let counter = 0; counter < 2; counter++) { - await testObject.triggerAutoSync([SyncResource.Settings]); + await testObject.triggerSync([SyncResource.Settings], false); } - assert.deepEqual(target.requests, [ + // Filter out machine requests + const actual = target.requests.filter(request => !request.url.startsWith(`${target.url}/v1/resource/machines`)); + + assert.deepEqual(actual, [ { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} } ]); @@ -74,14 +88,16 @@ suite('UserDataAutoSyncService', () => { await client.instantiationService.get(IUserDataSyncService).sync(); target.reset(); - client.instantiationService.get(IUserDataSyncEnablementService).setEnablement(true); const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); // Trigger auto sync with window focus once - await testObject.triggerAutoSync(['windowFocus']); + await testObject.triggerSync(['windowFocus'], true); - // Make sure only one request is made - assert.deepEqual(target.requests, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); + // Filter out machine requests + const actual = target.requests.filter(request => !request.url.startsWith(`${target.url}/v1/resource/machines`)); + + // Make sure only one manifest request is made + assert.deepEqual(actual, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); }); test('test auto sync with non sync resource change does not trigger continuous syncs', async () => { @@ -94,16 +110,277 @@ suite('UserDataAutoSyncService', () => { await client.instantiationService.get(IUserDataSyncService).sync(); target.reset(); - client.instantiationService.get(IUserDataSyncEnablementService).setEnablement(true); const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); // Trigger auto sync with window focus multiple times for (let counter = 0; counter < 2; counter++) { - await testObject.triggerAutoSync(['windowFocus']); + await testObject.triggerSync(['windowFocus'], true); } - // Make sure only one request is made - assert.deepEqual(target.requests, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); + // Filter out machine requests + const actual = target.requests.filter(request => !request.url.startsWith(`${target.url}/v1/resource/machines`)); + + // Make sure only one manifest request is made + assert.deepEqual(actual, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); + }); + + test('test first auto sync requests', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject: TestUserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); + + await testObject.sync(); + + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machines + { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, + // Settings + { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '0' } }, + // Keybindings + { type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/keybindings`, headers: { 'If-Match': '0' } }, + // Snippets + { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '0' } }, + // Global state + { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, + // Extensions + { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machines + { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } } + ]); + + }); + + test('test further auto sync requests without changes', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject: TestUserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); + + // Sync once and reset requests + await testObject.sync(); + target.reset(); + + await testObject.sync(); + + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} } + ]); + + }); + + test('test further auto sync requests with changes', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject: TestUserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); + + // Sync once and reset requests + await testObject.sync(); + target.reset(); + + // Do changes in the client + const fileService = client.instantiationService.get(IFileService); + const environmentService = client.instantiationService.get(IEnvironmentService); + await fileService.writeFile(environmentService.settingsResource, VSBuffer.fromString(JSON.stringify({ 'editor.fontSize': 14 }))); + await fileService.writeFile(environmentService.keybindingsResource, VSBuffer.fromString(JSON.stringify([{ 'command': 'abcd', 'key': 'cmd+c' }]))); + await fileService.writeFile(joinPath(environmentService.snippetsHome, 'html.json'), VSBuffer.fromString(`{}`)); + await fileService.writeFile(environmentService.argvResource, VSBuffer.fromString(JSON.stringify({ 'locale': 'de' }))); + await testObject.sync(); + + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Settings + { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '1' } }, + // Keybindings + { type: 'POST', url: `${target.url}/v1/resource/keybindings`, headers: { 'If-Match': '1' } }, + // Snippets + { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '1' } }, + // Global state + { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '1' } }, + ]); + + }); + + test('test auto sync send execution id header', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject: TestUserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); + + // Sync once and reset requests + await testObject.sync(); + target.reset(); + + await testObject.sync(); + + for (const request of target.requestsWithAllHeaders) { + const hasExecutionIdHeader = request.headers && request.headers['X-Execution-Id'] && request.headers['X-Execution-Id'].length > 0; + if (request.url.startsWith(`${target.url}/v1/resource/machines`)) { + assert.ok(!hasExecutionIdHeader, `Should not have execution header: ${request.url}`); + } else { + assert.ok(hasExecutionIdHeader, `Should have execution header: ${request.url}`); + } + } + + }); + + test('test delete on one client throws turned off error on other client while syncing', async () => { + const target = new UserDataSyncTestServer(); + + // Set up and sync from the client + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + await client.instantiationService.get(IUserDataSyncService).sync(); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + await testObject.sync(); + + // Reset from the first client + await client.instantiationService.get(IUserDataSyncService).reset(); + + // Sync from the test client + target.reset(); + + const errorPromise = Event.toPromise(testObject.onError); + await testObject.sync(); + + const e = await errorPromise; + assert.ok(e instanceof UserDataAutoSyncError); + assert.deepEqual((e).code, UserDataSyncErrorCode.TurnedOff); + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machine + { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '1' } }, + ]); + }); + + test('test disabling the machine turns off sync', async () => { + const target = new UserDataSyncTestServer(); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + await testObject.sync(); + + // Disable current machine + const userDataSyncMachinesService = testClient.instantiationService.get(IUserDataSyncMachinesService); + const machines = await userDataSyncMachinesService.getMachines(); + const currentMachine = machines.find(m => m.isCurrent)!; + await userDataSyncMachinesService.setEnablement(currentMachine.id, false); + + target.reset(); + + const errorPromise = Event.toPromise(testObject.onError); + await testObject.sync(); + + const e = await errorPromise; + assert.ok(e instanceof UserDataAutoSyncError); + assert.deepEqual((e).code, UserDataSyncErrorCode.TurnedOff); + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machine + { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '2' } }, + { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '2' } }, + ]); + }); + + test('test removing the machine adds machine back', async () => { + const target = new UserDataSyncTestServer(); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + await testObject.sync(); + + // Remove current machine + await testClient.instantiationService.get(IUserDataSyncMachinesService).removeCurrentMachine(); + + target.reset(); + + await testObject.sync(); + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machine + { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '2' } }, + ]); + }); + + test('test creating new session from one client throws session expired error on another client while syncing', async () => { + const target = new UserDataSyncTestServer(); + + // Set up and sync from the client + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + await client.instantiationService.get(IUserDataSyncService).sync(); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + await testObject.sync(); + + // Reset from the first client + await client.instantiationService.get(IUserDataSyncService).reset(); + + // Sync again from the first client to create new session + await client.instantiationService.get(IUserDataSyncService).sync(); + + // Sync from the test client + target.reset(); + + const errorPromise = Event.toPromise(testObject.onError); + await testObject.sync(); + + const e = await errorPromise; + assert.ok(e instanceof UserDataAutoSyncError); + assert.deepEqual((e).code, UserDataSyncErrorCode.SessionExpired); + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machine + { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '1' } }, + ]); + }); + + test('test rate limit on server', async () => { + const target = new UserDataSyncTestServer(5); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + + const errorPromise = Event.toPromise(testObject.onError); + while (target.requests.length < 5) { + await testObject.sync(); + } + + const e = await errorPromise; + assert.ok(e instanceof UserDataSyncStoreError); + assert.deepEqual((e).code, UserDataSyncErrorCode.TooManyRequests); }); diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts index 5cd1d9c7c87..3cb12370bcf 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts @@ -6,7 +6,7 @@ import { IRequestService } from 'vs/platform/request/common/request'; import { IRequestOptions, IRequestContext, IHeaders } from 'vs/base/parts/request/common/request'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { IUserData, IUserDataManifest, ALL_SYNC_RESOURCES, IUserDataSyncLogService, IUserDataSyncStoreService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncService, getDefaultIgnoredSettings, IUserDataSyncBackupStoreService, SyncResource, ServerResource } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserData, IUserDataManifest, ALL_SYNC_RESOURCES, IUserDataSyncLogService, IUserDataSyncStoreService, IUserDataSyncUtilService, IUserDataSyncResourceEnablementService, IUserDataSyncService, getDefaultIgnoredSettings, IUserDataSyncBackupStoreService, SyncResource, ServerResource } from 'vs/platform/userDataSync/common/userDataSync'; import { bufferToStream, VSBuffer } from 'vs/base/common/buffer'; import { generateUuid } from 'vs/base/common/uuid'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; @@ -25,7 +25,7 @@ import { URI } from 'vs/base/common/uri'; import { joinPath } from 'vs/base/common/resources'; import { IStringDictionary } from 'vs/base/common/collections'; import { FormattingOptions } from 'vs/base/common/jsonFormatter'; -import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; +import { UserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSyncResourceEnablementService'; import { IGlobalExtensionEnablementService, IExtensionManagementService, IExtensionGalleryService, DidInstallExtensionEvent, DidUninstallExtensionEvent } from 'vs/platform/extensionManagement/common/extensionManagement'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider'; @@ -56,7 +56,8 @@ export class UserDataSyncClient extends Disposable { settingsResource: joinPath(userDataDirectory, 'settings.json'), keybindingsResource: joinPath(userDataDirectory, 'keybindings.json'), snippetsHome: joinPath(userDataDirectory, 'snippets'), - argvResource: joinPath(userDataDirectory, 'argv.json') + argvResource: joinPath(userDataDirectory, 'argv.json'), + sync: 'on', }); const logService = new NullLogService(); @@ -94,7 +95,7 @@ export class UserDataSyncClient extends Disposable { this.instantiationService.stub(IUserDataSyncMachinesService, this.instantiationService.createInstance(UserDataSyncMachinesService)); this.instantiationService.stub(IUserDataSyncBackupStoreService, this.instantiationService.createInstance(UserDataSyncBackupStoreService)); this.instantiationService.stub(IUserDataSyncUtilService, new TestUserDataSyncUtilService()); - this.instantiationService.stub(IUserDataSyncEnablementService, this.instantiationService.createInstance(UserDataSyncEnablementService)); + this.instantiationService.stub(IUserDataSyncResourceEnablementService, this.instantiationService.createInstance(UserDataSyncResourceEnablementService)); this.instantiationService.stub(IStorageKeysSyncRegistryService, this.instantiationService.createInstance(StorageKeysSyncRegistryService)); this.instantiationService.stub(IGlobalExtensionEnablementService, this.instantiationService.createInstance(GlobalExtensionEnablementService)); @@ -153,9 +154,14 @@ export class UserDataSyncTestServer implements IRequestService { get responses(): { status: number }[] { return this._responses; } reset(): void { this._requests = []; this._responses = []; this._requestsWithAllHeaders = []; } + constructor(private readonly rateLimit = Number.MAX_SAFE_INTEGER) { } + async resolveProxy(url: string): Promise { return url; } async request(options: IRequestOptions, token: CancellationToken): Promise { + if (this._requests.length === this.rateLimit) { + return this.toResponse(429); + } const headers: IHeaders = {}; if (options.headers) { if (options.headers['If-None-Match']) { diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts b/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts index 0493a52be3f..9d81e434aae 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncService, UserDataSyncError, UserDataSyncErrorCode, SyncStatus, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, SyncStatus, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IFileService } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { VSBuffer } from 'vs/base/common/buffer'; import { joinPath } from 'vs/base/common/resources'; +import { CancellationToken } from 'vs/base/common/cancellation'; suite('UserDataSyncService', () => { @@ -31,8 +32,6 @@ suite('UserDataSyncService', () => { assert.deepEqual(target.requests, [ // Manifest { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, // Settings { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '0' } }, @@ -47,10 +46,6 @@ suite('UserDataSyncService', () => { { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, // Extensions { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } }, ]); }); @@ -68,8 +63,6 @@ suite('UserDataSyncService', () => { assert.deepEqual(target.requests, [ // Manifest { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, // Settings { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, // Keybindings @@ -80,10 +73,6 @@ suite('UserDataSyncService', () => { { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, // Extensions { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } }, ]); }); @@ -187,13 +176,11 @@ suite('UserDataSyncService', () => { { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, /* sync */ { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '1' } }, ]); }); @@ -229,7 +216,6 @@ suite('UserDataSyncService', () => { /* first time sync */ { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '1' } }, { type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} }, @@ -238,7 +224,6 @@ suite('UserDataSyncService', () => { { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '1' } }, { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '1' } }, ]); }); @@ -378,8 +363,6 @@ suite('UserDataSyncService', () => { assert.deepEqual(target.requests, [ // Manifest { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '1' } }, // Settings { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '0' } }, @@ -394,83 +377,10 @@ suite('UserDataSyncService', () => { { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, // Extensions { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } }, ]); }); - test('test delete on one client throws turned off error on other client while syncing', async () => { - const target = new UserDataSyncTestServer(); - - // Set up and sync from the client - const client = disposableStore.add(new UserDataSyncClient(target)); - await client.setUp(); - await client.instantiationService.get(IUserDataSyncService).sync(); - - // Set up and sync from the test client - const testClient = disposableStore.add(new UserDataSyncClient(target)); - await testClient.setUp(); - const testObject = testClient.instantiationService.get(IUserDataSyncService); - await testObject.sync(); - - // Reset from the first client - await client.instantiationService.get(IUserDataSyncService).reset(); - - // Sync from the test client - target.reset(); - try { - await testObject.sync(); - } catch (e) { - assert.ok(e instanceof UserDataSyncError); - assert.deepEqual((e).code, UserDataSyncErrorCode.TurnedOff); - assert.deepEqual(target.requests, [ - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - ]); - return; - } - throw assert.fail('Should fail with turned off error'); - }); - - test('test creating new session from one client throws session expired error on another client while syncing', async () => { - const target = new UserDataSyncTestServer(); - - // Set up and sync from the client - const client = disposableStore.add(new UserDataSyncClient(target)); - await client.setUp(); - await client.instantiationService.get(IUserDataSyncService).sync(); - - // Set up and sync from the test client - const testClient = disposableStore.add(new UserDataSyncClient(target)); - await testClient.setUp(); - const testObject = testClient.instantiationService.get(IUserDataSyncService); - await testObject.sync(); - - // Reset from the first client - await client.instantiationService.get(IUserDataSyncService).reset(); - - // Sync again from the first client to create new session - await client.instantiationService.get(IUserDataSyncService).sync(); - - // Sync from the test client - target.reset(); - try { - await testObject.sync(); - } catch (e) { - assert.ok(e instanceof UserDataSyncError); - assert.deepEqual((e).code, UserDataSyncErrorCode.SessionExpired); - assert.deepEqual(target.requests, [ - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - ]); - return; - } - throw assert.fail('Should fail with turned off error'); - }); - test('test sync status', async () => { const target = new UserDataSyncTestServer(); @@ -583,4 +493,38 @@ suite('UserDataSyncService', () => { assert.deepEqual(testObject.conflicts, []); }); + test('test sync send execution id header', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject = client.instantiationService.get(IUserDataSyncService); + + await testObject.sync(); + + for (const request of target.requestsWithAllHeaders) { + const hasExecutionIdHeader = request.headers && request.headers['X-Execution-Id'] && request.headers['X-Execution-Id'].length > 0; + assert.ok(hasExecutionIdHeader, `Should have execution header: ${request.url}`); + } + + }); + + test('test can run sync taks only once', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject = client.instantiationService.get(IUserDataSyncService); + + const syncTask = await testObject.createSyncTask(); + await syncTask.run(CancellationToken.None); + + try { + await syncTask.run(CancellationToken.None); + assert.fail('Should fail running the task again'); + } catch (error) { + /* expected */ + } + }); + }); diff --git a/src/vs/platform/webview/common/resourceLoader.ts b/src/vs/platform/webview/common/resourceLoader.ts index 5f513674085..03de5b6c946 100644 --- a/src/vs/platform/webview/common/resourceLoader.ts +++ b/src/vs/platform/webview/common/resourceLoader.ts @@ -3,15 +3,20 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { VSBuffer, VSBufferReadableStream } from 'vs/base/common/buffer'; +import { VSBufferReadableStream } from 'vs/base/common/buffer'; +import { CancellationToken } from 'vs/base/common/cancellation'; import { isUNC } from 'vs/base/common/extpath'; import { Schemas } from 'vs/base/common/network'; import { sep } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import { IFileService } from 'vs/platform/files/common/files'; -import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; +import { IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IRequestService } from 'vs/platform/request/common/request'; import { getWebviewContentMimeType } from 'vs/platform/webview/common/mimeTypes'; + +export const webviewPartitionId = 'webview'; + export namespace WebviewResourceResponse { export enum Type { Success, Failed, AccessDenied } @@ -24,57 +29,45 @@ export namespace WebviewResourceResponse { ) { } } - export class BufferSuccess { - readonly type = Type.Success; - - constructor( - public readonly buffer: VSBuffer, - public readonly mimeType: string - ) { } - } - export const Failed = { type: Type.Failed } as const; export const AccessDenied = { type: Type.AccessDenied } as const; - export type BufferResponse = BufferSuccess | typeof Failed | typeof AccessDenied; export type StreamResponse = StreamSuccess | typeof Failed | typeof AccessDenied; } export async function loadLocalResource( requestUri: URI, + options: { + extensionLocation: URI | undefined; + roots: ReadonlyArray; + remoteConnectionData?: IRemoteConnectionData | null; + rewriteUri?: (uri: URI) => URI, + }, fileService: IFileService, - extensionLocation: URI | undefined, - roots: ReadonlyArray -): Promise { - const resourceToLoad = getResourceToLoad(requestUri, extensionLocation, roots); - if (!resourceToLoad) { - return WebviewResourceResponse.AccessDenied; - } - - try { - const data = await fileService.readFile(resourceToLoad); - const mime = getWebviewContentMimeType(requestUri); // Use the original path for the mime - return new WebviewResourceResponse.BufferSuccess(data.value, mime); - } catch (err) { - console.log(err); - return WebviewResourceResponse.Failed; - } -} - -export async function loadLocalResourceStream( - requestUri: URI, - fileService: IFileService, - extensionLocation: URI | undefined, - roots: ReadonlyArray + requestService: IRequestService, ): Promise { - const resourceToLoad = getResourceToLoad(requestUri, extensionLocation, roots); + let resourceToLoad = getResourceToLoad(requestUri, options.roots); if (!resourceToLoad) { return WebviewResourceResponse.AccessDenied; } + const mime = getWebviewContentMimeType(requestUri); // Use the original path for the mime + + // Perform extra normalization if needed + if (options.rewriteUri) { + resourceToLoad = options.rewriteUri(resourceToLoad); + } + + if (resourceToLoad.scheme === Schemas.http || resourceToLoad.scheme === Schemas.https) { + const response = await requestService.request({ url: resourceToLoad.toString(true) }, CancellationToken.None); + if (response.res.statusCode === 200) { + return new WebviewResourceResponse.StreamSuccess(response.stream, mime); + } + return WebviewResourceResponse.Failed; + } + try { const contents = await fileService.readFileStream(resourceToLoad); - const mime = getWebviewContentMimeType(requestUri); // Use the original path for the mime return new WebviewResourceResponse.StreamSuccess(contents.value, mime); } catch (err) { console.log(err); @@ -84,26 +77,12 @@ export async function loadLocalResourceStream( function getResourceToLoad( requestUri: URI, - extensionLocation: URI | undefined, roots: ReadonlyArray ): URI | undefined { const normalizedPath = normalizeRequestPath(requestUri); for (const root of roots) { - if (!containsResource(root, normalizedPath)) { - continue; - } - - if (extensionLocation && extensionLocation.scheme === REMOTE_HOST_SCHEME) { - return URI.from({ - scheme: REMOTE_HOST_SCHEME, - authority: extensionLocation.authority, - path: '/vscode-resource', - query: JSON.stringify({ - requestResourcePath: normalizedPath.path - }) - }); - } else { + if (containsResource(root, normalizedPath)) { return normalizedPath; } } @@ -123,19 +102,6 @@ function normalizeRequestPath(requestUri: URI) { query: requestUri.query, fragment: requestUri.fragment }); - } else if (requestUri.scheme === Schemas.oldVscodeWebviewResource) { - // Modern `vscode-resource` uris puts the scheme as the authority - if (requestUri.authority) { - const resourceUri = URI.parse(`${requestUri.authority}:${encodeURIComponent(requestUri.path).replace(/%2F/g, '/')}`); - return resourceUri.with({ - query: requestUri.query, - fragment: requestUri.fragment - }); - } - - // Old style vscode-resource uris lose the scheme of the resource which means they are unable to - // load a mix of local and remote content properly. - return requestUri.with({ scheme: 'file' }); } else { return requestUri; } diff --git a/src/vs/platform/webview/common/webviewManagerService.ts b/src/vs/platform/webview/common/webviewManagerService.ts index 5a67ccbc3d4..39f16ddf18e 100644 --- a/src/vs/platform/webview/common/webviewManagerService.ts +++ b/src/vs/platform/webview/common/webviewManagerService.ts @@ -5,15 +5,17 @@ import { UriComponents } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IWebviewPortMapping } from 'vs/platform/webview/common/webviewPortMapping'; export const IWebviewManagerService = createDecorator('webviewManagerService'); export interface IWebviewManagerService { _serviceBrand: unknown; - registerWebview(id: string, metadata: RegisterWebviewMetadata): Promise; + registerWebview(id: string, webContentsId: number | undefined, metadata: RegisterWebviewMetadata): Promise; unregisterWebview(id: string): Promise; - updateLocalResourceRoots(id: string, roots: UriComponents[]): Promise; + updateWebviewMetadata(id: string, metadataDelta: Partial): Promise; setIgnoreMenuShortcuts(webContentsId: number, enabled: boolean): Promise; } @@ -21,4 +23,6 @@ export interface IWebviewManagerService { export interface RegisterWebviewMetadata { readonly extensionLocation: UriComponents | undefined; readonly localResourceRoots: readonly UriComponents[]; + readonly remoteConnectionData: IRemoteConnectionData | null; + readonly portMappings: readonly IWebviewPortMapping[]; } diff --git a/src/vs/workbench/contrib/webview/common/portMapping.ts b/src/vs/platform/webview/common/webviewPortMapping.ts similarity index 60% rename from src/vs/workbench/contrib/webview/common/portMapping.ts rename to src/vs/platform/webview/common/webviewPortMapping.ts index fe5a6d21962..e72a2986707 100644 --- a/src/vs/workbench/contrib/webview/common/portMapping.ts +++ b/src/vs/platform/webview/common/webviewPortMapping.ts @@ -3,36 +3,42 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable } from 'vs/base/common/lifecycle'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import * as modes from 'vs/editor/common/modes'; +import { IAddress } from 'vs/platform/remote/common/remoteAgentConnection'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; -import { ITunnelService, RemoteTunnel, extractLocalHostUriMetaDataForPortMapping } from 'vs/platform/remote/common/tunnel'; +import { extractLocalHostUriMetaDataForPortMapping, ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; -export class WebviewPortMappingManager extends Disposable { +export interface IWebviewPortMapping { + webviewPort: number; + extensionHostPort: number; +} + +/** + * Manages port mappings for a single webview. + */ +export class WebviewPortMappingManager implements IDisposable { private readonly _tunnels = new Map>(); constructor( - private readonly getExtensionLocation: () => URI | undefined, - private readonly mappings: () => ReadonlyArray, + private readonly _getExtensionLocation: () => URI | undefined, + private readonly _getMappings: () => readonly IWebviewPortMapping[], private readonly tunnelService: ITunnelService - ) { - super(); - } + ) { } - public async getRedirect(url: string): Promise { + public async getRedirect(resolveAuthority: IAddress, url: string): Promise { const uri = URI.parse(url); const requestLocalHostInfo = extractLocalHostUriMetaDataForPortMapping(uri); if (!requestLocalHostInfo) { return undefined; } - for (const mapping of this.mappings()) { + for (const mapping of this._getMappings()) { if (mapping.webviewPort === requestLocalHostInfo.port) { - const extensionLocation = this.getExtensionLocation(); + const extensionLocation = this._getExtensionLocation(); if (extensionLocation && extensionLocation.scheme === REMOTE_HOST_SCHEME) { - const tunnel = await this.getOrCreateTunnel(mapping.extensionHostPort); + const tunnel = await this.getOrCreateTunnel(resolveAuthority, mapping.extensionHostPort); if (tunnel) { if (tunnel.tunnelLocalPort === mapping.webviewPort) { return undefined; @@ -55,20 +61,18 @@ export class WebviewPortMappingManager extends Disposable { } dispose() { - super.dispose(); - for (const tunnel of this._tunnels.values()) { tunnel.then(tunnel => tunnel.dispose()); } this._tunnels.clear(); } - private getOrCreateTunnel(remotePort: number): Promise | undefined { + private getOrCreateTunnel(remoteAuthority: IAddress, remotePort: number): Promise | undefined { const existing = this._tunnels.get(remotePort); if (existing) { return existing; } - const tunnel = this.tunnelService.openTunnel(undefined, remotePort); + const tunnel = this.tunnelService.openTunnel({ getAddress: async () => remoteAuthority }, undefined, remotePort); if (tunnel) { this._tunnels.set(remotePort, tunnel); } diff --git a/src/vs/platform/webview/electron-main/webviewMainService.ts b/src/vs/platform/webview/electron-main/webviewMainService.ts index 0dd68feeb77..b14b91df77b 100644 --- a/src/vs/platform/webview/electron-main/webviewMainService.ts +++ b/src/vs/platform/webview/electron-main/webviewMainService.ts @@ -4,36 +4,66 @@ *--------------------------------------------------------------------------------------------*/ import { webContents } from 'electron'; -import { IWebviewManagerService, RegisterWebviewMetadata } from 'vs/platform/webview/common/webviewManagerService'; -import { WebviewProtocolProvider } from 'vs/platform/webview/electron-main/webviewProtocolProvider'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; import { IFileService } from 'vs/platform/files/common/files'; -import { UriComponents, URI } from 'vs/base/common/uri'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { IRequestService } from 'vs/platform/request/common/request'; +import { IWebviewManagerService, RegisterWebviewMetadata } from 'vs/platform/webview/common/webviewManagerService'; +import { WebviewPortMappingProvider } from 'vs/platform/webview/electron-main/webviewPortMappingProvider'; +import { WebviewProtocolProvider } from 'vs/platform/webview/electron-main/webviewProtocolProvider'; -export class WebviewMainService implements IWebviewManagerService { +export class WebviewMainService extends Disposable implements IWebviewManagerService { declare readonly _serviceBrand: undefined; - private protocolProvider: WebviewProtocolProvider; + private readonly protocolProvider: WebviewProtocolProvider; + private readonly portMappingProvider: WebviewPortMappingProvider; constructor( @IFileService fileService: IFileService, + @IRequestService requestService: IRequestService, + @ITunnelService tunnelService: ITunnelService, ) { - this.protocolProvider = new WebviewProtocolProvider(fileService); + super(); + this.protocolProvider = this._register(new WebviewProtocolProvider(fileService, requestService)); + this.portMappingProvider = this._register(new WebviewPortMappingProvider(tunnelService)); } - public async registerWebview(id: string, metadata: RegisterWebviewMetadata): Promise { - this.protocolProvider.registerWebview(id, - metadata.extensionLocation ? URI.from(metadata.extensionLocation) : undefined, - metadata.localResourceRoots.map((x: UriComponents) => URI.from(x)) - ); + public async registerWebview(id: string, webContentsId: number | undefined, metadata: RegisterWebviewMetadata): Promise { + const extensionLocation = metadata.extensionLocation ? URI.from(metadata.extensionLocation) : undefined; + + this.protocolProvider.registerWebview(id, { + ...metadata, + extensionLocation, + localResourceRoots: metadata.localResourceRoots.map(x => URI.from(x)) + }); + + this.portMappingProvider.registerWebview(id, webContentsId, { + extensionLocation, + mappings: metadata.portMappings, + resolvedAuthority: metadata.remoteConnectionData, + }); } public async unregisterWebview(id: string): Promise { - this.protocolProvider.unreigsterWebview(id); + this.protocolProvider.unregisterWebview(id); + this.portMappingProvider.unregisterWebview(id); } - public async updateLocalResourceRoots(id: string, roots: UriComponents[]): Promise { - this.protocolProvider.updateLocalResourceRoots(id, roots.map((x: UriComponents) => URI.from(x))); + public async updateWebviewMetadata(id: string, metaDataDelta: Partial): Promise { + const extensionLocation = metaDataDelta.extensionLocation ? URI.from(metaDataDelta.extensionLocation) : undefined; + + this.protocolProvider.updateWebviewMetadata(id, { + ...metaDataDelta, + extensionLocation, + localResourceRoots: metaDataDelta.localResourceRoots?.map(x => URI.from(x)), + }); + + this.portMappingProvider.updateWebviewMetadata(id, { + ...metaDataDelta, + extensionLocation, + }); } public async setIgnoreMenuShortcuts(webContentsId: number, enabled: boolean): Promise { diff --git a/src/vs/platform/webview/electron-main/webviewPortMappingProvider.ts b/src/vs/platform/webview/electron-main/webviewPortMappingProvider.ts new file mode 100644 index 00000000000..9024199c172 --- /dev/null +++ b/src/vs/platform/webview/electron-main/webviewPortMappingProvider.ts @@ -0,0 +1,91 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { session } from 'electron'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { IAddress } from 'vs/platform/remote/common/remoteAgentConnection'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { webviewPartitionId } from 'vs/platform/webview/common/resourceLoader'; +import { IWebviewPortMapping, WebviewPortMappingManager } from 'vs/platform/webview/common/webviewPortMapping'; + +interface PortMappingData { + readonly extensionLocation: URI | undefined; + readonly mappings: readonly IWebviewPortMapping[]; + readonly resolvedAuthority: IAddress | null | undefined; +} + +export class WebviewPortMappingProvider extends Disposable { + + private readonly _webviewData = new Map(); + + private _webContentsIdsToWebviewIds = new Map(); + + constructor( + @ITunnelService private readonly _tunnelService: ITunnelService, + ) { + super(); + + const sess = session.fromPartition(webviewPartitionId); + + sess.webRequest.onBeforeRequest({ + urls: [ + '*://localhost:*/', + '*://127.0.0.1:*/', + '*://0.0.0.0:*/', + ] + }, async (details, callback) => { + const webviewId = details.webContentsId && this._webContentsIdsToWebviewIds.get(details.webContentsId); + if (!webviewId) { + return callback({}); + } + + const entry = this._webviewData.get(webviewId); + if (!entry || !entry.metadata.resolvedAuthority) { + return callback({}); + } + + const redirect = await entry.manager.getRedirect(entry.metadata.resolvedAuthority, details.url); + return callback(redirect ? { redirectURL: redirect } : {}); + }); + } + + public async registerWebview(id: string, webContentsId: number | undefined, metadata: PortMappingData): Promise { + const manager = new WebviewPortMappingManager( + () => this._webviewData.get(id)?.metadata.extensionLocation, + () => this._webviewData.get(id)?.metadata.mappings || [], + this._tunnelService); + + this._webviewData.set(id, { webContentsId, metadata, manager }); + if (typeof webContentsId === 'number') { + this._webContentsIdsToWebviewIds.set(webContentsId, id); + } + } + + public unregisterWebview(id: string): void { + const existing = this._webviewData.get(id); + if (existing) { + existing.manager.dispose(); + this._webviewData.delete(id); + if (typeof existing.webContentsId === 'number') { + this._webContentsIdsToWebviewIds.delete(existing.webContentsId); + } + } + } + + public async updateWebviewMetadata(id: string, metadataDelta: Partial): Promise { + const entry = this._webviewData.get(id); + if (entry) { + this._webviewData.set(id, { + ...entry, + ...metadataDelta, + }); + } + } +} diff --git a/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts b/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts index 171439f0975..11152bfd28f 100644 --- a/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts +++ b/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts @@ -3,75 +3,196 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { protocol } from 'electron'; +import { session, protocol } from 'electron'; +import { Readable } from 'stream'; +import { VSBufferReadableStream } from 'vs/base/common/buffer'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import { streamToNodeReadable } from 'vs/base/node/stream'; import { IFileService } from 'vs/platform/files/common/files'; -import { loadLocalResourceStream, WebviewResourceResponse } from 'vs/platform/webview/common/resourceLoader'; +import { IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IRequestService } from 'vs/platform/request/common/request'; +import { loadLocalResource, webviewPartitionId, WebviewResourceResponse } from 'vs/platform/webview/common/resourceLoader'; +import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; + +interface WebviewMetadata { + readonly extensionLocation: URI | undefined; + readonly localResourceRoots: readonly URI[]; + readonly remoteConnectionData: IRemoteConnectionData | null; +} export class WebviewProtocolProvider extends Disposable { - private readonly webviewMetadata = new Map(); + private static validWebviewFilePaths = new Map([ + ['/index.html', 'index.html'], + ['/electron-browser/index.html', 'index.html'], + ['/main.js', 'main.js'], + ['/host.js', 'host.js'], + ]); + + private readonly webviewMetadata = new Map(); constructor( @IFileService private readonly fileService: IFileService, + @IRequestService private readonly requestService: IRequestService, ) { super(); - protocol.registerStreamProtocol(Schemas.vscodeWebviewResource, async (request, callback): Promise => { - try { - const uri = URI.parse(request.url); + const sess = session.fromPartition(webviewPartitionId); - const id = uri.authority; - const metadata = this.webviewMetadata.get(id); - if (metadata) { - const result = await loadLocalResourceStream(uri, this.fileService, metadata.extensionLocation, metadata.localResourceRoots); - if (result.type === WebviewResourceResponse.Type.Success) { - return callback({ - statusCode: 200, - data: streamToNodeReadable(result.stream), - headers: { - 'Content-Type': result.mimeType, - 'Access-Control-Allow-Origin': '*', + // Register the protocol loading webview html + const webviewHandler = this.handleWebviewRequest.bind(this); + protocol.registerFileProtocol(Schemas.vscodeWebview, webviewHandler); + sess.protocol.registerFileProtocol(Schemas.vscodeWebview, webviewHandler); + + // Register the protocol loading webview resources both inside the webview and at the top level + const webviewResourceHandler = this.handleWebviewResourceRequest.bind(this); + protocol.registerStreamProtocol(Schemas.vscodeWebviewResource, webviewResourceHandler); + sess.protocol.registerStreamProtocol(Schemas.vscodeWebviewResource, webviewResourceHandler); + + this._register(toDisposable(() => { + protocol.unregisterProtocol(Schemas.vscodeWebviewResource); + sess.protocol.unregisterProtocol(Schemas.vscodeWebviewResource); + protocol.unregisterProtocol(Schemas.vscodeWebview); + sess.protocol.unregisterProtocol(Schemas.vscodeWebview); + })); + } + + private streamToNodeReadable(stream: VSBufferReadableStream): Readable { + return new class extends Readable { + private listening = false; + + _read(size?: number): void { + if (!this.listening) { + this.listening = true; + + // Data + stream.on('data', data => { + try { + if (!this.push(data.buffer)) { + stream.pause(); // pause the stream if we should not push anymore } - }); - } + } catch (error) { + this.emit(error); + } + }); - if (result.type === WebviewResourceResponse.Type.AccessDenied) { - console.error('Webview: Cannot load resource outside of protocol root'); - return callback({ data: null, statusCode: 401 }); - } + // End + stream.on('end', () => { + try { + this.push(null); // signal EOS + } catch (error) { + this.emit(error); + } + }); + + // Error + stream.on('error', error => this.emit('error', error)); } - } catch { - // noop + + // ensure the stream is flowing + stream.resume(); } - return callback({ data: null, statusCode: 404 }); - }); + _destroy(error: Error | null, callback: (error: Error | null) => void): void { + stream.destroy(); - this._register(toDisposable(() => protocol.unregisterProtocol(Schemas.vscodeWebviewResource))); + callback(null); + } + }; } - public registerWebview(id: string, extensionLocation: URI | undefined, localResourceRoots: readonly URI[]): void { - this.webviewMetadata.set(id, { extensionLocation, localResourceRoots }); + public async registerWebview(id: string, metadata: WebviewMetadata): Promise { + this.webviewMetadata.set(id, metadata); } - public unreigsterWebview(id: string): void { + public unregisterWebview(id: string): void { this.webviewMetadata.delete(id); } - public updateLocalResourceRoots(id: string, localResourceRoots: readonly URI[]) { + public async updateWebviewMetadata(id: string, metadataDelta: Partial): Promise { const entry = this.webviewMetadata.get(id); if (entry) { this.webviewMetadata.set(id, { - extensionLocation: entry.extensionLocation, - localResourceRoots: localResourceRoots, + ...entry, + ...metadataDelta, }); } } + + private async handleWebviewRequest(request: Electron.Request, callback: any) { + try { + const uri = URI.parse(request.url); + const entry = WebviewProtocolProvider.validWebviewFilePaths.get(uri.path); + if (typeof entry === 'string') { + let url: string; + if (uri.path.startsWith('/electron-browser')) { + url = require.toUrl(`vs/workbench/contrib/webview/electron-browser/pre/${entry}`); + } else { + url = require.toUrl(`vs/workbench/contrib/webview/browser/pre/${entry}`); + } + return callback(decodeURIComponent(url.replace('file://', ''))); + } + } catch { + // noop + } + callback({ error: -10 /* ACCESS_DENIED - https://cs.chromium.org/chromium/src/net/base/net_error_list.h?l=32 */ }); + } + + private async handleWebviewResourceRequest( + request: Electron.Request, + callback: (stream?: NodeJS.ReadableStream | Electron.StreamProtocolResponse | undefined) => void + ) { + try { + const uri = URI.parse(request.url); + + const id = uri.authority; + const metadata = this.webviewMetadata.get(id); + if (metadata) { + + // Try to further rewrite remote uris so that they go to the resolved server on the main thread + let rewriteUri: undefined | ((uri: URI) => URI); + if (metadata.remoteConnectionData) { + rewriteUri = (uri) => { + if (metadata.remoteConnectionData) { + if (uri.scheme === Schemas.vscodeRemote || (metadata.extensionLocation?.scheme === REMOTE_HOST_SCHEME)) { + return URI.parse(`http://${metadata.remoteConnectionData.host}:${metadata.remoteConnectionData.port}`).with({ + path: '/vscode-remote-resource', + query: `tkn=${metadata.remoteConnectionData.connectionToken}&path=${encodeURIComponent(uri.path)}`, + }); + } + } + return uri; + }; + } + + const result = await loadLocalResource(uri, { + extensionLocation: metadata.extensionLocation, + roots: metadata.localResourceRoots, + remoteConnectionData: metadata.remoteConnectionData, + rewriteUri, + }, this.fileService, this.requestService); + + if (result.type === WebviewResourceResponse.Type.Success) { + return callback({ + statusCode: 200, + data: this.streamToNodeReadable(result.stream), + headers: { + 'Content-Type': result.mimeType, + 'Access-Control-Allow-Origin': '*', + } + }); + } + + if (result.type === WebviewResourceResponse.Type.AccessDenied) { + console.error('Webview: Cannot load resource outside of protocol root'); + return callback({ data: null, statusCode: 401 }); + } + } + } catch { + // noop + } + + return callback({ data: null, statusCode: 404 }); + } } diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index d0bc4f841bb..8df91e318a8 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -33,9 +33,6 @@ export const enum WindowMode { export interface ICodeWindow extends IDisposable { - readonly onClose: Event; - readonly onDestroy: Event; - readonly whenClosedOrLoaded: Promise; readonly id: number; diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts index 7320936684c..cb12f90775b 100644 --- a/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -15,7 +15,7 @@ import { ParsedArgs } from 'vs/platform/environment/node/argv'; import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IStateService } from 'vs/platform/state/node/state'; import { CodeWindow, defaultWindowState } from 'vs/code/electron-main/window'; -import { ipcMain as ipc, screen, BrowserWindow, MessageBoxOptions, Display, app, nativeTheme } from 'electron'; +import { screen, BrowserWindow, MessageBoxOptions, Display, app, nativeTheme } from 'electron'; import { ILifecycleMainService, UnloadReason, LifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; @@ -212,19 +212,6 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic private registerListeners(): void { - // React to workbench ready events from windows - ipc.on('vscode:workbenchReady', (event: Event, windowId: number) => { - this.logService.trace('IPC#vscode-workbenchReady'); - - const win = this.getWindowById(windowId); - if (win) { - win.setReady(); - - // Event - this._onWindowReady.fire(win); - } - }); - // React to HC color scheme changes (Windows) if (isWindows) { nativeTheme.on('updated', () => { @@ -265,13 +252,13 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic // Note that onBeforeShutdown() and onBeforeWindowClose() are fired in different order depending on the OS: // - macOS: since the app will not quit when closing the last window, you will always first get - // the onBeforeShutdown() event followed by N onbeforeWindowClose() events for each window + // the onBeforeShutdown() event followed by N onBeforeWindowClose() events for each window // - other: on other OS, closing the last window will quit the app so the order depends on the // user interaction: closing the last window will first trigger onBeforeWindowClose() // and then onBeforeShutdown(). Using the quit action however will first issue onBeforeShutdown() // and then onBeforeWindowClose(). // - // Here is the behaviour on different OS dependig on action taken (Electron 1.7.x): + // Here is the behavior on different OS depending on action taken (Electron 1.7.x): // // Legend // - quit(N): quit application with N windows opened @@ -333,7 +320,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic // 3.) All windows (except extension host) for N >= 2 to support restoreWindows: all or for auto update // - // Carefull here: asking a window for its window state after it has been closed returns bogus values (width: 0, height: 0) + // Careful here: asking a window for its window state after it has been closed returns bogus values (width: 0, height: 0) // so if we ever want to persist the UI state of the last closed window (window count === 1), it has // to come from the stored lastClosedWindowState on Win/Linux at least if (this.getWindowCount() > 1) { @@ -1434,24 +1421,25 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic if (options.forceNewTabbedWindow) { const activeWindow = this.getLastActiveWindow(); if (activeWindow) { - activeWindow.addTabbedWindow(window); + activeWindow.addTabbedWindow(createdWindow); } } // Add to our list of windows - WindowsMainService.WINDOWS.push(window); + WindowsMainService.WINDOWS.push(createdWindow); // Indicate number change via event this._onWindowsCountChanged.fire({ oldCount: WindowsMainService.WINDOWS.length - 1, newCount: WindowsMainService.WINDOWS.length }); // Window Events - once(window.onClose)(() => this.onWindowClosed(createdWindow)); - once(window.onDestroy)(() => this.onBeforeWindowClose(createdWindow)); // try to save state before destroy because close will not fire - window.win.webContents.removeAllListeners('devtools-reload-page'); // remove built in listener so we can handle this on our own - window.win.webContents.on('devtools-reload-page', () => this.lifecycleMainService.reload(createdWindow)); + once(createdWindow.onReady)(() => this._onWindowReady.fire(createdWindow)); + once(createdWindow.onClose)(() => this.onWindowClosed(createdWindow)); + once(createdWindow.onDestroy)(() => this.onBeforeWindowClose(createdWindow)); // try to save state before destroy because close will not fire + createdWindow.win.webContents.removeAllListeners('devtools-reload-page'); // remove built in listener so we can handle this on our own + createdWindow.win.webContents.on('devtools-reload-page', () => this.lifecycleMainService.reload(createdWindow)); // Lifecycle - (this.lifecycleMainService as LifecycleMainService).registerWindow(window); + (this.lifecycleMainService as LifecycleMainService).registerWindow(createdWindow); } // Existing window diff --git a/src/vs/platform/workspaces/common/workspaces.ts b/src/vs/platform/workspaces/common/workspaces.ts index ab4f15dacfb..264416060d7 100644 --- a/src/vs/platform/workspaces/common/workspaces.ts +++ b/src/vs/platform/workspaces/common/workspaces.ts @@ -319,22 +319,7 @@ interface ISerializedRecentlyOpened { fileLabels?: Array; // added in 1.33 } -interface ILegacySerializedRecentlyOpened { - workspaces2: Array; // legacy, configPath as file path - workspaces: Array; // legacy (UriComponents was also supported for a few insider builds) - files: string[]; // files as paths -} - interface ISerializedWorkspace { id: string; configURIPath: string; } -interface ILegacySerializedWorkspace { id: string; configPath: string; } - -function isLegacySerializedWorkspace(curr: any): curr is ILegacySerializedWorkspace { - return typeof curr === 'object' && typeof curr['id'] === 'string' && typeof curr['configPath'] === 'string'; -} - -function isUriComponents(curr: any): curr is UriComponents { - return curr && typeof curr['path'] === 'string' && typeof curr['scheme'] === 'string'; -} export type RecentlyOpenedStorageData = object; @@ -351,7 +336,7 @@ export function restoreRecentlyOpened(data: RecentlyOpenedStorageData | undefine } }; - const storedRecents = data as ISerializedRecentlyOpened & ILegacySerializedRecentlyOpened; + const storedRecents = data as ISerializedRecentlyOpened; if (Array.isArray(storedRecents.workspaces3)) { restoreGracefully(storedRecents.workspaces3, (workspace, i) => { const label: string | undefined = (Array.isArray(storedRecents.workspaceLabels) && storedRecents.workspaceLabels[i]) || undefined; @@ -361,27 +346,6 @@ export function restoreRecentlyOpened(data: RecentlyOpenedStorageData | undefine result.workspaces.push({ label, folderUri: URI.parse(workspace) }); } }); - } else if (Array.isArray(storedRecents.workspaces2)) { - restoreGracefully(storedRecents.workspaces2, workspace => { - if (typeof workspace === 'object' && typeof workspace.id === 'string' && typeof workspace.configPath === 'string') { - result.workspaces.push({ workspace: { id: workspace.id, configPath: URI.file(workspace.configPath) } }); - } else if (typeof workspace === 'string') { - result.workspaces.push({ folderUri: URI.parse(workspace) }); - } - }); - } else if (Array.isArray(storedRecents.workspaces)) { - // TODO@martin legacy support can be removed at some point (6 month?) - // format of 1.25 and before - restoreGracefully(storedRecents.workspaces, workspace => { - if (typeof workspace === 'string') { - result.workspaces.push({ folderUri: URI.file(workspace) }); - } else if (isLegacySerializedWorkspace(workspace)) { - result.workspaces.push({ workspace: { id: workspace.id, configPath: URI.file(workspace.configPath) } }); - } else if (isUriComponents(workspace)) { - // added by 1.26-insiders - result.workspaces.push({ folderUri: URI.revive(workspace) }); - } - }); } if (Array.isArray(storedRecents.files2)) { restoreGracefully(storedRecents.files2, (file, i) => { @@ -390,12 +354,6 @@ export function restoreRecentlyOpened(data: RecentlyOpenedStorageData | undefine result.files.push({ label, fileUri: URI.parse(file) }); } }); - } else if (Array.isArray(storedRecents.files)) { - restoreGracefully(storedRecents.files, file => { - if (typeof file === 'string') { - result.files.push({ fileUri: URI.file(file) }); - } - }); } } diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index d0fbc12c77a..13967f1486f 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -185,8 +185,8 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain }; } - getWorkspaceIdentifier(configPath: URI): Promise { - return Promise.resolve(getWorkspaceIdentifier(configPath)); + async getWorkspaceIdentifier(configPath: URI): Promise { + return getWorkspaceIdentifier(configPath); } isUntitledWorkspace(workspace: IWorkspaceIdentifier): boolean { @@ -205,9 +205,8 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain this._onUntitledWorkspaceDeleted.fire(workspace); } - deleteUntitledWorkspace(workspace: IWorkspaceIdentifier): Promise { + async deleteUntitledWorkspace(workspace: IWorkspaceIdentifier): Promise { this.deleteUntitledWorkspaceSync(workspace); - return Promise.resolve(); } private doDeleteUntitledWorkspaceSync(workspace: IWorkspaceIdentifier): void { diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts index ecdc561c986..c1637320630 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts @@ -98,92 +98,6 @@ suite('History Storage', () => { assertRestoring(ro, 'labels'); }); - test('open 1_25', () => { - const v1_25_win = `{ - "workspaces": [ - { - "id": "2fa677dbdf5f771e775af84dea9feaea", - "configPath": "C:\\\\workspaces\\\\testing\\\\test.code-workspace" - }, - "C:\\\\workspaces\\\\testing\\\\test-ext", - { - "id": "d87a0241f8abc86b95c4e5481ebcbf56", - "configPath": "C:\\\\workspaces\\\\test.code-workspace" - } - ], - "files": [ - "C:\\\\workspaces\\\\test.code-workspace", - "C:\\\\workspaces\\\\testing\\\\test-ext\\\\.gitignore" - ] - }`; - - let actual = restoreRecentlyOpened(JSON.parse(v1_25_win), new NullLogService()); - let expected: IRecentlyOpened = { - files: [{ fileUri: URI.file('C:\\workspaces\\test.code-workspace') }, { fileUri: URI.file('C:\\workspaces\\testing\\test-ext\\.gitignore') }], - workspaces: [ - { workspace: { id: '2fa677dbdf5f771e775af84dea9feaea', configPath: URI.file('C:\\workspaces\\testing\\test.code-workspace') } }, - { folderUri: URI.file('C:\\workspaces\\testing\\test-ext') }, - { workspace: { id: 'd87a0241f8abc86b95c4e5481ebcbf56', configPath: URI.file('C:\\workspaces\\test.code-workspace') } } - ] - }; - - assertEqualRecentlyOpened(actual, expected, 'v1_31_win'); - }); - - test('open 1_31', () => { - const v1_31_win = `{ - "workspaces2": [ - "file:///c%3A/workspaces/testing/test-ext", - "file:///c%3A/WINDOWS/system32", - { - "id": "d87a0241f8abc86b95c4e5481ebcbf56", - "configPath": "c:\\\\workspaces\\\\test.code-workspace" - } - ], - "files2": [ - "file:///c%3A/workspaces/vscode/.yarnrc" - ] - }`; - - let actual = restoreRecentlyOpened(JSON.parse(v1_31_win), new NullLogService()); - let expected: IRecentlyOpened = { - files: [{ fileUri: URI.parse('file:///c%3A/workspaces/vscode/.yarnrc') }], - workspaces: [ - { folderUri: URI.parse('file:///c%3A/workspaces/testing/test-ext') }, - { folderUri: URI.parse('file:///c%3A/WINDOWS/system32') }, - { workspace: { id: 'd87a0241f8abc86b95c4e5481ebcbf56', configPath: URI.file('c:\\workspaces\\test.code-workspace') } } - ] - }; - - assertEqualRecentlyOpened(actual, expected, 'v1_31_win'); - }); - - test('open 1_32', () => { - const v1_32 = `{ - "workspaces3": [ - { - "id": "53b714b46ef1a2d4346568b4f591028c", - "configURIPath": "file:///home/user/workspaces/testing/custom.code-workspace" - }, - "file:///home/user/workspaces/testing/folding" - ], - "files2": [ - "file:///home/user/.config/code-oss-dev/storage.json" - ] - }`; - - let windowsState = restoreRecentlyOpened(JSON.parse(v1_32), new NullLogService()); - let expected: IRecentlyOpened = { - files: [{ fileUri: URI.parse('file:///home/user/.config/code-oss-dev/storage.json') }], - workspaces: [ - { workspace: { id: '53b714b46ef1a2d4346568b4f591028c', configPath: URI.parse('file:///home/user/workspaces/testing/custom.code-workspace') } }, - { folderUri: URI.parse('file:///home/user/workspaces/testing/folding') } - ] - }; - - assertEqualRecentlyOpened(windowsState, expected, 'v1_32'); - }); - test('open 1_33', () => { const v1_33 = `{ "workspaces3": [ diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index b9a5577777d..7d8e42b70fc 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -1730,6 +1730,14 @@ declare module 'vscode' { * ``` */ filters?: { [name: string]: string[] }; + + /** + * Dialog title. + * + * This parameter might be ignored, as not all operating systems display a title on open dialogs + * (for example, macOS). + */ + title?: string; } /** @@ -1757,6 +1765,14 @@ declare module 'vscode' { * ``` */ filters?: { [name: string]: string[] }; + + /** + * Dialog title. + * + * This parameter might be ignored, as not all operating systems display a title on save dialogs + * (for example, macOS). + */ + title?: string; } /** @@ -2228,6 +2244,40 @@ declare module 'vscode' { * such as `[CodeActionKind.Refactor.Extract.append('function'), CodeActionKind.Refactor.Extract.append('constant'), ...]`. */ readonly providedCodeActionKinds?: ReadonlyArray; + + /** + * Static documentation for a class of code actions. + * + * Documentation from the provider is shown in the code actions menu if either: + * + * - Code actions of `kind` are requested by VS Code. In this case, VS Code will show the documentation that + * most closely matches the requested code action kind. For example, if a provider has documentation for + * both `Refactor` and `RefactorExtract`, when the user requests code actions for `RefactorExtract`, + * VS Code will use the documentation for `RefactorExtract` instead of the documentation for `Refactor`. + * + * - Any code actions of `kind` are returned by the provider. + * + * At most one documentation entry will be shown per provider. + */ + readonly documentation?: ReadonlyArray<{ + /** + * The kind of the code action being documented. + * + * If the kind is generic, such as `CodeActionKind.Refactor`, the documentation will be shown whenever any + * refactorings are returned. If the kind if more specific, such as `CodeActionKind.RefactorExtract`, the + * documentation will only be shown when extract refactoring code actions are returned. + */ + readonly kind: CodeActionKind; + + /** + * Command that displays the documentation to the user. + * + * This can display the documentation directly in VS Code or open a website using [`env.openExternal`](#env.openExternal); + * + * The title of this documentation code action is taken from [`Command.title`](#Command.title) + */ + readonly command: Command; + }>; } /** @@ -2270,7 +2320,7 @@ declare module 'vscode' { * A code lens provider adds [commands](#Command) to source text. The commands will be shown * as dedicated horizontal lines in between the source text. */ - export interface CodeLensProvider { + export interface CodeLensProvider { /** * An optional event to signal that the code lenses from this provider have changed. @@ -2802,7 +2852,7 @@ declare module 'vscode' { * The workspace symbol provider interface defines the contract between extensions and * the [symbol search](https://code.visualstudio.com/docs/editor/editingevolved#_open-symbol-by-name)-feature. */ - export interface WorkspaceSymbolProvider { + export interface WorkspaceSymbolProvider { /** * Project-wide search for a symbol matching the given query string. @@ -3861,7 +3911,7 @@ declare module 'vscode' { * Represents a collection of [completion items](#CompletionItem) to be presented * in the editor. */ - export class CompletionList { + export class CompletionList { /** * This list is not complete. Further typing should result in recomputing @@ -3934,7 +3984,7 @@ declare module 'vscode' { * Providers are asked for completions either explicitly by a user gesture or -depending on the configuration- * implicitly when typing words or trigger characters. */ - export interface CompletionItemProvider { + export interface CompletionItemProvider { /** * Provide completion items for the given position and document. @@ -4009,7 +4059,7 @@ declare module 'vscode' { * The document link provider defines the contract between extensions and feature of showing * links in the editor. */ - export interface DocumentLinkProvider { + export interface DocumentLinkProvider { /** * Provide links for the given document. Note that the editor ships with a default provider that detects @@ -5188,6 +5238,24 @@ declare module 'vscode' { dispose(): void; } + /** + * Accessibility information which controls screen reader behavior. + */ + export interface AccessibilityInformation { + /** + * Label to be read out by a screen reader once the item has focus. + */ + label: string; + + /** + * Role of the widget which defines how a screen reader interacts with it. + * The role should be set in special cases when for example a tree-like element behaves like a checkbox. + * If role is not specified VS Code will pick the appropriate role automatically. + * More about aria roles can be found here https://w3c.github.io/aria/#widget_roles + */ + role?: string; + } + /** * Represents the alignment of status bar items. */ @@ -5251,6 +5319,11 @@ declare module 'vscode' { */ command: string | Command | undefined; + /** + * Accessibility information used when screen reader interacts with this StatusBar item + */ + accessibilityInformation?: AccessibilityInformation; + /** * Shows the entry in the status bar. */ @@ -5420,6 +5493,30 @@ declare module 'vscode' { activate(): Thenable; } + /** + * The ExtensionMode is provided on the `ExtensionContext` and indicates the + * mode the specific extension is running in. + */ + export enum ExtensionMode { + /** + * The extension is installed normally (for example, from the marketplace + * or VSIX) in VS Code. + */ + Production = 1, + + /** + * The extension is running from an `--extensionDevelopmentPath` provided + * when launching VS Code. + */ + Development = 2, + + /** + * The extension is running from an `--extensionTestsPath` and + * the extension host is running unit tests. + */ + Test = 3, + } + /** * An extension context is a collection of utilities private to an * extension. @@ -5497,6 +5594,13 @@ declare module 'vscode' { * the parent directory is guaranteed to be existent. */ readonly logPath: string; + + /** + * The mode the extension is running in. This is specific to the current + * extension. One extension may be in `ExtensionMode.Development` while + * other extensions in the host run in `ExtensionMode.Release`. + */ + readonly extensionMode: ExtensionMode; } /** @@ -6041,7 +6145,7 @@ declare module 'vscode' { * A task provider allows to add tasks to the task service. * A task provider is registered via #tasks.registerTaskProvider. */ - export interface TaskProvider { + export interface TaskProvider { /** * Provides tasks. * @param token A cancellation token. @@ -8311,6 +8415,13 @@ declare module 'vscode' { */ contextValue?: string; + /** + * Accessibility information used when screen reader interacts with this tree item. + * Generally, a TreeItem has no need to set the `role` of the accessibilityInformation; + * however, there are cases where a TreeItem is not displayed in a tree-like way where setting the `role` may make sense. + */ + accessibilityInformation?: AccessibilityInformation; + /** * @param label A human-readable string describing this item * @param collapsibleState [TreeItemCollapsibleState](#TreeItemCollapsibleState) of the tree item. Default is [TreeItemCollapsibleState.None](#TreeItemCollapsibleState.None) @@ -9284,7 +9395,7 @@ declare module 'vscode' { /** * A workspace folder is one of potentially many roots opened by the editor. All workspace folders - * are equal which means there is no notion of an active or master workspace folder. + * are equal which means there is no notion of an active or primary workspace folder. */ export interface WorkspaceFolder { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index d57b28b2e6a..0cc285c6071 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { MarkdownString } from 'vscode'; + /** * This is the place for API experiments and proposals. * These API are NOT stable and subject to change. They are only available in the Insiders @@ -18,17 +20,7 @@ declare module 'vscode' { // #region auth provider: https://github.com/microsoft/vscode/issues/88309 - export interface AuthenticationSession { - id: string; - getAccessToken(): Thenable; - account: { - displayName: string; - id: string; - }; - scopes: string[]; - } - - export class AuthenticationSession2 { + export class AuthenticationSession { /** * The identifier of the authentication session. */ @@ -146,12 +138,12 @@ declare module 'vscode' { /** * Returns an array of current sessions. */ - getSessions(): Thenable>; + getSessions(): Thenable>; /** * Prompts a user to login. */ - login(scopes: string[]): Thenable; + login(scopes: string[]): Thenable; /** * Removes the session corresponding to session id. @@ -184,13 +176,14 @@ declare module 'vscode' { export function getProviderIds(): Thenable>; /** + * @deprecated * An array of the ids of authentication providers that are currently registered. */ export const providerIds: string[]; /** * Returns whether a provider has any sessions matching the requested scopes. This request - * is transparent to the user, not UI is shown. Rejects if a provider with providerId is not + * is transparent to the user, no UI is shown. Rejects if a provider with providerId is not * registered. * @param providerId The id of the provider * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication @@ -209,7 +202,7 @@ declare module 'vscode' { * @param options The [getSessionOptions](#GetSessionOptions) to use * @returns A thenable that resolves to an authentication session */ - export function getSession(providerId: string, scopes: string[], options: AuthenticationGetSessionOptions & { createIfNone: true }): Thenable; + export function getSession(providerId: string, scopes: string[], options: AuthenticationGetSessionOptions & { createIfNone: true }): Thenable; /** * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not @@ -221,29 +214,7 @@ declare module 'vscode' { * @param options The [getSessionOptions](#GetSessionOptions) to use * @returns A thenable that resolves to an authentication session if available, or undefined if there are no sessions */ - export function getSession(providerId: string, scopes: string[], options: AuthenticationGetSessionOptions): Thenable; - - /** - * @deprecated - * Get existing authentication sessions. Rejects if a provider with providerId is not - * registered, or if the user does not consent to sharing authentication information with - * the extension. - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication - * provider - */ - export function getSessions(providerId: string, scopes: string[]): Thenable>; - - /** - * @deprecated - * Prompt a user to login to create a new authenticaiton session. Rejects if a provider with - * providerId is not registered, or if the user does not consent to sharing authentication - * information with the extension. - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication - * provider - */ - export function login(providerId: string, scopes: string[]): Thenable; + export function getSession(providerId: string, scopes: string[], options: AuthenticationGetSessionOptions): Thenable; /** * @deprecated @@ -854,8 +825,16 @@ declare module 'vscode' { export interface DebugSessionOptions { /** * Controls whether this session should run without debugging, thus ignoring breakpoints. + * When this property is not specified, the value from the parent session (if there is one) is used. */ noDebug?: boolean; + + /** + * Controls if the debug session's parent session is shown in the CALL STACK view even if it has only a single child. + * By default, the debug session will never hide its parent. + * If compact is true, debug sessions with a single child are hidden in the CALL STACK view to make the tree more compact. + */ + compact?: boolean; } // deprecated debug API @@ -1053,6 +1032,62 @@ declare module 'vscode' { //#endregion + //#region Terminal link provider https://github.com/microsoft/vscode/issues/91606 + + export namespace window { + export function registerTerminalLinkProvider(provider: TerminalLinkProvider): Disposable; + } + + export interface TerminalLinkContext { + /** + * This is the text from the unwrapped line in the terminal. + */ + line: string; + + /** + * The terminal the link belongs to. + */ + terminal: Terminal; + } + + export interface TerminalLinkProvider { + /** + * Provide terminal links for the given context. Note that this can be called multiple times + * even before previous calls resolve, make sure to not share global objects (eg. `RegExp`) + * that could have problems when asynchronous usage may overlap. + * @param context Information about what links are being provided for. + */ + provideTerminalLinks(context: TerminalLinkContext): ProviderResult + + /** + * Handle an activated terminal link. + */ + handleTerminalLink(link: T): void; + } + + export interface TerminalLink { + /** + * The 0-based start index of the link on [TerminalLinkContext.line](#TerminalLinkContext.line]. + */ + startIndex: number; + + /** + * The 0-based end index of the link on [TerminalLinkContext.line](#TerminalLinkContext.line]. + */ + endIndex: number; + + /** + * The tooltip text when you hover over this link. + * + * If a tooltip is provided, is will be displayed in a string that includes instructions on + * how to trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary + * depending on OS, user settings, and localization. + */ + tooltip?: string; + } + + //#endregion + //#region @jrieken -> exclusive document filters export interface DocumentFilter { @@ -1089,6 +1124,11 @@ declare module 'vscode' { } + // https://github.com/microsoft/vscode/issues/100741 + export interface TreeDataProvider { + resolveTreeItem?(element: T, item: TreeItem2): TreeItem2 | Thenable; + } + export class TreeItem2 extends TreeItem { /** * Label describing this item. When `falsy`, it is derived from [resourceUri](#TreeItem.resourceUri). @@ -1096,9 +1136,9 @@ declare module 'vscode' { label?: string | TreeItemLabel | /* for compilation */ any; /** - * Accessibility information used when screen reader interacts with this tree item. + * Content to be shown when you hover over the tree item. */ - accessibilityInformation?: AccessibilityInformation; + tooltip?: string | MarkdownString | /* for compilation */ any; /** * @param label Label describing this item @@ -1458,10 +1498,15 @@ declare module 'vscode' { version: number; getText(): string; getText(range: Range): string; + offsetAt(position: Position): number; positionAt(offset: number): Position; + validateRange(range: Range): Range; + validatePosition(position: Position): Position; + locationAt(positionOrRange: Position | Range): Location; positionAt(location: Location): Position; + contains(uri: Uri): boolean } export interface NotebookEditorCellEdit { @@ -1522,8 +1567,13 @@ declare module 'vscode' { } export interface NotebookOutputSelector { - type: string; - subTypes?: string[]; + mimeTypes?: string[]; + } + + export interface NotebookRenderRequest { + output: CellDisplayOutput; + mimeType: string; + outputId: string; } export interface NotebookOutputRenderer { @@ -1532,8 +1582,23 @@ declare module 'vscode' { * @returns HTML fragment. We can probably return `CellOutput` instead of string ? * */ - render(document: NotebookDocument, output: CellDisplayOutput, mimeType: string): string; - preloads?: Uri[]; + render(document: NotebookDocument, request: NotebookRenderRequest): string; + + /** + * Call before HTML from the renderer is executed, and will be called for + * every editor associated with notebook documents where the renderer + * is or was used. + * + * The communication object will only send and receive messages to the + * render API, retrieved via `acquireNotebookRendererApi`, acquired with + * this specific renderer's ID. + * + * If you need to keep an association between the communication object + * and the document for use in the `render()` method, you can use a WeakMap. + */ + resolveNotebook?(document: NotebookDocument, communication: NotebookCommunication): void; + + readonly preloads?: Uri[]; } export interface NotebookCellsChangeData { @@ -1595,7 +1660,7 @@ declare module 'vscode' { readonly metadata: NotebookDocumentMetadata; } - interface NotebookDocumentEditEvent { + interface NotebookDocumentContentChangeEvent { /** * The document that the edit is for. @@ -1603,14 +1668,103 @@ declare module 'vscode' { readonly document: NotebookDocument; } + interface NotebookDocumentEditEvent { + + /** + * The document that the edit is for. + */ + readonly document: NotebookDocument; + + /** + * Undo the edit operation. + * + * This is invoked by VS Code when the user undoes this edit. To implement `undo`, your + * extension should restore the document and editor to the state they were in just before this + * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. + */ + undo(): Thenable | void; + + /** + * Redo the edit operation. + * + * This is invoked by VS Code when the user redoes this edit. To implement `redo`, your + * extension should restore the document and editor to the state they were in just after this + * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. + */ + redo(): Thenable | void; + + /** + * Display name describing the edit. + * + * This will be shown to users in the UI for undo/redo operations. + */ + readonly label?: string; + } + + interface NotebookDocumentBackup { + /** + * Unique identifier for the backup. + * + * This id is passed back to your extension in `openCustomDocument` when opening a custom editor from a backup. + */ + readonly id: string; + + /** + * Delete the current backup. + * + * This is called by VS Code when it is clear the current backup is no longer needed, such as when a new backup + * is made or when the file is saved. + */ + delete(): void; + } + + interface NotebookDocumentBackupContext { + readonly destination: Uri; + } + + interface NotebookDocumentOpenContext { + readonly backupId?: string; + } + + /** + * Communication object passed to the {@link NotebookContentProvider} and + * {@link NotebookOutputRenderer} to communicate with the webview. + */ + export interface NotebookCommunication { + /** + * ID of the editor this object communicates with. A single notebook + * document can have multiple attached webviews and editors, when the + * notebook is split for instance. The editor ID lets you differentiate + * between them. + */ + readonly editorId: string; + + /** + * Fired when the output hosting webview posts a message. + */ + readonly onDidReceiveMessage: Event; + /** + * Post a message to the output hosting webview. + * + * Messages are only delivered if the editor is live. + * + * @param message Body of the message. This must be a string or other json serilizable object. + */ + postMessage(message: any): Thenable; + + /** + * Convert a uri for the local file system to one that can be used inside outputs webview. + */ + asWebviewUri(localResource: Uri): Uri; + } + export interface NotebookContentProvider { - openNotebook(uri: Uri): NotebookData | Promise; + openNotebook(uri: Uri, openContext: NotebookDocumentOpenContext): NotebookData | Promise; + resolveNotebook(document: NotebookDocument, webview: NotebookCommunication): Promise; saveNotebook(document: NotebookDocument, cancellation: CancellationToken): Promise; saveNotebookAs(targetResource: Uri, document: NotebookDocument, cancellation: CancellationToken): Promise; - readonly onDidChangeNotebook: Event; - - // revert?(document: NotebookDocument, cancellation: CancellationToken): Thenable; - // backup?(document: NotebookDocument, cancellation: CancellationToken): Thenable; + readonly onDidChangeNotebook: Event; + backupNotebook(document: NotebookDocument, context: NotebookDocumentBackupContext, cancellation: CancellationToken): Promise; kernel?: NotebookKernel; } @@ -1668,43 +1822,6 @@ declare module 'vscode' { //#endregion - //#region @connor4312 extension mode: https://github.com/microsoft/vscode/issues/95926 - - /** - * The ExtensionMode is provided on the `ExtensionContext` and indicates the - * mode the specific extension is running in. - */ - export enum ExtensionMode { - /** - * The extension is installed normally (for example, from the marketplace - * or VSIX) in VS Code. - */ - Release = 1, - - /** - * The extension is running from an `--extensionDevelopmentPath` provided - * when launching VS Code. - */ - Development = 2, - - /** - * The extension is running from an `--extensionDevelopmentPath` and - * the extension host is running unit tests. - */ - Test = 3, - } - - export interface ExtensionContext { - /** - * The mode the extension is running in. This is specific to the current - * extension. One extension may be in `ExtensionMode.Development` while - * other extensions in the host run in `ExtensionMode.Release`. - */ - readonly extensionMode: ExtensionMode; - } - - //#endregion - //#region https://github.com/microsoft/vscode/issues/39441 export interface CompletionItem { @@ -1896,80 +2013,6 @@ declare module 'vscode' { //#endregion - //#region https://github.com/microsoft/vscode/issues/86788 - - export interface CodeActionProviderMetadata { - /** - * Static documentation for a class of code actions. - * - * The documentation is shown in the code actions menu if either: - * - * - Code actions of `kind` are requested by VS Code. In this case, VS Code will show the documentation that - * most closely matches the requested code action kind. For example, if a provider has documentation for - * both `Refactor` and `RefactorExtract`, when the user requests code actions for `RefactorExtract`, - * VS Code will use the documentation for `RefactorExtract` intead of the documentation for `Refactor`. - * - * - Any code actions of `kind` are returned by the provider. - */ - readonly documentation?: ReadonlyArray<{ readonly kind: CodeActionKind, readonly command: Command; }>; - } - - //#endregion - - //#region Dialog title: https://github.com/microsoft/vscode/issues/82871 - - /** - * Options to configure the behaviour of a file open dialog. - * - * * Note 1: A dialog can select files, folders, or both. This is not true for Windows - * which enforces to open either files or folder, but *not both*. - * * Note 2: Explicitly setting `canSelectFiles` and `canSelectFolders` to `false` is futile - * and the editor then silently adjusts the options to select files. - */ - export interface OpenDialogOptions { - /** - * Dialog title. - * - * Depending on the underlying operating system this parameter might be ignored, since some - * systems do not present title on open dialogs. - */ - title?: string; - } - - /** - * Options to configure the behaviour of a file save dialog. - */ - export interface SaveDialogOptions { - /** - * Dialog title. - * - * Depending on the underlying operating system this parameter might be ignored, since some - * systems do not present title on save dialogs. - */ - title?: string; - } - - //#endregion - - //#region Accessibility information: https://github.com/microsoft/vscode/issues/95360 - - /** - * Accessibility information which controls screen reader behavior. - */ - export interface AccessibilityInformation { - label: string; - role?: string; - } - - export interface StatusBarItem { - /** - * Accessibility information used when screen reader interacts with this StatusBar item - */ - accessibilityInformation?: AccessibilityInformation; - } - - //#endregion - //#region https://github.com/microsoft/vscode/issues/91555 export enum StandardTokenType { diff --git a/src/vs/workbench/api/browser/mainThreadAuthentication.ts b/src/vs/workbench/api/browser/mainThreadAuthentication.ts index 3c0e9eaa4c6..f1df047dc5a 100644 --- a/src/vs/workbench/api/browser/mainThreadAuthentication.ts +++ b/src/vs/workbench/api/browser/mainThreadAuthentication.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import * as modes from 'vs/editor/common/modes'; import * as nls from 'vs/nls'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @@ -12,15 +12,13 @@ import { ExtHostAuthenticationShape, ExtHostContext, IExtHostContext, MainContex import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import Severity from 'vs/base/common/severity'; -import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { fromNow } from 'vs/base/common/date'; -const VSO_ALLOWED_EXTENSIONS = ['github.vscode-pull-request-github', 'github.vscode-pull-request-github-insiders', 'vscode.git']; +const VSO_ALLOWED_EXTENSIONS = ['github.vscode-pull-request-github', 'github.vscode-pull-request-github-insiders', 'vscode.git', 'ms-vsonline.vsonline', 'vscode.github-browser']; interface IAccountUsage { extensionId: string; @@ -71,7 +69,6 @@ function addAccountUsage(storageService: IStorageService, providerId: string, ac } export class MainThreadAuthenticationProvider extends Disposable { - private _sessionMenuItems = new Map(); private _accounts = new Map(); // Map account name to session ids private _sessions = new Map(); // Map account id to name @@ -82,7 +79,9 @@ export class MainThreadAuthenticationProvider extends Disposable { public readonly supportsMultipleAccounts: boolean, private readonly notificationService: INotificationService, private readonly storageKeysSyncRegistryService: IStorageKeysSyncRegistryService, - private readonly storageService: IStorageService + private readonly storageService: IStorageService, + private readonly quickInputService: IQuickInputService, + private readonly dialogService: IDialogService ) { super(); } @@ -95,17 +94,17 @@ export class MainThreadAuthenticationProvider extends Disposable { return !!this._sessions.size; } - private manageTrustedExtensions(quickInputService: IQuickInputService, storageService: IStorageService, accountName: string) { - const quickPick = quickInputService.createQuickPick<{ label: string, description: string, extension: AllowedExtension }>(); + public manageTrustedExtensions(accountName: string) { + const quickPick = this.quickInputService.createQuickPick<{ label: string, description: string, extension: AllowedExtension }>(); quickPick.canSelectMany = true; - const allowedExtensions = readAllowedExtensions(storageService, this.id, accountName); - const usages = readAccountUsages(storageService, this.id, accountName); + const allowedExtensions = readAllowedExtensions(this.storageService, this.id, accountName); + const usages = readAccountUsages(this.storageService, this.id, accountName); const items = allowedExtensions.map(extension => { const usage = usages.find(usage => extension.id === usage.extensionId); return { label: extension.name, description: usage - ? nls.localize('accountLastUsedDate', "Last used this account {0}", fromNow(usage.lastUsed, true)) + ? nls.localize({ key: 'accountLastUsedDate', comment: ['The placeholder {0} is a string with time information, such as "3 days ago"'] }, "Last used this account {0}", fromNow(usage.lastUsed, true)) : nls.localize('notUsed', "Has not used this account"), extension }; @@ -118,7 +117,7 @@ export class MainThreadAuthenticationProvider extends Disposable { quickPick.onDidAccept(() => { const updatedAllowedList = quickPick.selectedItems.map(item => item.extension); - storageService.store(`${this.id}-${accountName}`, JSON.stringify(updatedAllowedList), StorageScope.GLOBAL); + this.storageService.store(`${this.id}-${accountName}`, JSON.stringify(updatedAllowedList), StorageScope.GLOBAL); quickPick.dispose(); }); @@ -146,69 +145,23 @@ export class MainThreadAuthenticationProvider extends Disposable { this._accounts.set(session.account.displayName, [session.id]); } - const menuItem = MenuRegistry.appendMenuItem(MenuId.AccountsContext, { - group: '1_accounts', - command: { - id: `configureSessions${session.id}`, - title: `${session.account.displayName} (${this.displayName})` - }, - order: 3 - }); - this.storageKeysSyncRegistryService.registerStorageKey({ key: `${this.id}-${session.account.displayName}`, version: 1 }); - - const manageCommand = CommandsRegistry.registerCommand({ - id: `configureSessions${session.id}`, - handler: (accessor, args) => { - const quickInputService = accessor.get(IQuickInputService); - const storageService = accessor.get(IStorageService); - const dialogService = accessor.get(IDialogService); - - const quickPick = quickInputService.createQuickPick(); - const manage = nls.localize('manageTrustedExtensions', "Manage Trusted Extensions"); - const signOut = nls.localize('signOut', "Sign Out"); - const items = ([{ label: manage }, { label: signOut }]); - - quickPick.items = items; - - quickPick.onDidAccept(e => { - const selected = quickPick.selectedItems[0]; - if (selected.label === signOut) { - this.signOut(dialogService, session); - } - - if (selected.label === manage) { - this.manageTrustedExtensions(quickInputService, storageService, session.account.displayName); - } - - quickPick.dispose(); - }); - - quickPick.onDidHide(_ => { - quickPick.dispose(); - }); - - quickPick.show(); - }, - }); - - this._sessionMenuItems.set(session.account.displayName, [menuItem, manageCommand]); } - async signOut(dialogService: IDialogService, session: modes.AuthenticationSession): Promise { - const accountUsages = readAccountUsages(this.storageService, this.id, session.account.displayName); - const sessionsForAccount = this._accounts.get(session.account.displayName); + async signOut(accountName: string): Promise { + const accountUsages = readAccountUsages(this.storageService, this.id, accountName); + const sessionsForAccount = this._accounts.get(accountName); - const result = await dialogService.confirm({ - title: nls.localize('signOutConfirm', "Sign out of {0}", session.account.displayName), + const result = await this.dialogService.confirm({ + title: nls.localize('signOutConfirm', "Sign out of {0}", accountName), message: accountUsages.length - ? nls.localize('signOutMessagve', "The account {0} has been used by: \n\n{1}\n\n Sign out of these features?", session.account.displayName, accountUsages.map(usage => usage.extensionName).join('\n')) - : nls.localize('signOutMessageSimple', "Sign out of {0}?", session.account.displayName) + ? nls.localize('signOutMessagve', "The account {0} has been used by: \n\n{1}\n\n Sign out of these features?", accountName, accountUsages.map(usage => usage.extensionName).join('\n')) + : nls.localize('signOutMessageSimple', "Sign out of {0}?", accountName) }); if (result.confirmed) { sessionsForAccount?.forEach(sessionId => this.logout(sessionId)); - removeAccountUsage(this.storageService, this.id, session.account.displayName); + removeAccountUsage(this.storageService, this.id, accountName); } } @@ -230,11 +183,6 @@ export class MainThreadAuthenticationProvider extends Disposable { sessionsForAccount.splice(sessionIndex); if (!sessionsForAccount.length) { - const disposeables = this._sessionMenuItems.get(accountName); - if (disposeables) { - disposeables.forEach(disposeable => disposeable.dispose()); - this._sessionMenuItems.delete(accountName); - } this._accounts.delete(accountName); } } @@ -251,12 +199,6 @@ export class MainThreadAuthenticationProvider extends Disposable { await this._proxy.$logout(this.id, sessionId); this.notificationService.info(nls.localize('signedOut', "Successfully signed out.")); } - - dispose(): void { - super.dispose(); - this._sessionMenuItems.forEach(item => item.forEach(d => d.dispose())); - this._sessionMenuItems.clear(); - } } @extHostNamedCustomer(MainContext.MainThreadAuthentication) @@ -294,7 +236,7 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu } async $registerAuthenticationProvider(id: string, displayName: string, supportsMultipleAccounts: boolean): Promise { - const provider = new MainThreadAuthenticationProvider(this._proxy, id, displayName, supportsMultipleAccounts, this.notificationService, this.storageKeysSyncRegistryService, this.storageService); + const provider = new MainThreadAuthenticationProvider(this._proxy, id, displayName, supportsMultipleAccounts, this.notificationService, this.storageKeysSyncRegistryService, this.storageService, this.quickInputService, this.dialogService); await provider.initialize(); this.authenticationService.registerAuthenticationProvider(id, provider); } @@ -394,7 +336,14 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu }); quickPick.items = items; - quickPick.title = nls.localize('selectAccount', "The extension '{0}' wants to access a {1} account", extensionName, providerName); + quickPick.title = nls.localize( + { + key: 'selectAccount', + comment: ['The placeholder {0} is the name of an extension. {1} is the name of the type of account, such as Microsoft or GitHub.'] + }, + "The extension '{0}' wants to access a {1} account", + extensionName, + providerName); quickPick.placeholder = nls.localize('getSessionPlateholder', "Select an account for '{0}' to use or Esc to cancel", extensionName); quickPick.onDidAccept(async _ => { diff --git a/src/vs/workbench/api/browser/mainThreadComments.ts b/src/vs/workbench/api/browser/mainThreadComments.ts index 79dbfca1f18..fad1a18c266 100644 --- a/src/vs/workbench/api/browser/mainThreadComments.ts +++ b/src/vs/workbench/api/browser/mainThreadComments.ts @@ -6,7 +6,6 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { keys } from 'vs/base/common/map'; import { URI, UriComponents } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { IRange } from 'vs/editor/common/core/range'; @@ -284,7 +283,7 @@ export class MainThreadCommentController { async getDocumentComments(resource: URI, token: CancellationToken) { let ret: modes.CommentThread[] = []; - for (let thread of keys(this._threads)) { + for (let thread of [...this._threads.keys()]) { const commentThread = this._threads.get(thread)!; if (commentThread.resource === resource.toString()) { ret.push(commentThread); @@ -315,7 +314,7 @@ export class MainThreadCommentController { getAllComments(): MainThreadCommentThread[] { let ret: MainThreadCommentThread[] = []; - for (let thread of keys(this._threads)) { + for (let thread of [...this._threads.keys()]) { ret.push(this._threads.get(thread)!); } @@ -486,7 +485,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments if (!commentsPanelAlreadyConstructed && !this._openViewListener) { this._openViewListener = this._viewsService.onDidChangeViewVisibility(e => { if (e.id === COMMENTS_VIEW_ID && e.visible) { - keys(this._commentControllers).forEach(handle => { + [...this._commentControllers.keys()].forEach(handle => { let threads = this._commentControllers.get(handle)!.getAllComments(); if (threads.length) { diff --git a/src/vs/workbench/api/browser/mainThreadDebugService.ts b/src/vs/workbench/api/browser/mainThreadDebugService.ts index 96bea2c7fde..1ddadf87184 100644 --- a/src/vs/workbench/api/browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/browser/mainThreadDebugService.ts @@ -231,7 +231,8 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb const debugOptions: IDebugSessionOptions = { noDebug: options.noDebug, parentSession: this.getSession(options.parentSessionID), - repl: options.repl + repl: options.repl, + compact: options.compact }; return this.debugService.startDebugging(launch, nameOrConfig, debugOptions).then(success => { return success; diff --git a/src/vs/workbench/api/browser/mainThreadDecorations.ts b/src/vs/workbench/api/browser/mainThreadDecorations.ts index 08d46a98405..e2f865dfa4e 100644 --- a/src/vs/workbench/api/browser/mainThreadDecorations.ts +++ b/src/vs/workbench/api/browser/mainThreadDecorations.ts @@ -9,33 +9,33 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ExtHostContext, MainContext, IExtHostContext, MainThreadDecorationsShape, ExtHostDecorationsShape, DecorationData, DecorationRequest } from '../common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IDecorationsService, IDecorationData } from 'vs/workbench/services/decorations/browser/decorations'; -import { values } from 'vs/base/common/collections'; import { CancellationToken } from 'vs/base/common/cancellation'; class DecorationRequestsQueue { private _idPool = 0; - private _requests: { [id: number]: DecorationRequest } = Object.create(null); - private _resolver: { [id: number]: (data: DecorationData) => any } = Object.create(null); + private _requests = new Map(); + private _resolver = new Map any>(); private _timer: any; constructor( - private readonly _proxy: ExtHostDecorationsShape + private readonly _proxy: ExtHostDecorationsShape, + private readonly _handle: number ) { // } - enqueue(handle: number, uri: URI, token: CancellationToken): Promise { + enqueue(uri: URI, token: CancellationToken): Promise { const id = ++this._idPool; const result = new Promise(resolve => { - this._requests[id] = { id, handle, uri }; - this._resolver[id] = resolve; + this._requests.set(id, { id, uri }); + this._resolver.set(id, resolve); this._processQueue(); }); token.onCancellationRequested(() => { - delete this._requests[id]; - delete this._resolver[id]; + this._requests.delete(id); + this._resolver.delete(id); }); return result; } @@ -49,15 +49,15 @@ class DecorationRequestsQueue { // make request const requests = this._requests; const resolver = this._resolver; - this._proxy.$provideDecorations(values(requests), CancellationToken.None).then(data => { - for (const id in resolver) { - resolver[id](data[id]); + this._proxy.$provideDecorations(this._handle, [...requests.values()], CancellationToken.None).then(data => { + for (let [id, resolve] of resolver) { + resolve(data[id]); } }); // reset - this._requests = []; - this._resolver = []; + this._requests = new Map(); + this._resolver = new Map(); this._timer = undefined; }, 0); } @@ -68,14 +68,12 @@ export class MainThreadDecorations implements MainThreadDecorationsShape { private readonly _provider = new Map, IDisposable]>(); private readonly _proxy: ExtHostDecorationsShape; - private readonly _requestQueue: DecorationRequestsQueue; constructor( context: IExtHostContext, @IDecorationsService private readonly _decorationsService: IDecorationsService ) { this._proxy = context.getProxy(ExtHostContext.ExtHostDecorations); - this._requestQueue = new DecorationRequestsQueue(this._proxy); } dispose() { @@ -85,23 +83,23 @@ export class MainThreadDecorations implements MainThreadDecorationsShape { $registerDecorationProvider(handle: number, label: string): void { const emitter = new Emitter(); + const queue = new DecorationRequestsQueue(this._proxy, handle); const registration = this._decorationsService.registerDecorationsProvider({ label, onDidChange: emitter.event, - provideDecorations: (uri, token) => { - return this._requestQueue.enqueue(handle, uri, token).then(data => { - if (!data) { - return undefined; - } - const [weight, bubble, tooltip, letter, themeColor] = data; - return { - weight: weight || 0, - bubble: bubble || false, - color: themeColor && themeColor.id, - tooltip, - letter - }; - }); + provideDecorations: async (uri, token) => { + const data = await queue.enqueue(uri, token); + if (!data) { + return undefined; + } + const [weight, bubble, tooltip, letter, themeColor] = data; + return { + weight: weight ?? 0, + bubble: bubble ?? false, + color: themeColor?.id, + tooltip, + letter + }; } }); this._provider.set(handle, [emitter, registration]); diff --git a/src/vs/workbench/api/browser/mainThreadDocuments.ts b/src/vs/workbench/api/browser/mainThreadDocuments.ts index 025dae93162..45e8a6cdd18 100644 --- a/src/vs/workbench/api/browser/mainThreadDocuments.ts +++ b/src/vs/workbench/api/browser/mainThreadDocuments.ts @@ -126,8 +126,12 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { })); this._toDispose.add(workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { - if (e.source && (e.operation === FileOperation.MOVE || e.operation === FileOperation.DELETE)) { - this._modelReferenceCollection.remove(e.source); + if (e.operation === FileOperation.MOVE || e.operation === FileOperation.DELETE) { + for (const { source } of e.files) { + if (source) { + this._modelReferenceCollection.remove(source); + } + } } })); diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index 9a7936d1ffd..c6fdc10d334 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -24,9 +24,9 @@ import { ExtHostContext, ExtHostEditorsShape, IApplyEditsOptions, IExtHostContex import { EditorViewColumn, editorGroupToViewColumn, viewColumnToEditorGroup } from 'vs/workbench/api/common/shared/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { openEditorWith } from 'vs/workbench/contrib/files/common/openWith'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { openEditorWith } from 'vs/workbench/services/editor/common/editorOpenWith'; export class MainThreadTextEditors implements MainThreadTextEditorsShape { diff --git a/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts index aec20a76da9..ca2c751ed56 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts @@ -4,10 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { DisposableStore } from 'vs/base/common/lifecycle'; -import { FileChangeType, IFileService, FileOperation } from 'vs/platform/files/common/files'; +import { FileChangeType, IFileService } from 'vs/platform/files/common/files'; import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, FileSystemEvents, IExtHostContext } from '../common/extHost.protocol'; -import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { localize } from 'vs/nls'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -21,7 +20,6 @@ export class MainThreadFileSystemEventService { constructor( extHostContext: IExtHostContext, @IFileService fileService: IFileService, - @ITextFileService textFileService: ITextFileService, @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService ) { @@ -57,14 +55,13 @@ export class MainThreadFileSystemEventService { // BEFORE file operation workingCopyFileService.addFileOperationParticipant({ - participate: (target, source, operation, progress, timeout, token) => { - return proxy.$onWillRunFileOperation(operation, target, source, timeout, token); + participate: (files, operation, progress, timeout, token) => { + return proxy.$onWillRunFileOperation(operation, files, timeout, token); } }); // AFTER file operation - this._listener.add(textFileService.onDidCreateTextFile(e => proxy.$onDidRunFileOperation(FileOperation.CREATE, e.resource, undefined))); - this._listener.add(workingCopyFileService.onDidRunWorkingCopyFileOperation(e => proxy.$onDidRunFileOperation(e.operation, e.target, e.source))); + this._listener.add(workingCopyFileService.onDidRunWorkingCopyFileOperation(e => proxy.$onDidRunFileOperation(e.operation, e.files))); } dispose(): void { diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index 8471dbbb1d4..e6113efe601 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; +import * as DOM from 'vs/base/browser/dom'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { MainContext, MainThreadNotebookShape, NotebookExtensionDescription, IExtHostContext, ExtHostNotebookShape, ExtHostContext, INotebookDocumentsAndEditorsDelta, INotebookModelAddedData } from '../common/extHost.protocol'; import { Disposable, IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; @@ -17,6 +19,9 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { IRelativePattern } from 'vs/base/common/glob'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IUndoRedoService, UndoRedoElementType } from 'vs/platform/undoRedo/common/undoRedo'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; export class MainThreadNotebookDocument extends Disposable { private _textModel: NotebookTextModel; @@ -29,11 +34,16 @@ export class MainThreadNotebookDocument extends Disposable { private readonly _proxy: ExtHostNotebookShape, public handle: number, public viewType: string, + public supportBackup: boolean, public uri: URI, - readonly notebookService: INotebookService + @INotebookService readonly notebookService: INotebookService, + @IUndoRedoService readonly undoRedoService: IUndoRedoService, + @ITextModelService modelService: ITextModelService + ) { super(); - this._textModel = new NotebookTextModel(handle, viewType, uri); + + this._textModel = new NotebookTextModel(handle, viewType, supportBackup, uri, undoRedoService, modelService); this._register(this._textModel.onDidModelChangeProxy(e => { this._proxy.$acceptModelChanged(this.uri, e); this._proxy.$acceptEditorPropertiesChanged(uri, { selections: { selections: this._textModel.selections }, metadata: null }); @@ -44,15 +54,40 @@ export class MainThreadNotebookDocument extends Disposable { })); } - async applyEdit(modelVersionId: number, edits: ICellEditOperation[], emitToExtHost: boolean): Promise { + async applyEdit(modelVersionId: number, edits: ICellEditOperation[], emitToExtHost: boolean, synchronous: boolean): Promise { await this.notebookService.transformEditsOutputs(this.textModel, edits); - return this._textModel.$applyEdit(modelVersionId, edits); + if (synchronous) { + return this._textModel.$applyEdit(modelVersionId, edits, emitToExtHost, synchronous); + } else { + return new Promise(resolve => { + this._register(DOM.scheduleAtNextAnimationFrame(() => { + const ret = this._textModel.$applyEdit(modelVersionId, edits, emitToExtHost, true); + resolve(ret); + })); + }); + } } async spliceNotebookCellOutputs(cellHandle: number, splices: NotebookCellOutputsSplice[]) { await this.notebookService.transformSpliceOutputs(this.textModel, splices); this._textModel.$spliceNotebookCellOutputs(cellHandle, splices); } + + handleEdit(editId: number, label: string | undefined): void { + this.undoRedoService.pushElement({ + type: UndoRedoElementType.Resource, + resource: this._textModel.uri, + label: label ?? nls.localize('defaultEditLabel', "Edit"), + undo: async () => { + await this._proxy.$undoNotebook(this._textModel.viewType, this._textModel.uri, editId, this._textModel.isDirty); + }, + redo: async () => { + await this._proxy.$redoNotebook(this._textModel.viewType, this._textModel.uri, editId, this._textModel.isDirty); + }, + }); + this._textModel.setDirty(true); + } + dispose() { this._textModel.dispose(); super.dispose(); @@ -178,7 +213,8 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo @INotebookService private _notebookService: INotebookService, @IConfigurationService private readonly configurationService: IConfigurationService, @IEditorService private readonly editorService: IEditorService, - @IAccessibilityService private readonly accessibilityService: IAccessibilityService + @IAccessibilityService private readonly accessibilityService: IAccessibilityService, + @IInstantiationService private readonly _instantiationService: IInstantiationService ) { super(); @@ -229,7 +265,7 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo return; } - this._proxy.$acceptDocumentAndEditorsDelta(delta); + return this._proxy.$acceptDocumentAndEditorsDelta(delta); } registerListeners() { @@ -386,8 +422,8 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo this._notebookService.unregisterNotebookRenderer(id); } - async $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, kernel: INotebookKernelInfoDto | undefined): Promise { - let controller = new MainThreadNotebookController(this._proxy, this, viewType, kernel, this._notebookService); + async $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, supportBackup: boolean, kernel: INotebookKernelInfoDto | undefined): Promise { + let controller = new MainThreadNotebookController(this._proxy, this, viewType, supportBackup, kernel, this._notebookService, this._instantiationService); this._notebookProviders.set(viewType, controller); this._notebookService.registerNotebookController(viewType, extension, controller); return; @@ -452,20 +488,25 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo return this._proxy.$executeNotebook(viewType, uri, undefined, useAttachedKernel, token); } - async $postMessage(handle: number, value: any): Promise { - - const activeEditorPane = this.editorService.activeEditorPane as any | undefined; - if (activeEditorPane?.isNotebookEditor) { - const notebookEditor = (activeEditorPane.getControl() as INotebookEditor); - - if (notebookEditor.viewModel?.handle === handle) { - notebookEditor.postMessage(value); - return true; - } + async $postMessage(editorId: string, forRendererId: string | undefined, value: any): Promise { + const editor = this._notebookService.getNotebookEditor(editorId) as INotebookEditor | undefined; + if (editor?.isNotebookEditor) { + editor.postMessage(forRendererId, value); + return true; } return false; } + + $onDidEdit(resource: UriComponents, viewType: string, editId: number, label: string | undefined): void { + let controller = this._notebookProviders.get(viewType); + controller?.handleEdit(resource, editId, label); + } + + $onContentChange(resource: UriComponents, viewType: string): void { + let controller = this._notebookProviders.get(viewType); + controller?.handleNotebookChange(resource); + } } export class MainThreadNotebookController implements IMainNotebookController { @@ -476,13 +517,15 @@ export class MainThreadNotebookController implements IMainNotebookController { private readonly _proxy: ExtHostNotebookShape, private _mainThreadNotebook: MainThreadNotebooks, private _viewType: string, + private _supportBackup: boolean, readonly kernel: INotebookKernelInfoDto | undefined, readonly notebookService: INotebookService, + readonly _instantiationService: IInstantiationService ) { } - async createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string): Promise { + async createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string, backupId?: string): Promise { let mainthreadNotebook = this._mapping.get(URI.from(uri).toString()); if (mainthreadNotebook) { @@ -497,12 +540,12 @@ export class MainThreadNotebookController implements IMainNotebookController { await mainthreadNotebook.applyEdit(mainthreadNotebook.textModel.versionId, [ { editType: CellEditType.Delete, count: mainthreadNotebook.textModel.cells.length, index: 0 }, { editType: CellEditType.Insert, index: 0, cells: data.cells } - ], true); + ], true, false); } return mainthreadNotebook.textModel; } - let document = new MainThreadNotebookDocument(this._proxy, MainThreadNotebookController.documentHandle++, viewType, uri, this.notebookService); + let document = this._instantiationService.createInstance(MainThreadNotebookDocument, this._proxy, MainThreadNotebookController.documentHandle++, viewType, this._supportBackup, uri); this._mapping.set(document.uri.toString(), document); if (backup) { @@ -517,7 +560,7 @@ export class MainThreadNotebookController implements IMainNotebookController { index: 0, cells: backup.cells || [] } - ], false); + ], false, true); // create document in ext host with cells data await this._mainThreadNotebook.addNotebookDocument({ @@ -545,7 +588,7 @@ export class MainThreadNotebookController implements IMainNotebookController { } // open notebook document - const data = await this._proxy.$resolveNotebookData(viewType, uri); + const data = await this._proxy.$resolveNotebookData(viewType, uri, backupId); if (!data) { return; } @@ -586,11 +629,15 @@ export class MainThreadNotebookController implements IMainNotebookController { return document.textModel; } + async resolveNotebookEditor(viewType: string, uri: URI, editorId: string) { + await this._proxy.$resolveNotebookEditor(viewType, uri, editorId); + } + async tryApplyEdits(resource: UriComponents, modelVersionId: number, edits: ICellEditOperation[], renderers: number[]): Promise { let mainthreadNotebook = this._mapping.get(URI.from(resource).toString()); if (mainthreadNotebook) { - return await mainthreadNotebook.applyEdit(modelVersionId, edits, true); + return await mainthreadNotebook.applyEdit(modelVersionId, edits, true, true); } return false; @@ -605,8 +652,8 @@ export class MainThreadNotebookController implements IMainNotebookController { return this._mainThreadNotebook.executeNotebook(viewType, uri, useAttachedKernel, token); } - onDidReceiveMessage(editorId: string, message: any): void { - this._proxy.$onDidReceiveMessage(editorId, message); + onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: unknown): void { + this._proxy.$onDidReceiveMessage(editorId, rendererType, message); } async removeNotebookDocument(notebook: INotebookTextModel): Promise { @@ -629,6 +676,11 @@ export class MainThreadNotebookController implements IMainNotebookController { document?.textModel.handleUnknownChange(); } + handleEdit(resource: UriComponents, editId: number, label: string | undefined): void { + let document = this._mapping.get(URI.from(resource).toString()); + document?.handleEdit(editId, label); + } + updateLanguages(resource: UriComponents, languages: string[]) { let document = this._mapping.get(URI.from(resource).toString()); document?.textModel.updateLanguages(languages); @@ -654,7 +706,11 @@ export class MainThreadNotebookController implements IMainNotebookController { async saveAs(uri: URI, target: URI, token: CancellationToken): Promise { return this._proxy.$saveNotebookAs(this._viewType, uri, target, token); + } + async backup(uri: URI, token: CancellationToken): Promise { + const backupId = await this._proxy.$backup(this._viewType, uri, token); + return backupId; } } diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 158de62f0c9..8f78a95e712 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -6,7 +6,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { assign } from 'vs/base/common/objects'; -import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations, IInputValidation } from 'vs/workbench/contrib/scm/common/scm'; import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, IExtHostContext } from '../common/extHost.protocol'; import { Command } from 'vs/editor/common/modes'; @@ -264,7 +264,7 @@ export class MainThreadSCM implements MainThreadSCMShape { private readonly _proxy: ExtHostSCMShape; private _repositories = new Map(); - private _inputDisposables = new Map(); + private _repositoryDisposables = new Map(); private readonly _disposables = new DisposableStore(); constructor( @@ -272,17 +272,14 @@ export class MainThreadSCM implements MainThreadSCMShape { @ISCMService private readonly scmService: ISCMService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostSCM); - - Event.debounce(scmService.onDidChangeSelectedRepositories, (_, e) => e, 100) - (this.onDidChangeSelectedRepositories, this, this._disposables); } dispose(): void { this._repositories.forEach(r => r.dispose()); this._repositories.clear(); - this._inputDisposables.forEach(d => d.dispose()); - this._inputDisposables.clear(); + this._repositoryDisposables.forEach(d => d.dispose()); + this._repositoryDisposables.clear(); this._disposables.dispose(); } @@ -292,8 +289,16 @@ export class MainThreadSCM implements MainThreadSCMShape { const repository = this.scmService.registerSCMProvider(provider); this._repositories.set(handle, repository); - const inputDisposable = repository.input.onDidChange(value => this._proxy.$onInputBoxValueChange(handle, value)); - this._inputDisposables.set(handle, inputDisposable); + const disposable = combinedDisposable( + Event.filter(repository.onDidChangeSelection, selected => selected)(_ => this._proxy.$setSelectedSourceControl(handle)), + repository.input.onDidChange(value => this._proxy.$onInputBoxValueChange(handle, value)) + ); + + if (repository.selected) { + setTimeout(() => this._proxy.$setSelectedSourceControl(handle), 0); + } + + this._repositoryDisposables.set(handle, disposable); } $updateSourceControl(handle: number, features: SCMProviderFeatures): void { @@ -314,8 +319,8 @@ export class MainThreadSCM implements MainThreadSCMShape { return; } - this._inputDisposables.get(handle)!.dispose(); - this._inputDisposables.delete(handle); + this._repositoryDisposables.get(handle)!.dispose(); + this._repositoryDisposables.delete(handle); repository.dispose(); this._repositories.delete(handle); @@ -422,12 +427,4 @@ export class MainThreadSCM implements MainThreadSCMShape { repository.input.validateInput = async () => undefined; } } - - private onDidChangeSelectedRepositories(repositories: ISCMRepository[]): void { - const handles = repositories - .filter(r => r.provider instanceof MainThreadSCMProvider) - .map(r => (r.provider as MainThreadSCMProvider).handle); - - this._proxy.$setSelectedSourceControls(handles); - } } diff --git a/src/vs/workbench/api/browser/mainThreadStatusBar.ts b/src/vs/workbench/api/browser/mainThreadStatusBar.ts index 33e5b948c9f..d50bc8f08eb 100644 --- a/src/vs/workbench/api/browser/mainThreadStatusBar.ts +++ b/src/vs/workbench/api/browser/mainThreadStatusBar.ts @@ -15,6 +15,7 @@ import { IAccessibilityInformation } from 'vs/platform/accessibility/common/acce export class MainThreadStatusBar implements MainThreadStatusBarShape { private readonly entries: Map = new Map(); + static readonly CODICON_REGEXP = /\$\((.*?)\)/g; constructor( _extHostContext: IExtHostContext, @@ -29,12 +30,14 @@ export class MainThreadStatusBar implements MainThreadStatusBarShape { $setEntry(id: number, statusId: string, statusName: string, text: string, tooltip: string | undefined, command: Command | undefined, color: string | ThemeColor | undefined, alignment: MainThreadStatusBarAlignment, priority: number | undefined, accessibilityInformation: IAccessibilityInformation): void { // if there are icons in the text use the tooltip for the aria label let ariaLabel: string; + let role: string | undefined = undefined; if (accessibilityInformation) { ariaLabel = accessibilityInformation.label; + role = accessibilityInformation.role; } else { - ariaLabel = text.indexOf('$(') === -1 ? text : tooltip || text; + ariaLabel = text ? text.replace(MainThreadStatusBar.CODICON_REGEXP, (_match, codiconName) => codiconName) : ''; } - const entry: IStatusbarEntry = { text, tooltip, command, color, ariaLabel }; + const entry: IStatusbarEntry = { text, tooltip, command, color, ariaLabel, role }; if (typeof priority === 'undefined') { priority = 0; diff --git a/src/vs/workbench/api/browser/mainThreadTask.ts b/src/vs/workbench/api/browser/mainThreadTask.ts index 30fd88fcb13..8e93c7cfa6a 100644 --- a/src/vs/workbench/api/browser/mainThreadTask.ts +++ b/src/vs/workbench/api/browser/mainThreadTask.ts @@ -328,10 +328,10 @@ namespace TaskDTO { result.detail = task.configurationProperties.detail; } if (!ConfiguringTask.is(task) && task.command) { - if (task.command.runtime === RuntimeType.Process) { - result.execution = ProcessExecutionDTO.from(task.command); - } else if (task.command.runtime === RuntimeType.Shell) { - result.execution = ShellExecutionDTO.from(task.command); + switch (task.command.runtime) { + case RuntimeType.Process: result.execution = ProcessExecutionDTO.from(task.command); break; + case RuntimeType.Shell: result.execution = ShellExecutionDTO.from(task.command); break; + case RuntimeType.CustomExecution: result.execution = CustomExecutionDTO.from(task.command); break; } } if (task.configurationProperties.problemMatchers) { @@ -368,7 +368,7 @@ namespace TaskDTO { const label = nls.localize('task.label', '{0}: {1}', source.label, task.name); const definition = TaskDefinitionDTO.to(task.definition, executeOnly)!; - const id = `${task.source.extensionId}.${definition._key}`; + const id = (CustomExecutionDTO.is(task.execution!) && task._id) ? task._id : `${task.source.extensionId}.${definition._key}`; const result: ContributedTask = new ContributedTask( id, // uuidMap.getUUID(identifier) source, @@ -510,41 +510,41 @@ export class MainThreadTask implements MainThreadTaskShape { }); } - public $executeTask(value: TaskHandleDTO | TaskDTO): Promise { - return new Promise((resolve, reject) => { - if (TaskHandleDTO.is(value)) { - const workspaceFolder = typeof value.workspaceFolder === 'string' ? value.workspaceFolder : this._workspaceContextServer.getWorkspaceFolder(URI.revive(value.workspaceFolder)); - if (workspaceFolder) { - this._taskService.getTask(workspaceFolder, value.id, true).then((task: Task | undefined) => { - if (!task) { - reject(new Error('Task not found')); - } else { - this._taskService.run(task).then(undefined, reason => { - // eat the error, it has already been surfaced to the user and we don't care about it here - }); - const result: TaskExecutionDTO = { - id: value.id, - task: TaskDTO.from(task) - }; - resolve(result); - } - }, (_error) => { - reject(new Error('Task not found')); - }); - } else { - reject(new Error('No workspace folder')); + public async $getTaskExecution(value: TaskHandleDTO | TaskDTO): Promise { + if (TaskHandleDTO.is(value)) { + const workspaceFolder = typeof value.workspaceFolder === 'string' ? value.workspaceFolder : this._workspaceContextServer.getWorkspaceFolder(URI.revive(value.workspaceFolder)); + if (workspaceFolder) { + const task = await this._taskService.getTask(workspaceFolder, value.id, true); + if (task) { + return { + id: task._id, + task: TaskDTO.from(task) + }; } + throw new Error('Task not found'); } else { - const task = TaskDTO.to(value, this._workspaceContextServer, true)!; - this._taskService.run(task).then(undefined, reason => { - // eat the error, it has already been surfaced to the user and we don't care about it here - }); - const result: TaskExecutionDTO = { - id: task._id, - task: TaskDTO.from(task) - }; - resolve(result); + throw new Error('No workspace folder'); } + } else { + const task = TaskDTO.to(value, this._workspaceContextServer, true)!; + return { + id: task._id, + task: TaskDTO.from(task) + }; + } + } + + public $executeTask(value: TaskDTO): Promise { + return new Promise((resolve, reject) => { + const task = TaskDTO.to(value, this._workspaceContextServer, true)!; + this._taskService.run(task).then(undefined, reason => { + // eat the error, it has already been surfaced to the user and we don't care about it here + }); + const result: TaskExecutionDTO = { + id: task._id, + task: TaskDTO.from(task) + }; + resolve(result); }); } diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 54b299991ec..c53cedd6be0 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -9,7 +9,7 @@ import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceS import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { URI } from 'vs/base/common/uri'; import { StopWatch } from 'vs/base/common/stopwatch'; -import { ITerminalInstanceService, ITerminalService, ITerminalInstance, ITerminalBeforeHandleLinkEvent } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ITerminalInstanceService, ITerminalService, ITerminalInstance, ITerminalBeforeHandleLinkEvent, ITerminalExternalLinkProvider, ITerminalLink } from 'vs/workbench/contrib/terminal/browser/terminal'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminalDataBuffering'; @@ -22,10 +22,16 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _proxy: ExtHostTerminalServiceShape; private _remoteAuthority: string | null; private readonly _toDispose = new DisposableStore(); - private readonly _terminalProcesses = new Map>(); - private readonly _terminalProcessesReady = new Map void>(); + private readonly _terminalProcessProxies = new Map(); private _dataEventTracker: TerminalDataEventTracker | undefined; private _linkHandler: IDisposable | undefined; + /** + * A single shared terminal link provider for the exthost. When an ext registers a link + * provider, this is registered with the terminal on the renderer side and all links are + * provided through this, even from multiple ext link providers. Xterm should remove lower + * priority intersecting links itself. + */ + private _linkProvider: IDisposable | undefined; constructor( extHostContext: IExtHostContext, @@ -82,11 +88,13 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._proxy.$initEnvironmentVariableCollections(serializedCollections); } - this._terminalService.extHostReady(extHostContext.remoteAuthority); + this._terminalService.extHostReady(extHostContext.remoteAuthority!); // TODO@Tyriar: remove null assertion } public dispose(): void { this._toDispose.dispose(); + this._linkHandler?.dispose(); + this._linkProvider?.dispose(); // TODO@Daniel: Should all the previously created terminals be disposed // when the extension host process goes down ? @@ -106,7 +114,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape isExtensionTerminal: launchConfig.isExtensionTerminal }; const terminal = this._terminalService.createTerminal(shellLaunchConfig); - this._terminalProcesses.set(terminal.id, new Promise(r => this._terminalProcessesReady.set(terminal.id, r))); return Promise.resolve({ id: terminal.id, name: terminal.title @@ -164,6 +171,17 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $stopHandlingLinks(): void { this._linkHandler?.dispose(); + this._linkHandler = undefined; + } + + public $startLinkProvider(): void { + this._linkProvider?.dispose(); + this._linkProvider = this._terminalService.registerLinkProvider(new ExtensionTerminalLinkProvider(this._proxy)); + } + + public $stopLinkProvider(): void { + this._linkProvider?.dispose(); + this._linkProvider = undefined; } private async _handleLink(e: ITerminalBeforeHandleLinkEvent): Promise { @@ -232,13 +250,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } const proxy = request.proxy; - const ready = this._terminalProcessesReady.get(proxy.terminalId); - if (ready) { - ready(proxy); - this._terminalProcessesReady.delete(proxy.terminalId); - } else { - this._terminalProcesses.set(proxy.terminalId, Promise.resolve(proxy)); - } + this._terminalProcessProxies.set(proxy.terminalId, proxy); const shellLaunchConfigDto: IShellLaunchConfigDto = { name: request.shellLaunchConfig.name, executable: request.shellLaunchConfig.executable, @@ -246,7 +258,16 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape cwd: request.shellLaunchConfig.cwd, env: request.shellLaunchConfig.env }; - this._proxy.$spawnExtHostProcess(proxy.terminalId, shellLaunchConfigDto, request.activeWorkspaceRootUri, request.cols, request.rows, request.isWorkspaceShellAllowed); + + this._proxy.$spawnExtHostProcess( + proxy.terminalId, + shellLaunchConfigDto, + request.activeWorkspaceRootUri, + request.cols, + request.rows, + request.isWorkspaceShellAllowed + ).then(request.callback); + proxy.onInput(data => this._proxy.$acceptProcessInput(proxy.terminalId, data)); proxy.onResize(dimensions => this._proxy.$acceptProcessResize(proxy.terminalId, dimensions.cols, dimensions.rows)); proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(proxy.terminalId, immediate)); @@ -257,13 +278,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _onRequestStartExtensionTerminal(request: IStartExtensionTerminalRequest): void { const proxy = request.proxy; - const ready = this._terminalProcessesReady.get(proxy.terminalId); - if (!ready) { - this._terminalProcesses.set(proxy.terminalId, Promise.resolve(proxy)); - } else { - ready(proxy); - this._terminalProcessesReady.delete(proxy.terminalId); - } + this._terminalProcessProxies.set(proxy.terminalId, proxy); // Note that onReisze is not being listened to here as it needs to fire when max dimensions // change, excluding the dimension override @@ -271,7 +286,12 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape columns: request.cols, rows: request.rows } : undefined; - this._proxy.$startExtensionTerminal(proxy.terminalId, initialDimensions); + + this._proxy.$startExtensionTerminal( + proxy.terminalId, + initialDimensions + ).then(request.callback); + proxy.onInput(data => this._proxy.$acceptProcessInput(proxy.terminalId, data)); proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(proxy.terminalId, immediate)); proxy.onRequestCwd(() => this._proxy.$acceptProcessRequestCwd(proxy.terminalId)); @@ -280,38 +300,38 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } public $sendProcessTitle(terminalId: number, title: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitTitle(title)); + this._getTerminalProcess(terminalId).emitTitle(title); } public $sendProcessData(terminalId: number, data: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitData(data)); + this._getTerminalProcess(terminalId).emitData(data); } public $sendProcessReady(terminalId: number, pid: number, cwd: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitReady(pid, cwd)); + this._getTerminalProcess(terminalId).emitReady(pid, cwd); } public $sendProcessExit(terminalId: number, exitCode: number | undefined): void { - this._getTerminalProcess(terminalId).then(e => e.emitExit(exitCode)); - this._terminalProcesses.delete(terminalId); + this._getTerminalProcess(terminalId).emitExit(exitCode); + this._terminalProcessProxies.delete(terminalId); } public $sendOverrideDimensions(terminalId: number, dimensions: ITerminalDimensions | undefined): void { - this._getTerminalProcess(terminalId).then(e => e.emitOverrideDimensions(dimensions)); + this._getTerminalProcess(terminalId).emitOverrideDimensions(dimensions); } public $sendProcessInitialCwd(terminalId: number, initialCwd: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitInitialCwd(initialCwd)); + this._getTerminalProcess(terminalId).emitInitialCwd(initialCwd); } public $sendProcessCwd(terminalId: number, cwd: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitCwd(cwd)); + this._getTerminalProcess(terminalId).emitCwd(cwd); } public $sendResolvedLaunchConfig(terminalId: number, shellLaunchConfig: IShellLaunchConfig): void { const instance = this._terminalService.getInstanceFromId(terminalId); if (instance) { - this._getTerminalProcess(terminalId).then(e => e.emitResolvedShellLaunchConfig(shellLaunchConfig)); + this._getTerminalProcess(terminalId).emitResolvedShellLaunchConfig(shellLaunchConfig); } } @@ -324,7 +344,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape sw.stop(); sum += sw.elapsed(); } - this._getTerminalProcess(terminalId).then(e => e.emitLatency(sum / COUNT)); + this._getTerminalProcess(terminalId).emitLatency(sum / COUNT); } private _isPrimaryExtHost(): boolean { @@ -349,8 +369,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } } - private _getTerminalProcess(terminalId: number): Promise { - const terminal = this._terminalProcesses.get(terminalId); + private _getTerminalProcess(terminalId: number): ITerminalProcessExtHostProxy { + const terminal = this._terminalProcessProxies.get(terminalId); if (!terminal) { throw new Error(`Unknown terminal: ${terminalId}`); } @@ -395,3 +415,22 @@ class TerminalDataEventTracker extends Disposable { this._register(this._bufferer.startBuffering(instance.id, instance.onData)); } } + +class ExtensionTerminalLinkProvider implements ITerminalExternalLinkProvider { + constructor( + private readonly _proxy: ExtHostTerminalServiceShape + ) { + } + + async provideLinks(instance: ITerminalInstance, line: string): Promise { + const proxy = this._proxy; + const extHostLinks = await proxy.$provideLinks(instance.id, line); + return extHostLinks.map(dto => ({ + id: dto.id, + startIndex: dto.startIndex, + length: dto.length, + label: dto.label, + activate: () => proxy.$activateLink(instance.id, dto.id) + })); + } +} diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index 58796f182f6..3d62a4a9e89 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -5,7 +5,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape, MainContext, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; -import { ITreeViewDataProvider, ITreeItem, IViewsService, ITreeView, IViewsRegistry, ITreeViewDescriptor, IRevealOptions, Extensions } from 'vs/workbench/common/views'; +import { ITreeViewDataProvider, ITreeItem, IViewsService, ITreeView, IViewsRegistry, ITreeViewDescriptor, IRevealOptions, Extensions, ResolvableTreeItem } from 'vs/workbench/common/views'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { distinct } from 'vs/base/common/arrays'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -163,11 +163,13 @@ type TreeItemHandle = string; class TreeViewDataProvider implements ITreeViewDataProvider { private readonly itemsMap: Map = new Map(); + private hasResolve: Promise; constructor(private readonly treeViewId: string, private readonly _proxy: ExtHostTreeViewsShape, private readonly notificationService: INotificationService ) { + this.hasResolve = this._proxy.$hasResolve(this.treeViewId); } getChildren(treeItem?: ITreeItem): Promise { @@ -214,12 +216,16 @@ class TreeViewDataProvider implements ITreeViewDataProvider { return this.itemsMap.size === 0; } - private postGetChildren(elements: ITreeItem[]): ITreeItem[] { - const result: ITreeItem[] = []; + private async postGetChildren(elements: ITreeItem[]): Promise { + const result: ResolvableTreeItem[] = []; + const hasResolve = await this.hasResolve; if (elements) { for (const element of elements) { - this.itemsMap.set(element.handle, element); - result.push(element); + const resolvable = new ResolvableTreeItem(element, hasResolve ? () => { + return this._proxy.$resolve(this.treeViewId, element.handle); + } : undefined); + this.itemsMap.set(element.handle, resolvable); + result.push(resolvable); } } return result; diff --git a/src/vs/workbench/api/browser/mainThreadWebview.ts b/src/vs/workbench/api/browser/mainThreadWebview.ts index 0240c478525..db416f7041f 100644 --- a/src/vs/workbench/api/browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/browser/mainThreadWebview.ts @@ -141,7 +141,7 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma this._register(_editorService.onDidActiveEditorChange(() => { const activeInput = this._editorService.activeEditor; - if (activeInput instanceof DiffEditorInput && activeInput.master instanceof WebviewInput && activeInput.details instanceof WebviewInput) { + if (activeInput instanceof DiffEditorInput && activeInput.primary instanceof WebviewInput && activeInput.secondary instanceof WebviewInput) { this.registerWebviewFromDiffEditorListeners(activeInput); } @@ -185,6 +185,15 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma }); } + dispose() { + super.dispose(); + + for (const disposable of this._editorProviders.values()) { + disposable.dispose(); + } + this._editorProviders.clear(); + } + public $createWebviewPanel( extensionData: extHostProtocol.WebviewExtensionDescription, handle: extHostProtocol.WebviewPanelHandle, @@ -320,7 +329,7 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma options: modes.IWebviewPanelOptions, capabilities: extHostProtocol.CustomTextEditorCapabilities, supportsMultipleEditorsPerDocument: boolean, - ): DisposableStore { + ): void { if (this._editorProviders.has(viewType)) { throw new Error(`Provider for ${viewType} already registered`); } @@ -396,8 +405,6 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma })); this._editorProviders.set(viewType, disposables); - - return disposables; } public $unregisterEditorProvider(viewType: string): void { @@ -468,22 +475,22 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma } private registerWebviewFromDiffEditorListeners(diffEditorInput: DiffEditorInput): void { - const master = diffEditorInput.master as WebviewInput; - const details = diffEditorInput.details as WebviewInput; + const primary = diffEditorInput.primary as WebviewInput; + const secondary = diffEditorInput.secondary as WebviewInput; - if (this._webviewFromDiffEditorHandles.has(master.id) || this._webviewFromDiffEditorHandles.has(details.id)) { + if (this._webviewFromDiffEditorHandles.has(primary.id) || this._webviewFromDiffEditorHandles.has(secondary.id)) { return; } - this._webviewFromDiffEditorHandles.add(master.id); - this._webviewFromDiffEditorHandles.add(details.id); + this._webviewFromDiffEditorHandles.add(primary.id); + this._webviewFromDiffEditorHandles.add(secondary.id); const disposables = new DisposableStore(); - disposables.add(master.webview.onDidFocus(() => this.updateWebviewViewStates(master))); - disposables.add(details.webview.onDidFocus(() => this.updateWebviewViewStates(details))); + disposables.add(primary.webview.onDidFocus(() => this.updateWebviewViewStates(primary))); + disposables.add(secondary.webview.onDidFocus(() => this.updateWebviewViewStates(secondary))); disposables.add(diffEditorInput.onDispose(() => { - this._webviewFromDiffEditorHandles.delete(master.id); - this._webviewFromDiffEditorHandles.delete(details.id); + this._webviewFromDiffEditorHandles.delete(primary.id); + this._webviewFromDiffEditorHandles.delete(secondary.id); dispose(disposables); })); } @@ -515,8 +522,8 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma for (const group of this._editorGroupService.groups) { for (const input of group.editors) { if (input instanceof DiffEditorInput) { - updateViewStatesForInput(group, input, input.master); - updateViewStatesForInput(group, input, input.details); + updateViewStatesForInput(group, input, input.primary); + updateViewStatesForInput(group, input, input.secondary); } else { updateViewStatesForInput(group, input, input); } diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index df17b498274..a9aadf93a9d 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -9,7 +9,7 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; import * as resources from 'vs/base/common/resources'; import { ExtensionMessageCollector, ExtensionsRegistry, IExtensionPoint, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { ViewContainer, IViewsRegistry, ITreeViewDescriptor, IViewContainersRegistry, Extensions as ViewContainerExtensions, TEST_VIEW_CONTAINER_ID, IViewDescriptor, ViewContainerLocation } from 'vs/workbench/common/views'; -import { TreeViewPane, CustomTreeView } from 'vs/workbench/browser/parts/views/treeView'; +import { TreeViewPane } from 'vs/workbench/browser/parts/views/treeView'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { coalesce, } from 'vs/base/common/arrays'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; @@ -31,6 +31,7 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { Codicon } from 'vs/base/common/codicons'; +import { CustomTreeView } from 'vs/workbench/contrib/views/browser/treeView'; export interface IUserFriendlyViewsContainerDescriptor { id: string; diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 08e3c458be0..967b210d0ae 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -46,7 +46,7 @@ import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { ExtHostUrls } from 'vs/workbench/api/common/extHostUrls'; import { ExtHostWebviews } from 'vs/workbench/api/common/extHostWebview'; -import { ExtHostWindow } from 'vs/workbench/api/common/extHostWindow'; +import { IExtHostWindow } from 'vs/workbench/api/common/extHostWindow'; import { IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { throwProposedApiError, checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; @@ -97,6 +97,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostLogService = accessor.get(ILogService); const extHostTunnelService = accessor.get(IExtHostTunnelService); const extHostApiDeprecation = accessor.get(IExtHostApiDeprecationService); + const extHostWindow = accessor.get(IExtHostWindow); // register addressable instances rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService); @@ -105,6 +106,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService); rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage); rpcProtocol.set(ExtHostContext.ExtHostTunnelService, extHostTunnelService); + rpcProtocol.set(ExtHostContext.ExtHostWindow, extHostWindow); // automatically create and register addressable instances const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, accessor.get(IExtHostDecorations)); @@ -131,10 +133,9 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostQuickOpen = rpcProtocol.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(rpcProtocol, extHostWorkspace, extHostCommands)); const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, extHostLogService)); const extHostComment = rpcProtocol.set(ExtHostContext.ExtHostComments, new ExtHostComments(rpcProtocol, extHostCommands, extHostDocuments)); - const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol)); const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress))); const extHostLabelService = rpcProtocol.set(ExtHostContext.ExtHosLabelService, new ExtHostLabelService(rpcProtocol)); - const extHostNotebook = rpcProtocol.set(ExtHostContext.ExtHostNotebook, new ExtHostNotebookController(rpcProtocol, extHostCommands, extHostDocumentsAndEditors, initData.environment)); + const extHostNotebook = rpcProtocol.set(ExtHostContext.ExtHostNotebook, initData.uiKind === UIKind.Web ? new ExtHostNotebookController(rpcProtocol, extHostCommands, extHostDocumentsAndEditors, initData.environment) : new ExtHostNotebookController(rpcProtocol, extHostCommands, extHostDocumentsAndEditors, initData.environment, extensionStoragePaths)); const extHostTheming = rpcProtocol.set(ExtHostContext.ExtHostTheming, new ExtHostTheming(rpcProtocol)); const extHostAuthentication = rpcProtocol.set(ExtHostContext.ExtHostAuthentication, new ExtHostAuthentication(rpcProtocol)); const extHostTimeline = rpcProtocol.set(ExtHostContext.ExtHostTimeline, new ExtHostTimeline(rpcProtocol, extHostCommands)); @@ -205,12 +206,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I getSession(providerId: string, scopes: string[], options: vscode.AuthenticationGetSessionOptions) { return extHostAuthentication.getSession(extension, providerId, scopes, options as any); }, - getSessions(providerId: string, scopes: string[]): Thenable { - return extHostAuthentication.getSessions(extension, providerId, scopes); - }, - login(providerId: string, scopes: string[]): Thenable { - return extHostAuthentication.login(extension, providerId, scopes); - }, logout(providerId: string, sessionId: string): Thenable { return extHostAuthentication.logout(providerId, sessionId); }, @@ -586,6 +581,10 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I checkProposedApiEnabled(extension); return extHostTerminalService.registerLinkHandler(handler); }, + registerTerminalLinkProvider(handler: vscode.TerminalLinkProvider): vscode.Disposable { + checkProposedApiEnabled(extension); + return extHostTerminalService.registerLinkProvider(handler); + }, registerTreeDataProvider(viewId: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable { return extHostTreeViews.registerTreeDataProvider(viewId, treeDataProvider, extension); }, @@ -1097,7 +1096,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I CellKind: extHostTypes.CellKind, CellOutputKind: extHostTypes.CellOutputKind, NotebookCellRunState: extHostTypes.NotebookCellRunState, - AuthenticationSession2: extHostTypes.AuthenticationSession + AuthenticationSession: extHostTypes.AuthenticationSession }; }; } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index a7dd91d0f24..0490360f285 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -41,7 +41,7 @@ import * as tasks from 'vs/workbench/api/common/shared/tasks'; import { IRevealOptions, ITreeItem } from 'vs/workbench/common/views'; import { IAdapterDescriptor, IConfig, IDebugSessionReplMode } from 'vs/workbench/contrib/debug/common/debug'; import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; -import { ITerminalDimensions, IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalDimensions, IShellLaunchConfig, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { ExtensionActivationError } from 'vs/workbench/services/extensions/common/extensions'; import { createExtHostContextProxyIdentifier as createExtId, createMainContextProxyIdentifier as createMainId, IRPCProtocol } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import * as search from 'vs/workbench/services/search/common/search'; @@ -51,7 +51,7 @@ import { TunnelDto } from 'vs/workbench/api/common/extHostTunnelService'; import { TunnelOptions } from 'vs/platform/remote/common/tunnel'; import { Timeline, TimelineChangeEvent, TimelineOptions, TimelineProviderDescriptor, InternalTimelineOptions } from 'vs/workbench/contrib/timeline/common/timeline'; import { revive } from 'vs/base/common/marshalling'; -import { INotebookMimeTypeSelector, IProcessedOutput, INotebookDisplayOrder, NotebookCellMetadata, NotebookDocumentMetadata, ICellEditOperation, NotebookCellsChangedEvent, NotebookDataDto, INotebookKernelInfoDto, IMainCellDto, IOutputRenderRequest, IOutputRenderResponse, IRawOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookMimeTypeSelector, IProcessedOutput, INotebookDisplayOrder, NotebookCellMetadata, NotebookDocumentMetadata, ICellEditOperation, NotebookCellsChangedEvent, NotebookDataDto, INotebookKernelInfoDto, IMainCellDto, IOutputRenderRequest, IOutputRenderResponse } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CallHierarchyItem } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; import { Dto } from 'vs/base/common/types'; import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; @@ -108,7 +108,7 @@ export interface IConfigurationInitData extends IConfigurationData { } export interface IExtHostContext extends IRPCProtocol { - remoteAuthority: string; + remoteAuthority: string | null; } export interface IMainContext extends IRPCProtocol { @@ -450,6 +450,8 @@ export interface MainThreadTerminalServiceShape extends IDisposable { $stopSendingDataEvents(): void; $startHandlingLinks(): void; $stopHandlingLinks(): void; + $startLinkProvider(): void; + $stopLinkProvider(): void; $setEnvironmentVariableCollection(extensionIdentifier: string, persistent: boolean, collection: ISerializableEnvironmentVariableCollection | undefined): void; // Process @@ -693,11 +695,11 @@ export type NotebookCellsSplice = [ export type NotebookCellOutputsSplice = [ number /* start */, number /* delete count */, - IRawOutput[] + IProcessedOutput[] ]; export interface MainThreadNotebookShape extends IDisposable { - $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, kernelInfoDto: INotebookKernelInfoDto | undefined): Promise; + $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, supportBackup: boolean, kernelInfoDto: INotebookKernelInfoDto | undefined): Promise; $onNotebookChange(viewType: string, resource: UriComponents): Promise; $unregisterNotebookProvider(viewType: string): Promise; $registerNotebookRenderer(extension: NotebookExtensionDescription, type: string, selectors: INotebookMimeTypeSelector, preloads: UriComponents[]): Promise; @@ -709,7 +711,10 @@ export interface MainThreadNotebookShape extends IDisposable { $updateNotebookMetadata(viewType: string, resource: UriComponents, metadata: NotebookDocumentMetadata): Promise; $updateNotebookCellMetadata(viewType: string, resource: UriComponents, handle: number, metadata: NotebookCellMetadata | undefined): Promise; $spliceNotebookCellOutputs(viewType: string, resource: UriComponents, cellHandle: number, splices: NotebookCellOutputsSplice[], renderers: number[]): Promise; - $postMessage(handle: number, value: any): Promise; + $postMessage(editorId: string, forRendererId: string | undefined, value: any): Promise; + + $onDidEdit(resource: UriComponents, viewType: string, editId: number, label: string | undefined): void; + $onContentChange(resource: UriComponents, viewType: string): void; } export interface MainThreadUrlsShape extends IDisposable { @@ -774,7 +779,8 @@ export interface MainThreadTaskShape extends IDisposable { $registerTaskProvider(handle: number, type: string): Promise; $unregisterTaskProvider(handle: number): Promise; $fetchTasks(filter?: tasks.TaskFilterDTO): Promise; - $executeTask(task: tasks.TaskHandleDTO | tasks.TaskDTO): Promise; + $getTaskExecution(value: tasks.TaskHandleDTO | tasks.TaskDTO): Promise; + $executeTask(task: tasks.TaskDTO): Promise; $terminateTask(id: string): Promise; $registerTaskSystem(scheme: string, info: tasks.TaskSystemInfoDTO): void; $customExecutionComplete(id: string, result?: number): Promise; @@ -852,6 +858,7 @@ export interface IStartDebuggingOptions { parentSessionID?: DebugSessionUUID; repl?: IDebugSessionReplMode; noDebug?: boolean; + compact?: boolean; } export interface MainThreadDebugServiceShape extends IDisposable { @@ -981,6 +988,8 @@ export interface ExtHostTreeViewsShape { $setExpanded(treeViewId: string, treeItemHandle: string, expanded: boolean): void; $setSelection(treeViewId: string, treeItemHandles: string[]): void; $setVisible(treeViewId: string, visible: boolean): void; + $hasResolve(treeViewId: string): Promise; + $resolve(treeViewId: string, treeItemHandle: string): Promise; } export interface ExtHostWorkspaceShape { @@ -1062,10 +1071,15 @@ export interface FileSystemEvents { deleted: UriComponents[]; } +export interface SourceTargetPair { + source?: UriComponents; + target: UriComponents; +} + export interface ExtHostFileSystemEventServiceShape { $onFileEvent(events: FileSystemEvents): void; - $onWillRunFileOperation(operation: files.FileOperation, target: UriComponents, source: UriComponents | undefined, timeout: number, token: CancellationToken): Promise; - $onDidRunFileOperation(operation: files.FileOperation, target: UriComponents, source: UriComponents | undefined): void; + $onWillRunFileOperation(operation: files.FileOperation, files: SourceTargetPair[], timeout: number, token: CancellationToken): Promise; + $onDidRunFileOperation(operation: files.FileOperation, files: SourceTargetPair[]): void; } export interface ObjectIdentifier { @@ -1376,6 +1390,17 @@ export interface IShellAndArgsDto { args: string[] | string | undefined; } +export interface ITerminalLinkDto { + /** The ID of the link to enable activation and disposal. */ + id: number; + /** The startIndex of the link in the line. */ + startIndex: number; + /** The length of the link in the line. */ + length: number; + /** The descriptive label for what the link does when activated. */ + label?: string; +} + export interface ITerminalDimensionsDto { columns: number; rows: number; @@ -1390,8 +1415,8 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalTitleChange(id: number, name: string): void; $acceptTerminalDimensions(id: number, cols: number, rows: number): void; $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): void; - $spawnExtHostProcess(id: number, shellLaunchConfig: IShellLaunchConfigDto, activeWorkspaceRootUri: UriComponents | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): void; - $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): void; + $spawnExtHostProcess(id: number, shellLaunchConfig: IShellLaunchConfigDto, activeWorkspaceRootUri: UriComponents | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise; + $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): Promise; $acceptProcessInput(id: number, data: string): void; $acceptProcessResize(id: number, cols: number, rows: number): void; $acceptProcessShutdown(id: number, immediate: boolean): void; @@ -1402,6 +1427,8 @@ export interface ExtHostTerminalServiceShape { $getAvailableShells(): Promise; $getDefaultShellAndArgs(useAutomationShell: boolean): Promise; $handleLink(id: number, link: string): Promise; + $provideLinks(id: number, line: string): Promise; + $activateLink(id: number, linkId: number): void; $initEnvironmentVariableCollections(collections: [string, ISerializableEnvironmentVariableCollection][]): void; } @@ -1410,7 +1437,7 @@ export interface ExtHostSCMShape { $onInputBoxValueChange(sourceControlHandle: number, value: string): void; $executeResourceCommand(sourceControlHandle: number, groupHandle: number, handle: number, preserveFocus: boolean): Promise; $validateInput(sourceControlHandle: number, value: string, cursorPosition: number): Promise<[string, number] | undefined>; - $setSelectedSourceControls(selectedSourceControlHandles: number[]): Promise; + $setSelectedSourceControl(selectedSourceControlHandle: number | undefined): Promise; } export interface ExtHostTaskShape { @@ -1506,7 +1533,6 @@ export interface ExtHostDebugServiceShape { export interface DecorationRequest { readonly id: number; - readonly handle: number; readonly uri: UriComponents; } @@ -1514,7 +1540,7 @@ export type DecorationData = [number, boolean, string, string, ThemeColor]; export type DecorationReply = { [id: number]: DecorationData; }; export interface ExtHostDecorationsShape { - $provideDecorations(requests: DecorationRequest[], token: CancellationToken): Promise; + $provideDecorations(handle: number, requests: DecorationRequest[], token: CancellationToken): Promise; } export interface ExtHostWindowShape { @@ -1581,18 +1607,23 @@ export interface INotebookDocumentsAndEditorsDelta { } export interface ExtHostNotebookShape { - $resolveNotebookData(viewType: string, uri: UriComponents): Promise; + $resolveNotebookData(viewType: string, uri: UriComponents, backupId?: string): Promise; + $resolveNotebookEditor(viewType: string, uri: UriComponents, editorId: string): Promise; $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined, useAttachedKernel: boolean, token: CancellationToken): Promise; $executeNotebook2(kernelId: string, viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise; $saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise; $saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise; + $backup(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise; $acceptDisplayOrder(displayOrder: INotebookDisplayOrder): void; $renderOutputs(uriComponents: UriComponents, id: string, request: IOutputRenderRequest): Promise | undefined>; $renderOutputs2(uriComponents: UriComponents, id: string, request: IOutputRenderRequest): Promise | undefined>; - $onDidReceiveMessage(editorId: string, message: any): void; + $onDidReceiveMessage(editorId: string, rendererId: string | undefined, message: unknown): void; $acceptModelChanged(uriComponents: UriComponents, event: NotebookCellsChangedEvent): void; $acceptEditorPropertiesChanged(uriComponents: UriComponents, data: INotebookEditorPropertiesChangeData): void; $acceptDocumentAndEditorsDelta(delta: INotebookDocumentsAndEditorsDelta): Promise; + $undoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise; + $redoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise; + } export interface ExtHostStorageShape { diff --git a/src/vs/workbench/api/common/extHostAuthentication.ts b/src/vs/workbench/api/common/extHostAuthentication.ts index 2aaf39aa40c..107a5614834 100644 --- a/src/vs/workbench/api/common/extHostAuthentication.ts +++ b/src/vs/workbench/api/common/extHostAuthentication.ts @@ -56,8 +56,8 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { return !!(sessions.filter(session => session.scopes.sort().join(' ') === orderedScopes).length); } - async getSession(requestingExtension: IExtensionDescription, providerId: string, scopes: string[], options: vscode.AuthenticationGetSessionOptions & { createIfNone: true }): Promise; - async getSession(requestingExtension: IExtensionDescription, providerId: string, scopes: string[], options: vscode.AuthenticationGetSessionOptions): Promise { + async getSession(requestingExtension: IExtensionDescription, providerId: string, scopes: string[], options: vscode.AuthenticationGetSessionOptions & { createIfNone: true }): Promise; + async getSession(requestingExtension: IExtensionDescription, providerId: string, scopes: string[], options: vscode.AuthenticationGetSessionOptions): Promise { const provider = this._authenticationProviders.get(providerId); const extensionName = requestingExtension.displayName || requestingExtension.name; const extensionId = ExtensionIdentifier.toKey(requestingExtension.identifier); @@ -100,71 +100,6 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { } } - async getSessions(requestingExtension: IExtensionDescription, providerId: string, scopes: string[]): Promise { - const extensionId = ExtensionIdentifier.toKey(requestingExtension.identifier); - const orderedScopes = scopes.sort().join(' '); - const sessions = await this.resolveSessions(providerId); - return sessions - .filter(session => session.scopes.sort().join(' ') === orderedScopes) - .map(session => { - return { - id: session.id, - account: session.account, - scopes: session.scopes, - getAccessToken: async () => { - const isAllowed = await this._proxy.$getSessionsPrompt( - providerId, - session.account.displayName, - '', // TODO - // provider.displayName, - extensionId, - requestingExtension.displayName || requestingExtension.name); - - if (!isAllowed) { - throw new Error('User did not consent to token access.'); - } - - return session.accessToken; - } - }; - }); - } - - async login(requestingExtension: IExtensionDescription, providerId: string, scopes: string[]): Promise { - const provider = this._authenticationProviders.get(providerId); - if (!provider) { - throw new Error(`No authentication provider with id '${providerId}' is currently registered.`); - } - - const extensionName = requestingExtension.displayName || requestingExtension.name; - const isAllowed = await this._proxy.$loginPrompt(provider.displayName, extensionName); - if (!isAllowed) { - throw new Error('User did not consent to login.'); - } - - const session = await provider.login(scopes); - await this._proxy.$setTrustedExtension(provider.id, session.account.displayName, ExtensionIdentifier.toKey(requestingExtension.identifier), extensionName); - return { - id: session.id, - account: session.account, - scopes: session.scopes, - getAccessToken: async () => { - const isAllowed = await this._proxy.$getSessionsPrompt( - provider.id, - session.account.displayName, - provider.displayName, - ExtensionIdentifier.toKey(requestingExtension.identifier), - requestingExtension.displayName || requestingExtension.name); - - if (!isAllowed) { - throw new Error('User did not consent to token access.'); - } - - return session.accessToken; - } - }; - } - async logout(providerId: string, sessionId: string): Promise { const provider = this._authenticationProviders.get(providerId); if (!provider) { diff --git a/src/vs/workbench/api/common/extHostDebugService.ts b/src/vs/workbench/api/common/extHostDebugService.ts index 094cb7f196f..6fc0dc2bdc1 100644 --- a/src/vs/workbench/api/common/extHostDebugService.ts +++ b/src/vs/workbench/api/common/extHostDebugService.ts @@ -57,7 +57,7 @@ export interface IExtHostDebugService extends ExtHostDebugServiceShape { asDebugSourceUri(source: vscode.DebugProtocolSource, session?: vscode.DebugSession): vscode.Uri; } -export class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDebugServiceShape { +export abstract class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDebugServiceShape { readonly _serviceBrand: undefined; @@ -296,7 +296,8 @@ export class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDeb return this._debugServiceProxy.$startDebugging(folder ? folder.uri : undefined, nameOrConfig, { parentSessionID: options.parentSession ? options.parentSession.id : undefined, repl: options.consoleMode === DebugConsoleMode.MergeWithParent ? 'mergeWithParent' : 'separate', - noDebug: options.noDebug + noDebug: options.noDebug, + compact: options.compact }); } @@ -373,9 +374,7 @@ export class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDeb return Promise.resolve(undefined); } - protected createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService { - return new ExtHostVariableResolverService(folders, editorService, configurationService); - } + protected abstract createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService; public async $substituteVariables(folderUri: UriComponents | undefined, config: IConfig): Promise { if (!this._variableResolver) { @@ -974,7 +973,7 @@ export class ExtHostDebugConsole implements vscode.DebugConsole { export class ExtHostVariableResolverService extends AbstractVariableResolverService { - constructor(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider, env?: IProcessEnvironment) { + constructor(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors | undefined, configurationService: ExtHostConfigProvider, env?: IProcessEnvironment) { super({ getFolderUri: (folderName: string): URI | undefined => { const found = folders.filter(f => f.name === folderName); @@ -993,27 +992,33 @@ export class ExtHostVariableResolverService extends AbstractVariableResolverServ return env ? env['VSCODE_EXEC_PATH'] : undefined; }, getFilePath: (): string | undefined => { - const activeEditor = editorService.activeEditor(); - if (activeEditor) { - return path.normalize(activeEditor.document.uri.fsPath); + if (editorService) { + const activeEditor = editorService.activeEditor(); + if (activeEditor) { + return path.normalize(activeEditor.document.uri.fsPath); + } } return undefined; }, getSelectedText: (): string | undefined => { - const activeEditor = editorService.activeEditor(); - if (activeEditor && !activeEditor.selection.isEmpty) { - return activeEditor.document.getText(activeEditor.selection); + if (editorService) { + const activeEditor = editorService.activeEditor(); + if (activeEditor && !activeEditor.selection.isEmpty) { + return activeEditor.document.getText(activeEditor.selection); + } } return undefined; }, getLineNumber: (): string | undefined => { - const activeEditor = editorService.activeEditor(); - if (activeEditor) { - return String(activeEditor.selection.end.line + 1); + if (editorService) { + const activeEditor = editorService.activeEditor(); + if (activeEditor) { + return String(activeEditor.selection.end.line + 1); + } } return undefined; } - }, env); + }, env, !editorService); } } @@ -1104,4 +1109,8 @@ export class WorkerExtHostDebugService extends ExtHostDebugServiceBase { ) { super(extHostRpcService, workspaceService, extensionService, editorsService, configurationService, commandService); } + + protected createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService { + return new ExtHostVariableResolverService(folders, editorService, configurationService); + } } diff --git a/src/vs/workbench/api/common/extHostDecorations.ts b/src/vs/workbench/api/common/extHostDecorations.ts index 9ed26739e6d..d50d8f15dd2 100644 --- a/src/vs/workbench/api/common/extHostDecorations.ts +++ b/src/vs/workbench/api/common/extHostDecorations.ts @@ -52,17 +52,20 @@ export class ExtHostDecorations implements IExtHostDecorations { }); } - $provideDecorations(requests: DecorationRequest[], token: CancellationToken): Promise { + async $provideDecorations(handle: number, requests: DecorationRequest[], token: CancellationToken): Promise { + + if (!this._provider.has(handle)) { + // might have been unregistered in the meantime + return Object.create(null); + } + const result: DecorationReply = Object.create(null); - return Promise.all(requests.map(request => { - const { handle, uri, id } = request; - const entry = this._provider.get(handle); - if (!entry) { - // might have been unregistered in the meantime - return undefined; - } - const { provider, extensionId } = entry; - return Promise.resolve(provider.provideDecoration(URI.revive(uri), token)).then(data => { + const { provider, extensionId } = this._provider.get(handle)!; + + await Promise.all(requests.map(async request => { + try { + const { uri, id } = request; + const data = await Promise.resolve(provider.provideDecoration(URI.revive(uri), token)); if (!data) { return; } @@ -72,13 +75,12 @@ export class ExtHostDecorations implements IExtHostDecorations { } catch (e) { this._logService.warn(`INVALID decoration from extension '${extensionId.value}': ${e}`); } - }, err => { + } catch (err) { this._logService.error(err); - }); + } + })); - })).then(() => { - return result; - }); + return result; } } diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 83fdbfcb107..c11e3036ad9 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -16,7 +16,7 @@ import { ExtHostConfiguration, IExtHostConfiguration } from 'vs/workbench/api/co import { ActivatedExtension, EmptyExtension, ExtensionActivationReason, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionModule, HostExtension, ExtensionActivationTimesFragment } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ExtHostStorage, IExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; import { ExtHostWorkspace, IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; -import { ExtensionActivationError, checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; +import { ExtensionActivationError } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; @@ -371,7 +371,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme const workspaceState = new ExtensionMemento(extensionDescription.identifier.value, false, this._storage); const extensionMode = extensionDescription.isUnderDevelopment ? (this._initData.environment.extensionTestsLocationURI ? ExtensionMode.Test : ExtensionMode.Development) - : ExtensionMode.Release; + : ExtensionMode.Production; this._logService.trace(`ExtensionService#loadExtensionContext ${extensionDescription.identifier.value}`); @@ -391,10 +391,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme get globalStoragePath() { return that._storagePath.globalValue(extensionDescription); }, asAbsolutePath(relativePath: string) { return path.join(extensionDescription.extensionLocation.fsPath, relativePath); }, get logPath() { return path.join(that._initData.logsLocation.fsPath, extensionDescription.identifier.value); }, - get extensionMode() { - checkProposedApiEnabled(extensionDescription); - return extensionMode; - }, + get extensionMode() { return extensionMode; }, get environmentVariableCollection() { return that._extHostTerminalService.getEnvironmentVariableCollection(extensionDescription); } }); }); diff --git a/src/vs/workbench/api/common/extHostFileSystemEventService.ts b/src/vs/workbench/api/common/extHostFileSystemEventService.ts index f8114192102..41606d40393 100644 --- a/src/vs/workbench/api/common/extHostFileSystemEventService.ts +++ b/src/vs/workbench/api/common/extHostFileSystemEventService.ts @@ -5,10 +5,10 @@ import { AsyncEmitter, Emitter, Event, IWaitUntil } from 'vs/base/common/event'; import { IRelativePattern, parse } from 'vs/base/common/glob'; -import { URI, UriComponents } from 'vs/base/common/uri'; +import { URI } from 'vs/base/common/uri'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import type * as vscode from 'vscode'; -import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, MainThreadTextEditorsShape, IWorkspaceFileEditDto, IWorkspaceTextEditDto } from './extHost.protocol'; +import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, MainThreadTextEditorsShape, IWorkspaceFileEditDto, IWorkspaceTextEditDto, SourceTargetPair } from './extHost.protocol'; import * as typeConverter from './extHostTypeConverters'; import { Disposable, WorkspaceEdit } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; @@ -142,16 +142,16 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ //--- file operations - $onDidRunFileOperation(operation: FileOperation, target: UriComponents, source: UriComponents | undefined): void { + $onDidRunFileOperation(operation: FileOperation, files: SourceTargetPair[]): void { switch (operation) { case FileOperation.MOVE: - this._onDidRenameFile.fire(Object.freeze({ files: [{ oldUri: URI.revive(source!), newUri: URI.revive(target) }] })); + this._onDidRenameFile.fire(Object.freeze({ files: files.map(f => ({ oldUri: URI.revive(f.source!), newUri: URI.revive(f.target) })) })); break; case FileOperation.DELETE: - this._onDidDeleteFile.fire(Object.freeze({ files: [URI.revive(target)] })); + this._onDidDeleteFile.fire(Object.freeze({ files: files.map(f => URI.revive(f.target)) })); break; case FileOperation.CREATE: - this._onDidCreateFile.fire(Object.freeze({ files: [URI.revive(target)] })); + this._onDidCreateFile.fire(Object.freeze({ files: files.map(f => URI.revive(f.target)) })); break; default: //ignore, dont send @@ -179,16 +179,16 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ }; } - async $onWillRunFileOperation(operation: FileOperation, target: UriComponents, source: UriComponents | undefined, timeout: number, token: CancellationToken): Promise { + async $onWillRunFileOperation(operation: FileOperation, files: SourceTargetPair[], timeout: number, token: CancellationToken): Promise { switch (operation) { case FileOperation.MOVE: - await this._fireWillEvent(this._onWillRenameFile, { files: [{ oldUri: URI.revive(source!), newUri: URI.revive(target) }] }, timeout, token); + await this._fireWillEvent(this._onWillRenameFile, { files: files.map(f => ({ oldUri: URI.revive(f.source!), newUri: URI.revive(f.target) })) }, timeout, token); break; case FileOperation.DELETE: - await this._fireWillEvent(this._onWillDeleteFile, { files: [URI.revive(target)] }, timeout, token); + await this._fireWillEvent(this._onWillDeleteFile, { files: files.map(f => URI.revive(f.target)) }, timeout, token); break; case FileOperation.CREATE: - await this._fireWillEvent(this._onWillCreateFile, { files: [URI.revive(target)] }, timeout, token); + await this._fireWillEvent(this._onWillCreateFile, { files: files.map(f => URI.revive(f.target)) }, timeout, token); break; default: //ignore, dont send diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index a114726c453..cbe85a2675e 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -73,7 +73,7 @@ class DocumentSymbolAdapter { const element: modes.DocumentSymbol = { name: info.name || '!!MISSING: name!!', kind: typeConvert.SymbolKind.from(info.kind), - tags: info.tags ? info.tags.map(typeConvert.SymbolTag.from) : [], + tags: info.tags?.map(typeConvert.SymbolTag.from) || [], detail: '', containerName: info.containerName, range: typeConvert.Range.from(info.location.range), @@ -1287,6 +1287,7 @@ class CallHierarchyAdapter { uri: item.uri, range: typeConvert.Range.from(item.range), selectionRange: typeConvert.Range.from(item.selectionRange), + tags: item.tags?.map(typeConvert.SymbolTag.from) }; map.set(dto._itemId, item); return dto; diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 95d5773d625..9de152f40d7 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -13,13 +13,19 @@ import { IExtensionDescription } from 'vs/platform/extensions/common/extensions' import { CellKind, ExtHostNotebookShape, IMainContext, MainContext, MainThreadNotebookShape, NotebookCellOutputsSplice, MainThreadDocumentsShape, INotebookEditorPropertiesChangeData, INotebookDocumentsAndEditorsDelta } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { CellEditType, CellUri, diff, ICellEditOperation, ICellInsertEdit, INotebookDisplayOrder, INotebookEditData, NotebookCellsChangedEvent, NotebookCellsSplice2, ICellDeleteEdit, notebookDocumentMetadataDefaults, NotebookCellsChangeType, NotebookDataDto, IOutputRenderRequest, IOutputRenderResponse, IOutputRenderResponseOutputInfo, IOutputRenderResponseCellInfo } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellEditType, CellUri, diff, ICellEditOperation, ICellInsertEdit, INotebookDisplayOrder, INotebookEditData, NotebookCellsChangedEvent, NotebookCellsSplice2, ICellDeleteEdit, notebookDocumentMetadataDefaults, NotebookCellsChangeType, NotebookDataDto, IOutputRenderRequest, IOutputRenderResponse, IOutputRenderResponseOutputInfo, IOutputRenderResponseCellInfo, IRawOutput, CellOutputKind, IProcessedOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtHostDocumentData } from 'vs/workbench/api/common/extHostDocumentData'; import { NotImplementedProxy } from 'vs/base/common/types'; import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import { asWebviewUri, WebviewInitData } from 'vs/workbench/api/common/shared/webview'; +import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths'; +import { joinPath } from 'vs/base/common/resources'; +import { Schemas } from 'vs/base/common/network'; +import { hash } from 'vs/base/common/hash'; +import { generateUuid } from 'vs/base/common/uuid'; +import { Cache } from './cache'; interface IObservable { proxy: T; @@ -48,15 +54,18 @@ interface INotebookEventEmitter { emitCellLanguageChange(event: vscode.NotebookCellLanguageChangeEvent): void; } +const addIdToOutput = (output: IRawOutput, id = generateUuid()): IProcessedOutput => output.outputKind === CellOutputKind.Rich + ? ({ ...output, outputId: id }) : output; + export class ExtHostCell extends Disposable implements vscode.NotebookCell { // private originalSource: string[]; private _outputs: any[]; - private _onDidChangeOutputs = new Emitter[]>(); - onDidChangeOutputs: Event[]> = this._onDidChangeOutputs.event; + private _onDidChangeOutputs = new Emitter[]>(); + onDidChangeOutputs: Event[]> = this._onDidChangeOutputs.event; // private _textDocument: vscode.TextDocument | undefined; // private _initalVersion: number = -1; - private _outputMapping = new Set(); + private _outputMapping = new WeakMap(); private _metadata: vscode.NotebookCellMetadata; private _metadataChangeListener: IDisposable; @@ -91,6 +100,10 @@ export class ExtHostCell extends Disposable implements vscode.NotebookCell { ); this._outputs = outputs; + for (const output of this._outputs) { + this._outputMapping.set(output, output.outputId); + delete output.outputId; + } const observableMetadata = getObservable(_metadata || {}); this._metadata = observableMetadata.proxy; @@ -104,22 +117,33 @@ export class ExtHostCell extends Disposable implements vscode.NotebookCell { } set outputs(newOutputs: vscode.CellOutput[]) { - let diffs = diff(this._outputs || [], newOutputs || [], (a) => { + let rawDiffs = diff(this._outputs || [], newOutputs || [], (a) => { return this._outputMapping.has(a); }); - diffs.forEach(diff => { + const transformedDiffs: ISplice[] = rawDiffs.map(diff => { for (let i = diff.start; i < diff.start + diff.deleteCount; i++) { this._outputMapping.delete(this._outputs[i]); } - diff.toInsert.forEach(output => { - this._outputMapping.add(output); - }); + return { + deleteCount: diff.deleteCount, + start: diff.start, + toInsert: diff.toInsert.map((output): IProcessedOutput => { + if (output.outputKind === CellOutputKind.Rich) { + const uuid = generateUuid(); + this._outputMapping.set(output, uuid); + return { ...output, outputId: uuid }; + } + + this._outputMapping.set(output, undefined); + return output; + }) + }; }); this._outputs = newOutputs; - this._onDidChangeOutputs.fire(diffs); + this._onDidChangeOutputs.fire(transformedDiffs); } get metadata() { @@ -223,6 +247,47 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo return this._versionId; } + private _backupCounter = 1; + + private _backup?: vscode.NotebookDocumentBackup; + + + private readonly _edits = new Cache('notebook documents'); + + + addEdit(item: vscode.NotebookDocumentEditEvent): number { + return this._edits.add([item]); + } + + async undo(editId: number, isDirty: boolean): Promise { + await this.getEdit(editId).undo(); + // if (!isDirty) { + // this.disposeBackup(); + // } + } + + async redo(editId: number, isDirty: boolean): Promise { + await this.getEdit(editId).redo(); + // if (!isDirty) { + // this.disposeBackup(); + // } + } + + private getEdit(editId: number): vscode.NotebookDocumentEditEvent { + const edit = this._edits.get(editId, 0); + if (!edit) { + throw new Error('No edit found'); + } + + return edit; + } + + disposeEdits(editIds: number[]): void { + for (const id of editIds) { + this._edits.delete(id); + } + } + private _disposed = false; constructor( @@ -231,7 +296,8 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo private _emitter: INotebookEventEmitter, public viewType: string, public uri: URI, - public renderingHandler: ExtHostNotebookOutputRenderingHandler + public renderingHandler: ExtHostNotebookOutputRenderingHandler, + private readonly _storagePath: URI | undefined ) { super(); @@ -246,6 +312,24 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo this._proxy.$updateNotebookMetadata(this.viewType, this.uri, this._metadata); } + getNewBackupUri(): URI { + if (!this._storagePath) { + throw new Error('Backup requires a valid storage path'); + } + const fileName = hashPath(this.uri) + (this._backupCounter++); + return joinPath(this._storagePath, fileName); + } + + updateBackup(backup: vscode.NotebookDocumentBackup): void { + this._backup?.delete(); + this._backup = backup; + } + + disposeBackup(): void { + this._backup?.delete(); + this._backup = undefined; + } + dispose() { this._disposed = true; super.dispose(); @@ -375,7 +459,7 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo this._emitter.emitCellLanguageChange(event); } - async eventuallyUpdateCellOutputs(cell: ExtHostCell, diffs: ISplice[]) { + async eventuallyUpdateCellOutputs(cell: ExtHostCell, diffs: ISplice[]) { let renderers = new Set(); let outputDtos: NotebookCellOutputsSplice[] = diffs.map(diff => { let outputs = diff.toInsert; @@ -447,8 +531,8 @@ export class NotebookEditorCellEditBuilder implements vscode.NotebookEditorCellE source: sourceArr, language, cellKind: type, - outputs: outputs, - metadata + outputs: outputs.map(o => addIdToOutput(o)), + metadata, }; this._collectedEdits.push({ @@ -469,6 +553,51 @@ export class NotebookEditorCellEditBuilder implements vscode.NotebookEditorCellE } } +class ExtHostWebviewCommWrapper extends Disposable { + private readonly _onDidReceiveDocumentMessage = new Emitter(); + private readonly _rendererIdToEmitters = new Map>(); + + constructor( + private _editorId: string, + public uri: URI, + private _proxy: MainThreadNotebookShape, + private _webviewInitData: WebviewInitData, + public document: ExtHostNotebookDocument, + ) { + super(); + } + + public onDidReceiveMessage(forRendererId: string | undefined, message: any) { + this._onDidReceiveDocumentMessage.fire(message); + if (forRendererId !== undefined) { + this._rendererIdToEmitters.get(forRendererId)?.fire(message); + } + } + + public readonly contentProviderComm: vscode.NotebookCommunication = { + editorId: this._editorId, + onDidReceiveMessage: this._onDidReceiveDocumentMessage.event, + postMessage: (message: any) => this._proxy.$postMessage(this._editorId, undefined, message), + asWebviewUri: (uri: vscode.Uri) => this._asWebviewUri(uri), + }; + + public getRendererComm(rendererId: string): vscode.NotebookCommunication { + const emitter = new Emitter(); + this._rendererIdToEmitters.set(rendererId, emitter); + return { + editorId: this._editorId, + onDidReceiveMessage: emitter.event, + postMessage: (message: any) => this._proxy.$postMessage(this._editorId, rendererId, message), + asWebviewUri: (uri: vscode.Uri) => this._asWebviewUri(uri), + }; + } + + + private _asWebviewUri(localResource: vscode.Uri): vscode.Uri { + return asWebviewUri(this._webviewInitData, this._editorId, localResource); + } +} + export class ExtHostNotebookEditor extends Disposable implements vscode.NotebookEditor { private _viewColumn: vscode.ViewColumn | undefined; @@ -502,6 +631,7 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook private _onDidDispose = new Emitter(); readonly onDidDispose: Event = this._onDidDispose.event; + private _onDidReceiveMessage = new Emitter(); onDidReceiveMessage: vscode.Event = this._onDidReceiveMessage.event; constructor( @@ -509,8 +639,7 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook readonly id: string, public uri: URI, private _proxy: MainThreadNotebookShape, - private _onDidReceiveMessage: Emitter, - private _webviewInitData: WebviewInitData, + private _webComm: vscode.NotebookCommunication, public document: ExtHostNotebookDocument, private _documentsAndEditors: ExtHostDocumentsAndEditors ) { @@ -536,6 +665,10 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook } } })); + + this._register(this._webComm.onDidReceiveMessage(e => { + this._onDidReceiveMessage.fire(e); + })); } edit(callback: (editBuilder: NotebookEditorCellEditBuilder) => void): Thenable { @@ -595,11 +728,11 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook } async postMessage(message: any): Promise { - return this._proxy.$postMessage(this.document.handle, message); + return this._webComm.postMessage(message); } asWebviewUri(localResource: vscode.Uri): vscode.Uri { - return asWebviewUri(this._webviewInitData, this.id, localResource); + return this._webComm.asWebviewUri(localResource); } dispose() { this._onDidDispose.fire(); @@ -609,6 +742,7 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook export class ExtHostNotebookOutputRenderer { private static _handlePool: number = 0; + private resolvedComms = new WeakSet(); readonly handle = ExtHostNotebookOutputRenderer._handlePool++; constructor( @@ -620,21 +754,27 @@ export class ExtHostNotebookOutputRenderer { } matches(mimeType: string): boolean { - if (this.filter.subTypes) { - if (this.filter.subTypes.indexOf(mimeType) >= 0) { + if (this.filter.mimeTypes) { + if (this.filter.mimeTypes.indexOf(mimeType) >= 0) { return true; } } return false; } - render(document: ExtHostNotebookDocument, output: vscode.CellDisplayOutput, mimeType: string): string { - let html = this.renderer.render(document, output, mimeType); + resolveNotebook(document: ExtHostNotebookDocument, comm: ExtHostWebviewCommWrapper) { + if (!this.resolvedComms.has(comm) && this.renderer.resolveNotebook) { + this.renderer.resolveNotebook(document, comm.getRendererComm(this.type)); + this.resolvedComms.add(comm); + } + } + + render(document: ExtHostNotebookDocument, output: vscode.CellDisplayOutput, outputId: string, mimeType: string): string { + let html = this.renderer.render(document, { output, outputId, mimeType }); return html; } } - export interface ExtHostNotebookOutputRenderingHandler { outputDisplayOrder: INotebookDisplayOrder | undefined; findBestMatchedRenderer(mimeType: string): ExtHostNotebookOutputRenderer[]; @@ -646,8 +786,10 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN private readonly _notebookKernels = new Map(); private readonly _documents = new Map(); private readonly _unInitializedDocuments = new Map(); - private readonly _editors = new Map; }>(); + private readonly _editors = new Map(); + private readonly _webviewComm = new Map(); private readonly _notebookOutputRenderers = new Map(); + private readonly _renderersUsedInNotebooks = new WeakMap>(); private readonly _onDidChangeNotebookCells = new Emitter(); readonly onDidChangeNotebookCells = this._onDidChangeNotebookCells.event; private readonly _onDidChangeCellOutputs = new Emitter(); @@ -681,7 +823,13 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN private _onDidChangeVisibleNotebookEditors = new Emitter(); onDidChangeVisibleNotebookEditors = this._onDidChangeVisibleNotebookEditors.event; - constructor(mainContext: IMainContext, commands: ExtHostCommands, private _documentsAndEditors: ExtHostDocumentsAndEditors, private readonly _webviewInitData: WebviewInitData) { + constructor( + mainContext: IMainContext, + commands: ExtHostCommands, + private _documentsAndEditors: ExtHostDocumentsAndEditors, + private readonly _webviewInitData: WebviewInitData, + private readonly _extensionStoragePaths?: IExtensionStoragePaths, + ) { this._proxy = mainContext.getProxy(MainContext.MainThreadNotebook); commands.registerArgumentProcessor({ @@ -735,14 +883,17 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } const renderer = this._notebookOutputRenderers.get(id)!; + this.provideCommToNotebookRenderers(document, renderer); + const cellsResponse: IOutputRenderResponseCellInfo[] = request.items.map(cellInfo => { - const cell = document.getCell2(cellInfo.key); + const cell = document.getCell2(cellInfo.key)!; const outputResponse: IOutputRenderResponseOutputInfo[] = cellInfo.outputs.map(output => { return { index: output.index, + outputId: output.outputId, mimeType: output.mimeType, handlerId: id, - transformedOutput: renderer.render(document, cell!.outputs[output.index] as vscode.CellDisplayOutput, output.mimeType) + transformedOutput: renderer.render(document, cell.outputs[output.index] as vscode.CellDisplayOutput, output.outputId, output.mimeType) }; }); @@ -770,13 +921,16 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } const renderer = this._notebookOutputRenderers.get(id)!; + this.provideCommToNotebookRenderers(document, renderer); + const cellsResponse: IOutputRenderResponseCellInfo[] = request.items.map(cellInfo => { const outputResponse: IOutputRenderResponseOutputInfo[] = cellInfo.outputs.map(output => { return { index: output.index, + outputId: output.outputId, mimeType: output.mimeType, handlerId: id, - transformedOutput: renderer.render(document, output.output! as vscode.CellDisplayOutput, output.mimeType) + transformedOutput: renderer.render(document, output.output! as vscode.CellDisplayOutput, output.outputId, output.mimeType) }; }); @@ -817,10 +971,26 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN this._notebookContentProviders.set(viewType, { extension, provider }); const listener = provider.onDidChangeNotebook - ? provider.onDidChangeNotebook(e => this._proxy.$onNotebookChange(viewType, e.document.uri)) + ? provider.onDidChangeNotebook(e => { + const document = this._documents.get(URI.revive(e.document.uri).toString()); + + if (!document) { + throw new Error(`Notebook document ${e.document.uri.toString()} not found`); + } + + if (isEditEvent(e)) { + const editId = document.addEdit(e); + this._proxy.$onDidEdit(e.document.uri, viewType, editId, e.label); + } else { + this._proxy.$onContentChange(e.document.uri, viewType); + } + }) : Disposable.None; - this._proxy.$registerNotebookProvider({ id: extension.identifier, location: extension.extensionLocation }, viewType, provider.kernel ? { id: viewType, label: provider.kernel.label, extensionLocation: extension.extensionLocation, preloads: provider.kernel.preloads } : undefined); + const supportBackup = !!provider.backupNotebook; + + this._proxy.$registerNotebookProvider({ id: extension.identifier, location: extension.extensionLocation }, viewType, supportBackup, provider.kernel ? { id: viewType, label: provider.kernel.label, extensionLocation: extension.extensionLocation, preloads: provider.kernel.preloads } : undefined); + return new extHostTypes.Disposable(() => { listener.dispose(); this._notebookContentProviders.delete(viewType); @@ -843,11 +1013,16 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN }); } - async $resolveNotebookData(viewType: string, uri: UriComponents): Promise { + async $resolveNotebookData(viewType: string, uri: UriComponents, backupId?: string): Promise { const provider = this._notebookContentProviders.get(viewType); const revivedUri = URI.revive(uri); if (provider) { + let storageRoot: URI | undefined; + if (this._extensionStoragePaths) { + storageRoot = URI.file(this._extensionStoragePaths.workspaceValue(provider.extension) ?? this._extensionStoragePaths.globalValue(provider.extension)); + } + let document = this._documents.get(URI.revive(uri).toString()); if (!document) { @@ -862,18 +1037,21 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN emitCellLanguageChange(event: vscode.NotebookCellLanguageChangeEvent): void { that._onDidChangeCellLanguage.fire(event); } - }, viewType, revivedUri, this); + }, viewType, revivedUri, this, storageRoot); this._unInitializedDocuments.set(revivedUri.toString(), document); } - const rawCells = await provider.provider.openNotebook(URI.revive(uri)); + const rawCells = await provider.provider.openNotebook(URI.revive(uri), { backupId }); const dto = { metadata: { ...notebookDocumentMetadataDefaults, ...rawCells.metadata }, languages: rawCells.languages, - cells: rawCells.cells, + cells: rawCells.cells.map(cell => ({ + ...cell, + outputs: cell.outputs.map(o => addIdToOutput(o)) + })), }; return dto; @@ -882,6 +1060,47 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN return; } + async $resolveNotebookEditor(viewType: string, uri: UriComponents, editorId: string): Promise { + const provider = this._notebookContentProviders.get(viewType); + const revivedUri = URI.revive(uri); + const document = this._documents.get(revivedUri.toString()); + if (!document || !provider) { + return; + } + + let webComm = this._webviewComm.get(editorId); + if (!webComm) { + webComm = new ExtHostWebviewCommWrapper(editorId, revivedUri, this._proxy, this._webviewInitData, document); + this._webviewComm.set(editorId, webComm); + } + + if (!provider.provider.resolveNotebook) { + return; + } + + await provider.provider.resolveNotebook(document, webComm.contentProviderComm); + } + + private provideCommToNotebookRenderers(document: ExtHostNotebookDocument, renderer: ExtHostNotebookOutputRenderer) { + let alreadyRegistered = this._renderersUsedInNotebooks.get(document); + if (!alreadyRegistered) { + alreadyRegistered = new Set(); + this._renderersUsedInNotebooks.set(document, alreadyRegistered); + } + + if (alreadyRegistered.has(renderer)) { + return; + } + + alreadyRegistered.add(renderer); + for (const editorId of this._editors.keys()) { + const comm = this._webviewComm.get(editorId); + if (comm) { + renderer.resolveNotebook(document, comm); + } + } + } + async $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined, useAttachedKernel: boolean, token: CancellationToken): Promise { let document = this._documents.get(URI.revive(uri).toString()); @@ -932,12 +1151,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } if (this._notebookContentProviders.has(viewType)) { - try { - await this._notebookContentProviders.get(viewType)!.provider.saveNotebook(document, token); - } catch (e) { - return false; - } - + await this._notebookContentProviders.get(viewType)!.provider.saveNotebook(document, token); return true; } @@ -951,18 +1165,46 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } if (this._notebookContentProviders.has(viewType)) { - try { - await this._notebookContentProviders.get(viewType)!.provider.saveNotebookAs(URI.revive(target), document, token); - } catch (e) { - return false; - } - + await this._notebookContentProviders.get(viewType)!.provider.saveNotebookAs(URI.revive(target), document, token); return true; } return false; } + async $undoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise { + const document = this._documents.get(URI.revive(uri).toString()); + if (!document) { + return; + } + + document.undo(editId, isDirty); + + } + + async $redoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise { + const document = this._documents.get(URI.revive(uri).toString()); + if (!document) { + return; + } + + document.redo(editId, isDirty); + } + + + async $backup(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise { + const document = this._documents.get(URI.revive(uri).toString()); + const provider = this._notebookContentProviders.get(viewType); + + if (document && provider && provider.provider.backupNotebook) { + const backup = await provider.provider.backupNotebook(document, { destination: document.getNewBackupUri() }, cancellation); + document.updateBackup(backup); + return backup.id; + } + + return; + } + $acceptDisplayOrder(displayOrder: INotebookDisplayOrder): void { this._outputDisplayOrder = displayOrder; } @@ -970,7 +1212,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN // TODO: remove document - editor one on one mapping private _getEditorFromURI(uriComponents: UriComponents) { const uriStr = URI.revive(uriComponents).toString(); - let editor: { editor: ExtHostNotebookEditor, onDidReceiveMessage: Emitter; } | undefined; + let editor: { editor: ExtHostNotebookEditor } | undefined; this._editors.forEach(e => { if (e.editor.uri.toString() === uriStr) { editor = e; @@ -980,12 +1222,8 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN return editor; } - $onDidReceiveMessage(editorId: string, message: any): void { - let editor = this._editors.get(editorId); - - if (editor) { - editor.onDidReceiveMessage.fire(message); - } + $onDidReceiveMessage(editorId: string, forRendererType: string | undefined, message: any): void { + this._webviewComm.get(editorId)?.onDidReceiveMessage(forRendererType, message); } $acceptModelChanged(uriComponents: UriComponents, event: NotebookCellsChangedEvent): void { @@ -1023,16 +1261,20 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } private _createExtHostEditor(document: ExtHostNotebookDocument, editorId: string, selections: number[]) { - const onDidReceiveMessage = new Emitter(); const revivedUri = document.uri; + let webComm = this._webviewComm.get(editorId); + + if (!webComm) { + webComm = new ExtHostWebviewCommWrapper(editorId, revivedUri, this._proxy, this._webviewInitData, document); + this._webviewComm.set(editorId, webComm); + } let editor = new ExtHostNotebookEditor( document.viewType, editorId, revivedUri, this._proxy, - onDidReceiveMessage, - this._webviewInitData, + webComm.contentProviderComm, document, this._documentsAndEditors ); @@ -1048,7 +1290,11 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN this._editors.get(editorId)?.editor.dispose(); - this._editors.set(editorId, { editor, onDidReceiveMessage }); + for (const renderer of this._renderersUsedInNotebooks.get(document) ?? []) { + renderer.resolveNotebook(document, webComm); + } + + this._editors.set(editorId, { editor }); } async $acceptDocumentAndEditorsDelta(delta: INotebookDocumentsAndEditorsDelta) { @@ -1069,7 +1315,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN [...this._editors.values()].forEach((e) => { if (e.editor.uri.toString() === revivedUriStr) { e.editor.dispose(); - e.onDidReceiveMessage.dispose(); this._editors.delete(e.editor.id); editorChanged = true; } @@ -1082,8 +1327,15 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN const revivedUri = URI.revive(modelData.uri); const revivedUriStr = revivedUri.toString(); const viewType = modelData.viewType; + const entry = this._notebookContentProviders.get(viewType); + let storageRoot: URI | undefined; + if (entry && this._extensionStoragePaths) { + storageRoot = URI.file(this._extensionStoragePaths.workspaceValue(entry.extension) ?? this._extensionStoragePaths.globalValue(entry.extension)); + } + if (!this._documents.has(revivedUriStr)) { const that = this; + let document = this._unInitializedDocuments.get(revivedUriStr) ?? new ExtHostNotebookDocument(this._proxy, this._documentsAndEditors, { emitModelChange(event: vscode.NotebookCellsChangeEvent): void { that._onDidChangeNotebookCells.fire(event); @@ -1094,7 +1346,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN emitCellLanguageChange(event: vscode.NotebookCellLanguageChangeEvent): void { that._onDidChangeCellLanguage.fire(event); } - }, viewType, revivedUri, this); + }, viewType, revivedUri, this, storageRoot); this._unInitializedDocuments.delete(revivedUriStr); if (modelData.metadata) { @@ -1145,7 +1397,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN }); } - const removedEditors: { editor: ExtHostNotebookEditor, onDidReceiveMessage: Emitter; }[] = []; + const removedEditors: { editor: ExtHostNotebookEditor }[] = []; if (delta.removedEditors) { delta.removedEditors.forEach(editorid => { @@ -1167,7 +1419,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN if (editorChanged) { removedEditors.forEach(e => { e.editor.dispose(); - e.onDidReceiveMessage.dispose(); }); } @@ -1208,3 +1459,13 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } } } + +function hashPath(resource: URI): string { + const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString(); + return hash(str) + ''; +} + +function isEditEvent(e: vscode.NotebookDocumentEditEvent | vscode.NotebookDocumentContentChangeEvent): e is vscode.NotebookDocumentEditEvent { + return typeof (e as vscode.NotebookDocumentEditEvent).undo === 'function' + && typeof (e as vscode.NotebookDocumentEditEvent).redo === 'function'; +} diff --git a/src/vs/workbench/api/common/extHostNotebookConcatDocument.ts b/src/vs/workbench/api/common/extHostNotebookConcatDocument.ts index c23541ca7d2..31f9e24775b 100644 --- a/src/vs/workbench/api/common/extHostNotebookConcatDocument.ts +++ b/src/vs/workbench/api/common/extHostNotebookConcatDocument.ts @@ -12,7 +12,7 @@ import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer' import { DisposableStore } from 'vs/base/common/lifecycle'; import { score } from 'vs/editor/common/modes/languageSelector'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { isEqual } from 'vs/base/common/resources'; +import { ResourceMap } from 'vs/base/common/map'; export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextDocument { @@ -20,6 +20,7 @@ export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextD private _isClosed = false; private _cells!: ExtHostCell[]; + private _cellUris!: ResourceMap; private _cellLengths!: PrefixSumComputer; private _cellLines!: PrefixSumComputer; private _versionId = 0; @@ -36,8 +37,8 @@ export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextD this._init(); this._disposables.add(extHostDocuments.onDidChangeDocument(e => { - let cellIdx = this._cells.findIndex(cell => isEqual(cell.uri, e.document.uri)); - if (cellIdx >= 0) { + let cellIdx = this._cellUris.get(e.document.uri); + if (cellIdx !== undefined) { this._cellLengths.changeValue(cellIdx, this._cells[cellIdx].document.getText().length + 1); this._cellLines.changeValue(cellIdx, this._cells[cellIdx].document.lineCount); this._versionId += 1; @@ -53,7 +54,6 @@ export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextD }; this._disposables.add(extHostNotebooks.onDidChangeCellLanguage(e => documentChange(e.document))); - this._disposables.add(extHostNotebooks.onDidChangeCellOutputs(e => documentChange(e.document))); this._disposables.add(extHostNotebooks.onDidChangeNotebookCells(e => documentChange(e.document))); } @@ -68,10 +68,12 @@ export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextD private _init() { this._cells = []; + this._cellUris = new ResourceMap(); const cellLengths: number[] = []; const cellLineCounts: number[] = []; for (let cell of this._notebook.cells) { if (cell.cellKind === CellKind.Code && (!this._selector || score(this._selector, cell.uri, cell.language, true))) { + this._cellUris.set(cell.uri, this._cells.length); this._cells.push(cell); cellLengths.push(cell.document.getText().length + 1); cellLineCounts.push(cell.document.lineCount); @@ -103,8 +105,8 @@ export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextD // get start and end locations and create substrings const start = this.locationAt(range.start); const end = this.locationAt(range.end); - const startCell = this._cells.find(cell => isEqual(cell.uri, start.uri)); - const endCell = this._cells.find(cell => isEqual(cell.uri, end.uri)); + const startCell = this._cells[this._cellUris.get(start.uri) ?? -1]; + const endCell = this._cells[this._cellUris.get(end.uri) ?? -1]; if (!startCell || !endCell) { return ''; @@ -131,8 +133,8 @@ export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextD return this._cells[idx.index].document.positionAt(idx.remainder).translate(lineCount); } - const idx = this._cells.findIndex(cell => isEqual(cell.uri, locationOrOffset.uri)); - if (idx >= 0) { + const idx = this._cellUris.get(locationOrOffset.uri); + if (idx !== undefined) { let line = this._cellLines.getAccumulatedValue(idx - 1); return new types.Position(line + locationOrOffset.range.start.line, locationOrOffset.range.start.character); } @@ -159,4 +161,24 @@ export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextD const startCell = this._cells[startIdx.index]; return new types.Location(startCell.uri, startCell.document.validateRange(range)); } + + contains(uri: vscode.Uri): boolean { + return this._cellUris.has(uri); + } + + validateRange(range: vscode.Range): vscode.Range { + const start = this.validatePosition(range.start); + const end = this.validatePosition(range.end); + return range.with(start, end); + } + + validatePosition(position: vscode.Position): vscode.Position { + const startIdx = this._cellLines.getIndexOf(position.line); + + const cellPosition = new types.Position(startIdx.remainder, position.character); + const validCellPosition = this._cells[startIdx.index].document.validatePosition(cellPosition); + + const line = this._cellLines.getAccumulatedValue(startIdx.index - 1); + return new types.Position(line + validCellPosition.line, validCellPosition.character); + } } diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index 50473953083..6464c9af686 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -536,7 +536,7 @@ export class ExtHostSCM implements ExtHostSCMShape { private readonly _onDidChangeActiveProvider = new Emitter(); get onDidChangeActiveProvider(): Event { return this._onDidChangeActiveProvider.event; } - private _selectedSourceControlHandles = new Set(); + private _selectedSourceControlHandle: number | undefined; constructor( mainContext: IMainContext, @@ -681,40 +681,18 @@ export class ExtHostSCM implements ExtHostSCMShape { }); } - $setSelectedSourceControls(selectedSourceControlHandles: number[]): Promise { - this.logService.trace('ExtHostSCM#$setSelectedSourceControls', selectedSourceControlHandles); + $setSelectedSourceControl(selectedSourceControlHandle: number | undefined): Promise { + this.logService.trace('ExtHostSCM#$setSelectedSourceControl', selectedSourceControlHandle); - const set = new Set(); - - for (const handle of selectedSourceControlHandles) { - set.add(handle); + if (selectedSourceControlHandle !== undefined) { + this._sourceControls.get(selectedSourceControlHandle)?.setSelectionState(true); } - set.forEach(handle => { - if (!this._selectedSourceControlHandles.has(handle)) { - const sourceControl = this._sourceControls.get(handle); + if (this._selectedSourceControlHandle !== undefined) { + this._sourceControls.get(this._selectedSourceControlHandle)?.setSelectionState(false); + } - if (!sourceControl) { - return; - } - - sourceControl.setSelectionState(true); - } - }); - - this._selectedSourceControlHandles.forEach(handle => { - if (!set.has(handle)) { - const sourceControl = this._sourceControls.get(handle); - - if (!sourceControl) { - return; - } - - sourceControl.setSelectionState(false); - } - }); - - this._selectedSourceControlHandles = set; + this._selectedSourceControlHandle = selectedSourceControlHandle; return Promise.resolve(undefined); } } diff --git a/src/vs/workbench/api/common/extHostStatusBar.ts b/src/vs/workbench/api/common/extHostStatusBar.ts index bc2c6fa2d0b..edbaec0f60a 100644 --- a/src/vs/workbench/api/common/extHostStatusBar.ts +++ b/src/vs/workbench/api/common/extHostStatusBar.ts @@ -117,6 +117,11 @@ export class ExtHostStatusBarEntry implements vscode.StatusBarItem { this.update(); } + public set accessibilityInformation(accessibilityInformation: vscode.AccessibilityInformation | undefined) { + this._accessibilityInformation = accessibilityInformation; + this.update(); + } + public show(): void { this._visible = true; this.update(); diff --git a/src/vs/workbench/api/common/extHostTask.ts b/src/vs/workbench/api/common/extHostTask.ts index 27759c2666f..32f042f6cd7 100644 --- a/src/vs/workbench/api/common/extHostTask.ts +++ b/src/vs/workbench/api/common/extHostTask.ts @@ -512,12 +512,10 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape { public async $onDidStartTaskProcess(value: tasks.TaskProcessStartedDTO): Promise { const execution = await this.getTaskExecution(value.id); - if (execution) { - this._onDidTaskProcessStarted.fire({ - execution: execution, - processId: value.processId - }); - } + this._onDidTaskProcessStarted.fire({ + execution: execution, + processId: value.processId + }); } public get onDidEndTaskProcess(): Event { @@ -526,12 +524,10 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape { public async $onDidEndTaskProcess(value: tasks.TaskProcessEndedDTO): Promise { const execution = await this.getTaskExecution(value.id); - if (execution) { - this._onDidTaskProcessEnded.fire({ - execution: execution, - exitCode: value.exitCode - }); - } + this._onDidTaskProcessEnded.fire({ + execution: execution, + exitCode: value.exitCode + }); } protected abstract provideTasksInternal(validTypes: { [key: string]: boolean; }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[], extension: IExtensionDescription }; @@ -622,7 +618,7 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape { protected async getTaskExecution(execution: tasks.TaskExecutionDTO | string, task?: vscode.Task): Promise { if (typeof execution === 'string') { - const taskExecution = this._taskExecutions.get(execution); + const taskExecution = this._taskExecutionPromises.get(execution); if (!taskExecution) { throw new Error('Unexpected: The specified task is missing an execution'); } @@ -643,9 +639,11 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape { }); this._taskExecutionPromises.set(execution.id, createdResult); - return createdResult.then(result => { - this._taskExecutions.set(execution.id, result); - return result; + return createdResult.then(executionCreatedResult => { + this._taskExecutions.set(execution.id, executionCreatedResult); + return executionCreatedResult; + }, rejected => { + return Promise.reject(rejected); }); } @@ -708,7 +706,7 @@ export class WorkerExtHostTask extends ExtHostTaskBase { public async executeTask(extension: IExtensionDescription, task: vscode.Task): Promise { const dto = TaskDTO.from(task, extension); if (dto === undefined) { - return Promise.reject(new Error('Task is not valid')); + throw new Error('Task is not valid'); } // If this task is a custom execution, then we need to save it away @@ -720,7 +718,10 @@ export class WorkerExtHostTask extends ExtHostTaskBase { throw new Error('Not implemented'); } - return this._proxy.$executeTask(dto).then(value => this.getTaskExecution(value, task)); + // Always get the task execution first to prevent timing issues when retrieving it later + const execution = await this.getTaskExecution(await this._proxy.$getTaskExecution(dto), task); + this._proxy.$executeTask(dto).catch(error => { throw new Error(error); }); + return execution; } protected provideTasksInternal(validTypes: { [key: string]: boolean; }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[], extension: IExtensionDescription } { diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index c385606345f..fa5b30c76f9 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -5,11 +5,11 @@ import type * as vscode from 'vscode'; import { Event, Emitter } from 'vs/base/common/event'; -import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto, ITerminalDimensionsDto } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto, ITerminalDimensionsDto, ITerminalLinkDto } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { ITerminalChildProcess, ITerminalDimensions, EXT_HOST_CREATION_DELAY } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalChildProcess, ITerminalDimensions, EXT_HOST_CREATION_DELAY, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { timeout } from 'vs/base/common/async'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { TerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminalDataBuffering'; @@ -17,6 +17,7 @@ import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Disposable as VSCodeDisposable, EnvironmentVariableMutatorType } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { localize } from 'vs/nls'; export interface IExtHostTerminalService extends ExtHostTerminalServiceShape { @@ -38,6 +39,7 @@ export interface IExtHostTerminalService extends ExtHostTerminalServiceShape { getDefaultShell(useAutomationShell: boolean, configProvider: ExtHostConfigProvider): string; getDefaultShellArgs(useAutomationShell: boolean, configProvider: ExtHostConfigProvider): string[] | string; registerLinkHandler(handler: vscode.TerminalLinkHandler): vscode.Disposable; + registerLinkProvider(provider: vscode.TerminalLinkProvider): vscode.Disposable; getEnvironmentVariableCollection(extension: IExtensionDescription, persistent?: boolean): vscode.EnvironmentVariableCollection; } @@ -243,6 +245,10 @@ export class ExtHostPseudoterminal implements ITerminalChildProcess { constructor(private readonly _pty: vscode.Pseudoterminal) { } + async start(): Promise { + return undefined; + } + shutdown(): void { this._pty.close(); } @@ -288,6 +294,13 @@ export class ExtHostPseudoterminal implements ITerminalChildProcess { } } +let nextLinkId = 1; + +interface ICachedLinkEntry { + provider: vscode.TerminalLinkProvider; + link: vscode.TerminalLink; +} + export abstract class BaseExtHostTerminalService implements IExtHostTerminalService, ExtHostTerminalServiceShape { readonly _serviceBrand: undefined; @@ -302,6 +315,8 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ private readonly _bufferer: TerminalDataBufferer; private readonly _linkHandlers: Set = new Set(); + private readonly _linkProviders: Set = new Set(); + private readonly _terminalLinkCache: Map> = new Map(); public get activeTerminal(): ExtHostTerminal | undefined { return this._activeTerminal; } public get terminals(): ExtHostTerminal[] { return this._terminals; } @@ -332,7 +347,7 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ public abstract createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal; public abstract getDefaultShell(useAutomationShell: boolean, configProvider: ExtHostConfigProvider): string; public abstract getDefaultShellArgs(useAutomationShell: boolean, configProvider: ExtHostConfigProvider): string[] | string; - public abstract $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise; + public abstract $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise; public abstract $getAvailableShells(): Promise; public abstract $getDefaultShellAndArgs(useAutomationShell: boolean): Promise; public abstract $acceptWorkspacePermissionsChanged(isAllowed: boolean): void; @@ -454,20 +469,17 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ } } - public async $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): Promise { + public async $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): Promise { // Make sure the ExtHostTerminal exists so onDidOpenTerminal has fired before we call // Pseudoterminal.start const terminal = await this._getTerminalByIdEventually(id); if (!terminal) { - return; + return { message: localize('launchFail.idMissingOnExtHost', "Could not find the terminal with id {0} on the extension host", id) }; } // Wait for onDidOpenTerminal to fire - let openPromise: Promise; - if (terminal.isOpen) { - openPromise = Promise.resolve(); - } else { - openPromise = new Promise(r => { + if (!terminal.isOpen) { + await new Promise(r => { // Ensure open is called after onDidOpenTerminal const listener = this.onDidOpenTerminal(async e => { if (e === terminal) { @@ -477,7 +489,6 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ }); }); } - await openPromise; if (this._terminalProcesses[id]) { (this._terminalProcesses[id] as ExtHostPseudoterminal).startSendingEvents(initialDimensions); @@ -486,6 +497,7 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ this._extensionTerminalAwaitingStart[id] = { initialDimensions }; } + return undefined; } protected _setupExtHostProcessListeners(id: number, p: ITerminalChildProcess): IDisposable { @@ -545,17 +557,30 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ public registerLinkHandler(handler: vscode.TerminalLinkHandler): vscode.Disposable { this._linkHandlers.add(handler); - if (this._linkHandlers.size === 1) { + if (this._linkHandlers.size === 1 && this._linkProviders.size === 0) { this._proxy.$startHandlingLinks(); } return new VSCodeDisposable(() => { this._linkHandlers.delete(handler); - if (this._linkHandlers.size === 0) { + if (this._linkHandlers.size === 0 && this._linkProviders.size === 0) { this._proxy.$stopHandlingLinks(); } }); } + public registerLinkProvider(provider: vscode.TerminalLinkProvider): vscode.Disposable { + this._linkProviders.add(provider); + if (this._linkProviders.size === 1) { + this._proxy.$startLinkProvider(); + } + return new VSCodeDisposable(() => { + this._linkProviders.delete(provider); + if (this._linkProviders.size === 0) { + this._proxy.$stopLinkProvider(); + } + }); + } + public async $handleLink(id: number, link: string): Promise { const terminal = this._getTerminalById(id); if (!terminal) { @@ -575,6 +600,60 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ return false; } + public async $provideLinks(terminalId: number, line: string): Promise { + const terminal = this._getTerminalById(terminalId); + if (!terminal) { + return []; + } + + // Discard any cached links the terminal has been holding, currently all links are released + // when new links are provided. + this._terminalLinkCache.delete(terminalId); + + const result: ITerminalLinkDto[] = []; + const context: vscode.TerminalLinkContext = { terminal, line }; + const promises: vscode.ProviderResult<{ provider: vscode.TerminalLinkProvider, links: vscode.TerminalLink[] }>[] = []; + for (const provider of this._linkProviders) { + promises.push(new Promise(async r => { + const links = (await provider.provideTerminalLinks(context)) || []; + r({ provider, links }); + })); + } + + const provideResults = await Promise.all(promises); + const cacheLinkMap = new Map(); + for (const provideResult of provideResults) { + if (provideResult && provideResult.links.length > 0) { + result.push(...provideResult.links.map(providerLink => { + const endIndex = Math.max(providerLink.endIndex, providerLink.startIndex + 1); + const link = { + id: nextLinkId++, + startIndex: providerLink.startIndex, + length: endIndex - providerLink.startIndex, + label: providerLink.tooltip + }; + cacheLinkMap.set(link.id, { + provider: provideResult.provider, + link: providerLink + }); + return link; + })); + } + } + + this._terminalLinkCache.set(terminalId, cacheLinkMap); + + return result; + } + + $activateLink(terminalId: number, linkId: number): void { + const cachedLink = this._terminalLinkCache.get(terminalId)?.get(linkId); + if (!cachedLink) { + return; + } + cachedLink.provider.handleTerminalLink(cachedLink.link); + } + private _onProcessExit(id: number, exitCode: number | undefined): void { this._bufferer.stopBuffering(id); @@ -721,7 +800,7 @@ export class WorkerExtHostTerminalService extends BaseExtHostTerminalService { throw new Error('Not implemented'); } - public $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { + public $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { throw new Error('Not implemented'); } diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 67a97da2d52..ea8c42d7f1b 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -19,6 +19,8 @@ import { equals, coalesce } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; import { checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { MarkdownString } from 'vs/workbench/api/common/extHostTypeConverters'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; type TreeItemHandle = string; @@ -117,6 +119,22 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { return treeView.getChildren(treeItemHandle); } + async $hasResolve(treeViewId: string): Promise { + const treeView = this.treeViews.get(treeViewId); + if (!treeView) { + throw new Error(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)); + } + return treeView.hasResolve; + } + + $resolve(treeViewId: string, treeItemHandle: string): Promise { + const treeView = this.treeViews.get(treeViewId); + if (!treeView) { + throw new Error(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)); + } + return treeView.resolveTreeItem(treeItemHandle); + } + $setExpanded(treeViewId: string, treeItemHandle: string, expanded: boolean): void { const treeView = this.treeViews.get(treeViewId); if (!treeView) { @@ -158,6 +176,7 @@ type TreeData = { message: boolean, element: T | Root | false }; interface TreeNode extends IDisposable { item: ITreeItem; + extensionItem: vscode.TreeItem2; parent: TreeNode | Root; children?: TreeNode[]; } @@ -327,6 +346,27 @@ class ExtHostTreeView extends Disposable { } } + get hasResolve(): boolean { + return !!this.dataProvider.resolveTreeItem; + } + + async resolveTreeItem(treeItemHandle: string): Promise { + if (!this.dataProvider.resolveTreeItem) { + return; + } + const element = this.elements.get(treeItemHandle); + if (element) { + const node = this.nodes.get(element); + if (node) { + const resolve = await this.dataProvider.resolveTreeItem(element, node.extensionItem); + // Resolvable elements. Currently only tooltip. + node.item.tooltip = this.getTooltip(resolve.tooltip); + return node.item; + } + } + return; + } + private resolveUnknownParentChain(element: T): Promise { return this.resolveParent(element) .then((parent) => { @@ -486,6 +526,17 @@ class ExtHostTreeView extends Disposable { return node; } + private getTooltip(tooltip?: string | vscode.MarkdownString): string | IMarkdownString | undefined { + if (typeof tooltip === 'string') { + return tooltip; + } else if (tooltip === undefined) { + return undefined; + } else { + checkProposedApiEnabled(this.extension); + return MarkdownString.from(tooltip); + } + } + private createTreeNode(element: T, extensionTreeItem: vscode.TreeItem2, parent: TreeNode | Root): TreeNode { const disposable = new DisposableStore(); const handle = this.createHandle(element, extensionTreeItem, parent); @@ -496,7 +547,7 @@ class ExtHostTreeView extends Disposable { label: toTreeItemLabel(extensionTreeItem.label, this.extension), description: extensionTreeItem.description, resourceUri: extensionTreeItem.resourceUri, - tooltip: typeof extensionTreeItem.tooltip === 'string' ? extensionTreeItem.tooltip : undefined, + tooltip: this.getTooltip(extensionTreeItem.tooltip), command: extensionTreeItem.command ? this.commands.toInternal(extensionTreeItem.command, disposable) : undefined, contextValue: extensionTreeItem.contextValue, icon, @@ -508,6 +559,7 @@ class ExtHostTreeView extends Disposable { return { item, + extensionItem: extensionTreeItem, parent, children: undefined, dispose(): void { disposable.dispose(); } diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 6679b7bdd2a..6a7993f9ae7 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -646,7 +646,7 @@ export namespace DocumentSymbol { range: Range.from(info.range), selectionRange: Range.from(info.selectionRange), kind: SymbolKind.from(info.kind), - tags: info.tags ? info.tags.map(SymbolTag.from) : [] + tags: info.tags?.map(SymbolTag.from) ?? [] }; if (info.children) { result.children = info.children.map(from); @@ -911,7 +911,7 @@ export namespace CompletionItem { result.insertText = suggestion.insertText; result.kind = CompletionItemKind.to(suggestion.kind); - result.tags = suggestion.tags && suggestion.tags.map(CompletionItemTag.to); + result.tags = suggestion.tags?.map(CompletionItemTag.to); result.detail = suggestion.detail; result.documentation = htmlContent.isMarkdownString(suggestion.documentation) ? MarkdownString.to(suggestion.documentation) : suggestion.documentation; result.sortText = suggestion.sortText; diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 1cae03bf240..dd31d87042a 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -1252,7 +1252,7 @@ export class MarkdownString { // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash this.value += (this.supportThemeIcons ? escapeCodicons(value) : value) .replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&') - .replace('\n', '\n\n'); + .replace(/\n/, '\n\n'); return this; } @@ -2101,7 +2101,7 @@ export class TreeItem { iconPath?: string | URI | { light: string | URI; dark: string | URI; }; command?: vscode.Command; contextValue?: string; - tooltip?: string; + tooltip?: string | vscode.MarkdownString; constructor(label: string | vscode.TreeItemLabel, collapsibleState?: vscode.TreeItemCollapsibleState); constructor(resourceUri: URI, collapsibleState?: vscode.TreeItemCollapsibleState); @@ -2750,7 +2750,7 @@ export enum ExtensionMode { * The extension is installed normally (for example, from the marketplace * or VSIX) in VS Code. */ - Release = 1, + Production = 1, /** * The extension is running from an `--extensionDevelopmentPath` provided @@ -2769,7 +2769,7 @@ export enum ExtensionMode { //#region Authentication -export class AuthenticationSession implements vscode.AuthenticationSession2 { +export class AuthenticationSession implements vscode.AuthenticationSession { constructor(public id: string, public accessToken: string, public account: { displayName: string, id: string }, public scopes: string[]) { } } diff --git a/src/vs/workbench/api/common/extHostWindow.ts b/src/vs/workbench/api/common/extHostWindow.ts index f8c5d5fa3d7..b9f1cdee4b8 100644 --- a/src/vs/workbench/api/common/extHostWindow.ts +++ b/src/vs/workbench/api/common/extHostWindow.ts @@ -4,13 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { ExtHostWindowShape, MainContext, MainThreadWindowShape, IMainContext, IOpenUriOptions } from './extHost.protocol'; +import { ExtHostWindowShape, MainContext, MainThreadWindowShape, IOpenUriOptions } from './extHost.protocol'; import { WindowState } from 'vscode'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; -export class ExtHostWindow implements ExtHostWindowShape { +export class ExtHostWindow implements IExtHostWindow { private static InitialState: WindowState = { focused: true @@ -24,8 +26,8 @@ export class ExtHostWindow implements ExtHostWindowShape { private _state = ExtHostWindow.InitialState; get state(): WindowState { return this._state; } - constructor(mainContext: IMainContext) { - this._proxy = mainContext.getProxy(MainContext.MainThreadWindow); + constructor(@IExtHostRpcService extHostRpc: IExtHostRpcService) { + this._proxy = extHostRpc.getProxy(MainContext.MainThreadWindow); this._proxy.$getWindowVisibility().then(isFocused => this.$onDidChangeWindowFocus(isFocused)); } @@ -67,3 +69,6 @@ export class ExtHostWindow implements ExtHostWindowShape { return URI.from(result); } } + +export const IExtHostWindow = createDecorator('IExtHostWindow'); +export interface IExtHostWindow extends ExtHostWindow, ExtHostWindowShape { } diff --git a/src/vs/workbench/api/common/menusExtensionPoint.ts b/src/vs/workbench/api/common/menusExtensionPoint.ts index b1ac5aa3af8..9e38664bafc 100644 --- a/src/vs/workbench/api/common/menusExtensionPoint.ts +++ b/src/vs/workbench/api/common/menusExtensionPoint.ts @@ -338,7 +338,7 @@ namespace schema { type: 'string' }, icon: { - description: localize('vscode.extension.contributes.commandType.icon', '(Optional) Icon which is used to represent the command in the UI. Either a file path, an object with file paths for dark and light themes, or a theme icon references, like `$(zap)`'), + description: localize('vscode.extension.contributes.commandType.icon', '(Optional) Icon which is used to represent the command in the UI. Either a file path, an object with file paths for dark and light themes, or a theme icon references, like `\\$(zap)`'), anyOf: [{ type: 'string' }, diff --git a/src/vs/workbench/api/node/extHost.services.ts b/src/vs/workbench/api/node/extHost.services.ts index 72ad75d63ef..a6c0079600b 100644 --- a/src/vs/workbench/api/node/extHost.services.ts +++ b/src/vs/workbench/api/node/extHost.services.ts @@ -29,12 +29,14 @@ import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; import { IExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; import { ExtHostTunnelService } from 'vs/workbench/api/node/extHostTunnelService'; import { IExtHostApiDeprecationService, ExtHostApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService'; +import { IExtHostWindow, ExtHostWindow } from 'vs/workbench/api/common/extHostWindow'; // register singleton services registerSingleton(ILogService, ExtHostLogService); registerSingleton(IExtHostApiDeprecationService, ExtHostApiDeprecationService); registerSingleton(IExtHostOutputService, ExtHostOutputService2); registerSingleton(IExtHostWorkspace, ExtHostWorkspace); +registerSingleton(IExtHostWindow, ExtHostWindow); registerSingleton(IExtHostDecorations, ExtHostDecorations); registerSingleton(IExtHostConfiguration, ExtHostConfiguration); registerSingleton(IExtHostCommands, ExtHostCommands); diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index db4e3f67c92..7d3cc3b33c3 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -88,6 +88,7 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { const configProvider = await this._configurationService.getConfigProvider(); const shell = this._terminalService.getDefaultShell(true, configProvider); + let cwdForPrepareCommand: string | undefined; if (needNewTerminal || !this._integratedTerminalInstance) { @@ -97,8 +98,9 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { cwd: args.cwd, name: args.title || nls.localize('debug.terminal.title', "debuggee"), }; - delete (args as any).cwd; // TODO: remove this any cast this._integratedTerminalInstance = this._terminalService.createTerminalFromOptions(options); + } else { + cwdForPrepareCommand = args.cwd; } const terminal = this._integratedTerminalInstance; @@ -106,7 +108,7 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { terminal.show(); const shellProcessId = await this._integratedTerminalInstance.processId; - const command = prepareCommand(args, shell); + const command = prepareCommand(shell, args.args, cwdForPrepareCommand, args.env); terminal.sendText(command, true); return shellProcessId; @@ -121,5 +123,4 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { protected createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService { return new ExtHostVariableResolverService(folders, editorService, configurationService, process.env as env.IProcessEnvironment); } - } diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 5ec632cc283..37776af324e 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -53,7 +53,14 @@ export class ExtHostTask extends ExtHostTaskBase { const tTask = (task as types.Task); // We have a preserved ID. So the task didn't change. if (tTask._id !== undefined) { - return this._proxy.$executeTask(TaskHandleDTO.from(tTask)).then(value => this.getTaskExecution(value, task)); + // Always get the task execution first to prevent timing issues when retrieving it later + const executionDTO = await this._proxy.$getTaskExecution(TaskHandleDTO.from(tTask)); + if (executionDTO.task === undefined) { + throw new Error('Task from execution DTO is undefined'); + } + const execution = await this.getTaskExecution(executionDTO, task); + this._proxy.$executeTask(executionDTO.task).catch(() => { /* The error here isn't actionable. */ }); + return execution; } else { const dto = TaskDTO.from(task, extension); if (dto === undefined) { @@ -66,8 +73,10 @@ export class ExtHostTask extends ExtHostTaskBase { if (CustomExecutionDTO.is(dto.execution)) { await this.addCustomExecution(dto, task, false); } - - return this._proxy.$executeTask(dto).then(value => this.getTaskExecution(value, task)); + // Always get the task execution first to prevent timing issues when retrieving it later + const execution = await this.getTaskExecution(await this._proxy.$getTaskExecution(dto), task); + this._proxy.$executeTask(dto).catch(() => { /* The error here isn't actionable. */ }); + return execution; } } diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index ec6a950f155..ca0e5a2adb5 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -12,7 +12,7 @@ import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/termi import { IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration, ExtHostConfigProvider, IExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { ILogService } from 'vs/platform/log/common/log'; -import { IShellLaunchConfig, ITerminalEnvironment } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalEnvironment, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { ExtHostWorkspace, IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -129,7 +129,7 @@ export class ExtHostTerminalService extends BaseExtHostTerminalService { this._variableResolver = new ExtHostVariableResolverService(workspaceFolders || [], this._extHostDocumentsAndEditors, configProvider, process.env as platform.IProcessEnvironment); } - public async $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { + public async $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { const shellLaunchConfig: IShellLaunchConfig = { name: shellLaunchConfigDto.name, executable: shellLaunchConfigDto.executable, @@ -209,7 +209,15 @@ export class ExtHostTerminalService extends BaseExtHostTerminalService { // TODO: Support conpty on remote, it doesn't seem to work for some reason? // TODO: When conpty is enabled, only enable it when accessibilityMode is off const enableConpty = false; //terminalConfig.get('windowsEnableConpty') as boolean; - this._setupExtHostProcessListeners(id, new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, enableConpty, this._logService)); + + const terminalProcess = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, enableConpty, this._logService); + this._setupExtHostProcessListeners(id, terminalProcess); + const error = await terminalProcess.start(); + if (error) { + // TODO: Teardown? + return error; + } + return undefined; } public $getAvailableShells(): Promise { diff --git a/src/vs/workbench/api/worker/extHostExtensionService.ts b/src/vs/workbench/api/worker/extHostExtensionService.ts index 681b2797784..dd8f4e1fe7c 100644 --- a/src/vs/workbench/api/worker/extHostExtensionService.ts +++ b/src/vs/workbench/api/worker/extHostExtensionService.ts @@ -51,7 +51,7 @@ export class ExtHostExtensionService extends AbstractExtHostExtensionService { // fetch JS sources as text and create a new function around it const source = await response.text(); - const initFn = new Function('module', 'exports', 'require', 'window', `${source}\n//# sourceURL=${module.toString(true)}`); + const initFn = new Function('module', 'exports', 'require', `${source}\n//# sourceURL=${module.toString(true)}`); // define commonjs globals: `module`, `exports`, and `require` const _exports = {}; @@ -66,7 +66,7 @@ export class ExtHostExtensionService extends AbstractExtHostExtensionService { try { activationTimesBuilder.codeLoadingStart(); - initFn(_module, _exports, _require, self); + initFn(_module, _exports, _require); return (_module.exports !== _exports ? _module.exports : _exports); } finally { activationTimesBuilder.codeLoadingStop(); diff --git a/src/vs/workbench/browser/actions/developerActions.ts b/src/vs/workbench/browser/actions/developerActions.ts index 805ef7816e7..d92f9e86e77 100644 --- a/src/vs/workbench/browser/actions/developerActions.ts +++ b/src/vs/workbench/browser/actions/developerActions.ts @@ -249,7 +249,7 @@ class LogWorkingCopiesAction extends Action { // --- Actions Registration -const developerCategory = nls.localize('developer', "Developer"); +const developerCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); const registry = Registry.as(Extensions.WorkbenchActions); registry.registerWorkbenchAction(SyncActionDescriptor.from(InspectContextKeysAction), 'Developer: Inspect Context Keys', developerCategory); registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleScreencastModeAction), 'Developer: Toggle Screencast Mode', developerCategory); diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index 88371fe8b4c..04148ec2343 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -697,7 +697,7 @@ export class MoveFocusedViewAction extends Action { if (!(isViewSolo && currentLocation === ViewContainerLocation.Panel)) { items.push({ id: '_.panel.newcontainer', - label: nls.localize('moveFocusedView.newContainerInPanel', "New Panel Entry"), + label: nls.localize({ key: 'moveFocusedView.newContainerInPanel', comment: ['Creates a new top-level tab in the panel.'] }, "New Panel Entry"), }); } diff --git a/src/vs/workbench/browser/actions/listCommands.ts b/src/vs/workbench/browser/actions/listCommands.ts index f35b8067dda..9e3ab8cd90f 100644 --- a/src/vs/workbench/browser/actions/listCommands.ts +++ b/src/vs/workbench/browser/actions/listCommands.ts @@ -31,9 +31,6 @@ function focusDown(accessor: ServicesAccessor, arg2?: number, loop: boolean = fa const focused = accessor.get(IListService).lastFocusedList; const count = typeof arg2 === 'number' ? arg2 : 1; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -57,6 +54,9 @@ function focusDown(accessor: ServicesAccessor, arg2?: number, loop: boolean = fa tree.reveal(listFocus[0]); } } + + // Ensure DOM Focus + ensureDOMFocus(focused); } KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -135,9 +135,6 @@ function focusUp(accessor: ServicesAccessor, arg2?: number, loop: boolean = fals const focused = accessor.get(IListService).lastFocusedList; const count = typeof arg2 === 'number' ? arg2 : 1; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -161,6 +158,9 @@ function focusUp(accessor: ServicesAccessor, arg2?: number, loop: boolean = fals tree.reveal(listFocus[0]); } } + + // Ensure DOM Focus + ensureDOMFocus(focused); } KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -354,9 +354,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor) => { const focused = accessor.get(IListService).lastFocusedList; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -373,6 +370,9 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ list.focusPreviousPage(fakeKeyboardEvent); list.reveal(list.getFocus()[0]); } + + // Ensure DOM Focus + ensureDOMFocus(focused); } }); @@ -384,9 +384,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor) => { const focused = accessor.get(IListService).lastFocusedList; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -403,6 +400,9 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ list.focusNextPage(fakeKeyboardEvent); list.reveal(list.getFocus()[0]); } + + // Ensure DOM Focus + ensureDOMFocus(focused); } }); @@ -425,9 +425,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ function listFocusFirst(accessor: ServicesAccessor, options?: { fromFocused: boolean }): void { const focused = accessor.get(IListService).lastFocusedList; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -448,6 +445,9 @@ function listFocusFirst(accessor: ServicesAccessor, options?: { fromFocused: boo tree.reveal(focus[0]); } } + + // Ensure DOM Focus + ensureDOMFocus(focused); } KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -469,9 +469,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ function listFocusLast(accessor: ServicesAccessor, options?: { fromFocused: boolean }): void { const focused = accessor.get(IListService).lastFocusedList; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -492,6 +489,9 @@ function listFocusLast(accessor: ServicesAccessor, options?: { fromFocused: bool tree.reveal(focus[0]); } } + + // Ensure DOM Focus + ensureDOMFocus(focused); } @@ -502,29 +502,28 @@ function focusElement(accessor: ServicesAccessor, retainCurrentFocus: boolean): if (focused instanceof List || focused instanceof PagedList) { const list = focused; list.setSelection(list.getFocus(), fakeKeyboardEvent); - list.open(list.getFocus(), fakeKeyboardEvent); } // Trees else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { - const list = focused; - const focus = list.getFocus(); + const tree = focused; + const focus = tree.getFocus(); if (focus.length > 0) { let toggleCollapsed = true; - if (list.expandOnlyOnTwistieClick === true) { + if (tree.expandOnlyOnTwistieClick === true) { toggleCollapsed = false; - } else if (typeof list.expandOnlyOnTwistieClick !== 'boolean' && list.expandOnlyOnTwistieClick(focus[0])) { + } else if (typeof tree.expandOnlyOnTwistieClick !== 'boolean' && tree.expandOnlyOnTwistieClick(focus[0])) { toggleCollapsed = false; } if (toggleCollapsed) { - list.toggleCollapsed(focus[0]); + tree.toggleCollapsed(focus[0]); } } - list.setSelection(focus, fakeKeyboardEvent); - list.open(focus, fakeKeyboardEvent); + tree.setSelection(focus, fakeKeyboardEvent); + tree.open(fakeKeyboardEvent); } } diff --git a/src/vs/workbench/browser/actions/quickAccessActions.ts b/src/vs/workbench/browser/actions/quickAccessActions.ts index 0295a2580ff..ca9637c09cf 100644 --- a/src/vs/workbench/browser/actions/quickAccessActions.ts +++ b/src/vs/workbench/browser/actions/quickAccessActions.ts @@ -138,7 +138,7 @@ CommandsRegistry.registerCommand({ handler: async function (accessor: ServicesAccessor, prefix: unknown) { const quickInputService = accessor.get(IQuickInputService); - quickInputService.quickAccess.show(typeof prefix === 'string' ? prefix : undefined); + quickInputService.quickAccess.show(typeof prefix === 'string' ? prefix : undefined, { preserveValue: typeof prefix === 'string' /* preserve as is if provided */ }); }, description: { description: `Quick access`, diff --git a/src/vs/workbench/browser/actions/windowActions.ts b/src/vs/workbench/browser/actions/windowActions.ts index e94ac69f805..2889309b267 100644 --- a/src/vs/workbench/browser/actions/windowActions.ts +++ b/src/vs/workbench/browser/actions/windowActions.ts @@ -344,7 +344,7 @@ registry.registerWorkbenchAction(SyncActionDescriptor.from(OpenRecentAction, { p const viewCategory = nls.localize('view', "View"); registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleFullScreenAction, { primary: KeyCode.F11, mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.KEY_F } }), 'View: Toggle Full Screen', viewCategory); -const developerCategory = nls.localize('developer', "Developer"); +const developerCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); registry.registerWorkbenchAction(SyncActionDescriptor.from(ReloadWindowAction), 'Developer: Reload Window', developerCategory); const helpCategory = nls.localize('help', "Help"); diff --git a/src/vs/workbench/browser/actions/workspaceCommands.ts b/src/vs/workbench/browser/actions/workspaceCommands.ts index 5a9786f2bfc..24dc2f9d644 100644 --- a/src/vs/workbench/browser/actions/workspaceCommands.ts +++ b/src/vs/workbench/browser/actions/workspaceCommands.ts @@ -18,7 +18,6 @@ import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { IViewDescriptorService, IViewsService, ViewContainerLocation } from 'vs/workbench/common/views'; export const ADD_ROOT_FOLDER_COMMAND_ID = 'addRootFolder'; export const ADD_ROOT_FOLDER_LABEL = nls.localize('addFolderToWorkspace', "Add Folder to Workspace..."); @@ -55,8 +54,6 @@ CommandsRegistry.registerCommand({ CommandsRegistry.registerCommand({ id: ADD_ROOT_FOLDER_COMMAND_ID, handler: async (accessor) => { - const viewDescriptorService = accessor.get(IViewDescriptorService); - const viewsService = accessor.get(IViewsService); const workspaceEditingService = accessor.get(IWorkspaceEditingService); const dialogsService = accessor.get(IFileDialogService); const folders = await dialogsService.showOpenDialog({ @@ -72,7 +69,6 @@ CommandsRegistry.registerCommand({ } await workspaceEditingService.addFolders(folders.map(folder => ({ uri: resources.removeTrailingPathSeparator(folder) }))); - await viewsService.openViewContainer(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)!.id, true); } }); diff --git a/src/vs/workbench/browser/composite.ts b/src/vs/workbench/browser/composite.ts index 28f0c6bbfb5..afda9848e3c 100644 --- a/src/vs/workbench/browser/composite.ts +++ b/src/vs/workbench/browser/composite.ts @@ -33,9 +33,6 @@ export abstract class Composite extends Component implements IComposite { private readonly _onTitleAreaUpdate = this._register(new Emitter()); readonly onTitleAreaUpdate = this._onTitleAreaUpdate.event; - private readonly _onDidChangeVisibility = this._register(new Emitter()); - readonly onDidChangeVisibility = this._onDidChangeVisibility.event; - private _onDidFocus: Emitter | undefined; get onDidFocus(): Event { if (!this._onDidFocus) { @@ -135,8 +132,6 @@ export abstract class Composite extends Component implements IComposite { setVisible(visible: boolean): void { if (this.visible !== !!visible) { this.visible = visible; - - this._onDidChangeVisibility.fire(visible); } } diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index 707294b9e45..c691b360893 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -5,7 +5,7 @@ import { hasWorkspaceFileExtension, IWorkspaceFolderCreationData, IRecentFile, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { normalize } from 'vs/base/common/path'; -import { basename } from 'vs/base/common/resources'; +import { basename, extUri } from 'vs/base/common/resources'; import { IFileService } from 'vs/platform/files/common/files'; import { IWindowOpenable } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; @@ -36,13 +36,13 @@ export interface IDraggedResource { isExternal: boolean; } +interface ISerializedDraggedResource { + resource: string; +} + export class DraggedEditorIdentifier { - constructor(private _identifier: IEditorIdentifier) { } - - get identifier(): IEditorIdentifier { - return this._identifier; - } + constructor(public readonly identifier: IEditorIdentifier) { } } export class DraggedEditorGroupIdentifier { @@ -50,20 +50,16 @@ export class DraggedEditorGroupIdentifier { constructor(public readonly identifier: GroupIdentifier) { } } -export interface IDraggedEditor extends IDraggedResource { - content?: string; +interface IDraggedEditorProps { + dirtyContent?: string; encoding?: string; mode?: string; options?: ITextEditorOptions; } -export interface ISerializedDraggedEditor { - resource: string; - content?: string; - encoding?: string; - mode?: string; - options?: ITextEditorOptions; -} +export interface IDraggedEditor extends IDraggedResource, IDraggedEditorProps { } + +export interface ISerializedDraggedEditor extends ISerializedDraggedResource, IDraggedEditorProps { } export const CodeDataTransfers = { EDITORS: 'CodeEditors', @@ -85,7 +81,7 @@ export function extractResources(e: DragEvent, externalOnly?: boolean): Array { resources.push({ resource: URI.parse(draggedEditor.resource), - content: draggedEditor.content, + dirtyContent: draggedEditor.dirtyContent, options: draggedEditor.options, encoding: draggedEditor.encoding, mode: draggedEditor.mode, @@ -182,13 +178,12 @@ export class ResourcesDropHandler { // Check for special things being dropped const isWorkspaceOpening = await this.doHandleDrop(untitledOrFileResources); - if (isWorkspaceOpening) { return; // return early if the drop operation resulted in this window changing to a workspace } // Add external ones to recently open list unless dropped resource is a workspace - const recentFiles: IRecentFile[] = untitledOrFileResources.filter(d => d.isExternal && d.resource.scheme === Schemas.file).map(d => ({ fileUri: d.resource })); + const recentFiles: IRecentFile[] = untitledOrFileResources.filter(untitledOrFileResource => untitledOrFileResource.isExternal && untitledOrFileResource.resource.scheme === Schemas.file).map(d => ({ fileUri: d.resource })); if (recentFiles.length) { this.workspacesService.addRecentlyOpened(recentFiles); } @@ -215,15 +210,15 @@ export class ResourcesDropHandler { private async doHandleDrop(untitledOrFileResources: Array): Promise { // Check for dirty editors being dropped - const resourcesWithContent: IDraggedEditor[] = untitledOrFileResources.filter(resource => !resource.isExternal && !!(resource as IDraggedEditor).content); - if (resourcesWithContent.length > 0) { - await Promise.all(resourcesWithContent.map(resourceWithContent => this.handleDirtyEditorDrop(resourceWithContent))); + const dirtyEditors: IDraggedEditor[] = untitledOrFileResources.filter(untitledOrFileResource => !untitledOrFileResource.isExternal && typeof (untitledOrFileResource as IDraggedEditor).dirtyContent === 'string'); + if (dirtyEditors.length > 0) { + await Promise.all(dirtyEditors.map(dirtyEditor => this.handleDirtyEditorDrop(dirtyEditor))); return false; } // Check for workspace file being dropped if we are allowed to do so if (this.options.allowWorkspaceOpen) { - const externalFileOnDiskResources = untitledOrFileResources.filter(d => d.isExternal && d.resource.scheme === Schemas.file).map(d => d.resource); + const externalFileOnDiskResources = untitledOrFileResources.filter(untitledOrFileResource => untitledOrFileResource.isExternal && untitledOrFileResource.resource.scheme === Schemas.file).map(d => d.resource); if (externalFileOnDiskResources.length > 0) { return this.handleWorkspaceFileDrop(externalFileOnDiskResources); } @@ -249,9 +244,9 @@ export class ResourcesDropHandler { // If the dropped editor is dirty with content we simply take that // content and turn it into a backup so that it loads the contents - if (droppedDirtyEditor.content) { + if (typeof droppedDirtyEditor.dirtyContent === 'string') { try { - await this.backupFileService.backup(droppedDirtyEditor.resource, stringToSnapshot(droppedDirtyEditor.content)); + await this.backupFileService.backup(droppedDirtyEditor.resource, stringToSnapshot(droppedDirtyEditor.dirtyContent)); } catch (e) { // Ignore error } @@ -331,9 +326,9 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: } // Resource URLs: allows to drop multiple resources to a target in VS Code (not directories) - const files = sources.filter(s => !s.isDirectory); + const files = sources.filter(source => !source.isDirectory); if (files.length) { - event.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify(files.map(f => f.resource.toString()))); + event.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify(files.map(file => file.resource.toString()))); } // Editors: enables cross window DND of tabs into the editor area @@ -357,7 +352,7 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: for (const textEditorControl of textEditorControls) { if (isCodeEditor(textEditorControl)) { const model = textEditorControl.getModel(); - if (model?.uri?.toString() === file.resource.toString()) { + if (extUri.isEqual(model?.uri, file.resource)) { return withNullAsUndefined(textEditorControl.saveViewState()); } } @@ -380,13 +375,13 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: // If the resource is dirty or untitled, send over its content // to restore dirty state. Get that from the text model directly - let content: string | undefined = undefined; + let dirtyContent: string | undefined = undefined; if (model?.isDirty()) { - content = model.textEditorModel.getValue(); + dirtyContent = model.textEditorModel.getValue(); } // Add as dragged editor - draggedEditors.push({ resource: file.resource.toString(), content, options, encoding, mode }); + draggedEditors.push({ resource: file.resource.toString(), dirtyContent, options, encoding, mode }); }); if (draggedEditors.length) { @@ -749,3 +744,11 @@ export class CompositeDragAndDropObserver extends Disposable { return this._register(disposableStore); } } + +export function toggleDropEffect(dataTransfer: DataTransfer | null, dropEffect: string, shouldHaveIt: boolean) { + if (!dataTransfer) { + return; + } + + dataTransfer.dropEffect = shouldHaveIt ? dropEffect : 'none'; +} diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 570118ed8b7..328f6324128 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { dirname, isEqual, basenameOrAuthority } from 'vs/base/common/resources'; +import { dirname, isEqual, basenameOrAuthority, extUri } from 'vs/base/common/resources'; import { IconLabel, IIconLabelValueOptions, IIconLabelCreationOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -24,7 +24,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { withNullAsUndefined } from 'vs/base/common/types'; export interface IResourceLabelProps { - resource?: URI | { master?: URI, detail?: URI }; + resource?: URI | { primary?: URI, secondary?: URI }; name?: string | string[]; description?: string; } @@ -38,7 +38,7 @@ function toResource(props: IResourceLabelProps | undefined): URI | undefined { return props.resource; } - return props.resource.master; + return props.resource.primary; } export interface IResourceLabelOptions extends IIconLabelValueOptions { @@ -307,7 +307,7 @@ class ResourceLabelWidget extends IconLabel { return; // only update if resource exists } - if (model.uri.toString() === resource.toString()) { + if (extUri.isEqual(model.uri, resource)) { if (this.lastKnownDetectedModeId !== model.getModeId()) { this.render(true); // update if the language id of the model has changed from our last known state } @@ -379,9 +379,9 @@ class ResourceLabelWidget extends IconLabel { setResource(label: IResourceLabelProps, options: IResourceLabelOptions = Object.create(null)): void { const resource = toResource(label); - const isMasterDetail = label?.resource && !URI.isUri(label.resource); + const isSideBySideEditor = label?.resource && !URI.isUri(label.resource); - if (!options.forceLabel && !isMasterDetail && resource?.scheme === Schemas.untitled) { + if (!options.forceLabel && !isSideBySideEditor && resource?.scheme === Schemas.untitled) { // Untitled labels are very dynamic because they may change // whenever the content changes (unless a path is associated). // As such we always ask the actual editor for it's name and @@ -390,7 +390,7 @@ class ResourceLabelWidget extends IconLabel { // we assume that the client does not want to display them // and as such do not override. // - // We do not touch the label if it represents a master-detail + // We do not touch the label if it represents a primary-secondary // because in that case we expect it to carry a proper label // and description. const untitledModel = this.textFileService.untitled.get(resource); diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 7759f695c62..fc6bdc17652 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -16,7 +16,7 @@ import { PanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; import { PanelRegistry, Extensions as PanelExtensions } from 'vs/workbench/browser/panel'; import { Position, Parts, IWorkbenchLayoutService, positionFromString, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IStorageService, StorageScope, WillSaveStateReason, WorkspaceStorageSettings } from 'vs/platform/storage/common/storage'; +import { IStorageService, StorageScope, WillSaveStateReason } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; @@ -43,8 +43,10 @@ import { WINDOW_ACTIVE_BORDER, WINDOW_INACTIVE_BORDER } from 'vs/workbench/commo import { LineNumbersType } from 'vs/editor/common/config/editorOptions'; import { ActivitybarPart } from 'vs/workbench/browser/parts/activitybar/activitybarPart'; import { URI } from 'vs/base/common/uri'; -import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { IViewDescriptorService, ViewContainerLocation, IViewsService } from 'vs/workbench/common/views'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; +import { mark } from 'vs/base/common/performance'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export enum Settings { ACTIVITYBAR_VISIBLE = 'workbench.activityBar.visible', @@ -130,12 +132,11 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi //#endregion + readonly container: HTMLElement = document.createElement('div'); + private _dimension!: IDimension; get dimension(): IDimension { return this._dimension; } - private _container: HTMLElement = document.createElement('div'); - get container(): HTMLElement { return this._container; } - get offset() { return { top: (() => { @@ -149,7 +150,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi }; } - private parts: Map = new Map(); + private readonly parts = new Map(); private workbenchGrid!: SerializableGrid; @@ -163,6 +164,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private statusBarPartView!: ISerializableView; private environmentService!: IWorkbenchEnvironmentService; + private extensionService!: IExtensionService; private configurationService!: IConfigurationService; private lifecycleService!: ILifecycleService; private storageService!: IStorageService; @@ -173,6 +175,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private titleService!: ITitleService; private viewletService!: IViewletService; private viewDescriptorService!: IViewDescriptorService; + private viewsService!: IViewsService; private contextService!: IWorkspaceContextService; private backupFileService!: IBackupFileService; private notificationService!: INotificationService; @@ -236,8 +239,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi transitionDisposables: new DisposableStore(), setNotificationsFilter: false, editorWidgetSet: new Set() - }, - + } }; constructor( @@ -257,6 +259,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.storageService = accessor.get(IStorageService); this.backupFileService = accessor.get(IBackupFileService); this.themeService = accessor.get(IThemeService); + this.extensionService = accessor.get(IExtensionService); // Parts this.editorService = accessor.get(IEditorService); @@ -264,6 +267,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.panelService = accessor.get(IPanelService); this.viewletService = accessor.get(IViewletService); this.viewDescriptorService = accessor.get(IViewDescriptorService); + this.viewsService = accessor.get(IViewsService); this.titleService = accessor.get(ITitleService); this.notificationService = accessor.get(INotificationService); this.activityBarService = accessor.get(IActivityBarService); @@ -556,17 +560,15 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // Window border this.updateWindowBorder(true); - } private applyDefaultLayout(environmentService: IWorkbenchEnvironmentService, storageService: IStorageService) { - let defaultLayout = environmentService.options?.defaultLayout; + const defaultLayout = environmentService.options?.defaultLayout; if (!defaultLayout) { return; } - const firstOpen = storageService.getBoolean(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, StorageScope.WORKSPACE); - if (!firstOpen) { + if (!storageService.isNew(StorageScope.WORKSPACE)) { return; } @@ -577,7 +579,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return; } - // Everything below here is deprecated and will be removed once Codespaces migrates + // TODO@eamodio Everything below here is deprecated and will be removed once Codespaces migrates const { sidebar } = defaultLayout; if (sidebar) { @@ -787,7 +789,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private getInitialFilesToOpen(): { filesToOpenOrCreate?: IPath[], filesToDiff?: IPath[] } | undefined { const defaultLayout = this.environmentService.options?.defaultLayout; - if (defaultLayout?.editors?.length && this.storageService.getBoolean(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, StorageScope.WORKSPACE)) { + if (defaultLayout?.editors?.length && this.storageService.isNew(StorageScope.WORKSPACE)) { this._openedDefaultEditors = true; return { @@ -813,6 +815,143 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return undefined; } + protected async restoreWorkbenchLayout(): Promise { + const restorePromises: Promise[] = []; + + // Restore editors + restorePromises.push((async () => { + mark('willRestoreEditors'); + + // first ensure the editor part is restored + await this.editorGroupService.whenRestored; + + // then see for editors to open as instructed + let editors: IResourceEditorInputType[]; + if (Array.isArray(this.state.editor.editorsToOpen)) { + editors = this.state.editor.editorsToOpen; + } else { + editors = await this.state.editor.editorsToOpen; + } + + if (editors.length) { + await this.editorService.openEditors(editors); + } + + mark('didRestoreEditors'); + })()); + + // Restore default views + const restoreDefaultViewsPromise = (async () => { + if (this.state.views.defaults?.length) { + mark('willOpenDefaultViews'); + + const defaultViews = [...this.state.views.defaults]; + + let locationsRestored: boolean[] = []; + + const tryOpenView = async (viewId: string, index: number) => { + const location = this.viewDescriptorService.getViewLocationById(viewId); + if (location) { + + // If the view is in the same location that has already been restored, remove it and continue + if (locationsRestored[location]) { + defaultViews.splice(index, 1); + + return; + } + + const view = await this.viewsService.openView(viewId); + if (view) { + locationsRestored[location] = true; + defaultViews.splice(index, 1); + } + } + }; + + let i = -1; + for (const viewId of defaultViews) { + await tryOpenView(viewId, ++i); + } + + // If we still have views left over, wait until all extensions have been registered and try again + if (defaultViews.length) { + await this.extensionService.whenInstalledExtensionsRegistered(); + + let i = -1; + for (const viewId of defaultViews) { + await tryOpenView(viewId, ++i); + } + } + + // If we opened a view in the sidebar, stop any restore there + if (locationsRestored[ViewContainerLocation.Sidebar]) { + this.state.sideBar.viewletToRestore = undefined; + } + + // If we opened a view in the panel, stop any restore there + if (locationsRestored[ViewContainerLocation.Panel]) { + this.state.panel.panelToRestore = undefined; + } + + mark('didOpenDefaultViews'); + } + })(); + restorePromises.push(restoreDefaultViewsPromise); + + // Restore Sidebar + restorePromises.push((async () => { + + // Restoring views could mean that sidebar already + // restored, as such we need to test again + await restoreDefaultViewsPromise; + if (!this.state.sideBar.viewletToRestore) { + return; + } + + mark('willRestoreViewlet'); + + const viewlet = await this.viewletService.openViewlet(this.state.sideBar.viewletToRestore); + if (!viewlet) { + await this.viewletService.openViewlet(this.viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)?.id); // fallback to default viewlet as needed + } + + mark('didRestoreViewlet'); + })()); + + // Restore Panel + restorePromises.push((async () => { + + // Restoring views could mean that panel already + // restored, as such we need to test again + await restoreDefaultViewsPromise; + if (!this.state.panel.panelToRestore) { + return; + } + + mark('willRestorePanel'); + + const panel = await this.panelService.openPanel(this.state.panel.panelToRestore!); + if (!panel) { + await this.panelService.openPanel(Registry.as(PanelExtensions.Panels).getDefaultPanelId()); // fallback to default panel as needed + } + + mark('didRestorePanel'); + })()); + + // Restore Zen Mode + if (this.state.zenMode.restore) { + this.toggleZenMode(false, true); + } + + // Restore Editor Center Mode + if (this.state.editor.restoreCentered) { + this.centerEditorLayout(true, true); + } + + // Await restore to be done + await Promise.all(restorePromises); + } + private updatePanelPosition() { const defaultPanelPosition = this.configurationService.getValue(Settings.PANEL_POSITION); const panelPosition = this.storageService.get(Storage.PANEL_POSITION, StorageScope.WORKSPACE, defaultPanelPosition); diff --git a/src/vs/workbench/browser/media/style.css b/src/vs/workbench/browser/media/style.css index 0fc20acc3fe..9d2fe752921 100644 --- a/src/vs/workbench/browser/media/style.css +++ b/src/vs/workbench/browser/media/style.css @@ -263,3 +263,7 @@ body.web { .monaco-workbench .monaco-list:focus { outline: 0 !important; /* tree indicates focus not via outline but through the focused item */ } + +.monaco-workbench .codicon[class*='codicon-'] { + font-size: 16px; /* sets font-size for codicons in workbench https://github.com/microsoft/vscode/issues/98495 */ +} diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index e4b3454fa27..dd706f66468 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -11,7 +11,7 @@ import { EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch import { Action, IAction } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; import { dispose } from 'vs/base/common/lifecycle'; -import { SyncActionDescriptor, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; +import { SyncActionDescriptor, IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -28,8 +28,11 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { Codicon } from 'vs/base/common/codicons'; -import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ActionViewItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { isMacintosh } from 'vs/base/common/platform'; +import { ContextSubMenu } from 'vs/base/browser/contextmenu'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { distinct } from 'vs/base/common/arrays'; export class ViewContainerActivityAction extends ActivityAction { @@ -103,6 +106,7 @@ export class AccountsActionViewItem extends ActivityActionViewItem { @IContextMenuService protected contextMenuService: IContextMenuService, @IMenuService protected menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IAuthenticationService private readonly authenticationService: IAuthenticationService ) { super(action, { draggable: false, colors, icon: true }, themeService); } @@ -132,16 +136,62 @@ export class AccountsActionViewItem extends ActivityActionViewItem { })); } - private showContextMenu(): void { + private async getActions(accountsMenu: IMenu) { + const otherCommands = accountsMenu.getActions(); + const providers = this.authenticationService.getProviderIds(); + const allSessions = providers.map(async id => { + const sessions = await this.authenticationService.getSessions(id); + const uniqueSessions = distinct(sessions, session => session.account.displayName); + return { + providerId: id, + sessions: uniqueSessions + }; + }); + + const result = await Promise.all(allSessions); + let menus: (IAction | ContextSubMenu)[] = []; + result.forEach(sessionInfo => { + const providerDisplayName = this.authenticationService.getDisplayName(sessionInfo.providerId); + sessionInfo.sessions.forEach(session => { + const accountName = session.account.displayName; + const menu = new ContextSubMenu(`${accountName} (${providerDisplayName})`, [ + new Action(`configureSessions${accountName}`, nls.localize('manageTrustedExtensions', "Manage Trusted Extensions"), '', true, _ => { + return this.authenticationService.manageTrustedExtensionsForAccount(sessionInfo.providerId, accountName); + }), + new Action('signOut', nls.localize('signOut', "Sign Out"), '', true, _ => { + return this.authenticationService.signOutOfAccount(sessionInfo.providerId, accountName); + }) + ]); + menus.push(menu); + }); + }); + + if (menus.length) { + menus.push(new Separator()); + } + + otherCommands.forEach((group, i) => { + const actions = group[1]; + menus = menus.concat(actions); + if (i !== otherCommands.length - 1) { + menus.push(new Separator()); + } + }); + + return menus; + } + + private async showContextMenu(): Promise { const accountsActions: IAction[] = []; const accountsMenu = this.menuService.createMenu(MenuId.AccountsContext, this.contextKeyService); const actionsDisposable = createAndFillInActionBarActions(accountsMenu, undefined, { primary: [], secondary: accountsActions }); const containerPosition = DOM.getDomNodePagePosition(this.container); const location = { x: containerPosition.left + containerPosition.width / 2, y: containerPosition.top }; + const actions = await this.getActions(accountsMenu); this.contextMenuService.showContextMenu({ getAnchor: () => location, - getActions: () => accountsActions, + getActions: () => actions, onHide: () => { accountsMenu.dispose(); dispose(actionsDisposable); diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 9f43ecdfd33..c8054024f80 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -10,7 +10,7 @@ import { GLOBAL_ACTIVITY_ID, IActivity, ACCOUNTS_ACTIIVTY_ID } from 'vs/workbenc import { Part } from 'vs/workbench/browser/part'; import { GlobalActivityActionViewItem, ViewContainerActivityAction, PlaceHolderToggleCompositePinnedAction, PlaceHolderViewContainerActivityAction, AccountsActionViewItem, HomeAction, HomeActionViewItem, DeprecatedHomeAction } from 'vs/workbench/browser/parts/activitybar/activitybarActions'; import { IBadge, NumberBadge } from 'vs/workbench/services/activity/common/activity'; -import { IWorkbenchLayoutService, Parts, Position as SideBarPosition } from 'vs/workbench/services/layout/browser/layoutService'; +import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable, toDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { ToggleActivityBarVisibilityAction, ToggleMenuBarAction } from 'vs/workbench/browser/actions/layoutActions'; @@ -18,7 +18,7 @@ import { IThemeService, IColorTheme } from 'vs/platform/theme/common/themeServic import { ACTIVITY_BAR_BACKGROUND, ACTIVITY_BAR_BORDER, ACTIVITY_BAR_FOREGROUND, ACTIVITY_BAR_ACTIVE_BORDER, ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND, ACTIVITY_BAR_INACTIVE_FOREGROUND, ACTIVITY_BAR_ACTIVE_BACKGROUND, ACTIVITY_BAR_DRAG_AND_DROP_BORDER } from 'vs/workbench/common/theme'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { CompositeBar, ICompositeBarItem, CompositeDragAndDrop } from 'vs/workbench/browser/parts/compositeBar'; -import { Dimension, addClass, removeNode, createCSSRule, asCSSUrl } from 'vs/base/browser/dom'; +import { Dimension, addClass, removeNode, createCSSRule, asCSSUrl, toggleClass } from 'vs/base/browser/dom'; import { IStorageService, StorageScope, IWorkspaceStorageChangeEvent } from 'vs/platform/storage/common/storage'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { URI, UriComponents } from 'vs/base/common/uri'; @@ -458,14 +458,8 @@ export class ActivitybarPart extends Part implements IActivityBarService { container.style.backgroundColor = background; const borderColor = this.getColor(ACTIVITY_BAR_BORDER) || this.getColor(contrastBorder) || ''; - const isPositionLeft = this.layoutService.getSideBarPosition() === SideBarPosition.LEFT; - container.style.boxSizing = borderColor && isPositionLeft ? 'border-box' : ''; - container.style.borderRightWidth = borderColor && isPositionLeft ? '1px' : ''; - container.style.borderRightStyle = borderColor && isPositionLeft ? 'solid' : ''; - container.style.borderRightColor = isPositionLeft ? borderColor : ''; - container.style.borderLeftWidth = borderColor && !isPositionLeft ? '1px' : ''; - container.style.borderLeftStyle = borderColor && !isPositionLeft ? 'solid' : ''; - container.style.borderLeftColor = !isPositionLeft ? borderColor : ''; + toggleClass(container, 'bordered', !!borderColor); + container.style.borderColor = borderColor ? borderColor : ''; } private getActivitybarItemColors(theme: IColorTheme): ICompositeBarColors { diff --git a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css index 6b1847fd614..ced2d815834 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css @@ -8,6 +8,28 @@ height: 100%; } +.monaco-workbench .activitybar.bordered::before { + content: ''; + float: left; + position: absolute; + box-sizing: border-box; + height: 100%; + width: 0px; + border-color: inherit; +} + +.monaco-workbench .activitybar.left.bordered::before { + right: 0; + border-right-style: solid; + border-right-width: 1px; +} + +.monaco-workbench .activitybar.right.bordered::before { + left: 0; + border-left-style: solid; + border-left-width: 1px; +} + .monaco-workbench .activitybar > .content { height: 100%; display: flex; diff --git a/src/vs/workbench/browser/parts/compositeBar.ts b/src/vs/workbench/browser/parts/compositeBar.ts index 588bbef601b..9893b5af2ba 100644 --- a/src/vs/workbench/browser/parts/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositeBar.ts @@ -22,7 +22,7 @@ import { Emitter } from 'vs/base/common/event'; import { ViewContainerLocation, IViewDescriptorService } from 'vs/workbench/common/views'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IComposite } from 'vs/workbench/common/composite'; -import { CompositeDragAndDropData, CompositeDragAndDropObserver, IDraggedCompositeData, ICompositeDragAndDrop, Before2D } from 'vs/workbench/browser/dnd'; +import { CompositeDragAndDropData, CompositeDragAndDropObserver, IDraggedCompositeData, ICompositeDragAndDrop, Before2D, toggleDropEffect } from 'vs/workbench/browser/dnd'; export interface ICompositeBarItem { id: string; @@ -122,8 +122,7 @@ export class CompositeDragAndDrop implements ICompositeDragAndDrop { const draggedViews = this.viewDescriptorService.getViewContainerModel(currentContainer)!.allViewDescriptors; // ... all views must be movable - // Prevent moving scm explicitly TODO@joaomoreno remove when scm is moveable - return !draggedViews.some(v => !v.canMoveView) && currentContainer.id !== 'workbench.view.scm'; + return !draggedViews.some(v => !v.canMoveView); } else { // Dragging an individual view const viewDescriptor = this.viewDescriptorService.getViewDescriptorById(dragData.id); @@ -245,6 +244,7 @@ export class CompositeBar extends Widget implements ICompositeBar { const insertAtFront = this.insertAtFront(actionBarDiv, e.eventData); const target = insertAtFront ? visibleItems[0] : visibleItems[visibleItems.length - 1]; const validDropTarget = this.options.dndHandler.onDragOver(e.dragAndDropData, target.id, e.eventData); + toggleDropEffect(e.eventData.dataTransfer, 'move', validDropTarget); insertDropBefore = this.updateFromDragging(parent, validDropTarget, insertAtFront); }, @@ -418,7 +418,7 @@ export class CompositeBar extends Widget implements ICompositeBar { // Case: we closed the last visible composite // Solv: we hide the part - else if (this.visibleComposites.length === 1) { + else if (this.visibleComposites.length === 0) { this.options.hidePart(); } diff --git a/src/vs/workbench/browser/parts/compositeBarActions.ts b/src/vs/workbench/browser/parts/compositeBarActions.ts index 11198285ec1..e4d7358167e 100644 --- a/src/vs/workbench/browser/parts/compositeBarActions.ts +++ b/src/vs/workbench/browser/parts/compositeBarActions.ts @@ -18,7 +18,7 @@ import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { IActivity } from 'vs/workbench/common/activity'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Emitter, Event } from 'vs/base/common/event'; -import { CompositeDragAndDropObserver, ICompositeDragAndDrop, Before2D } from 'vs/workbench/browser/dnd'; +import { CompositeDragAndDropObserver, ICompositeDragAndDrop, Before2D, toggleDropEffect } from 'vs/workbench/browser/dnd'; import { Color } from 'vs/base/common/color'; import { Codicon } from 'vs/base/common/codicons'; @@ -522,6 +522,7 @@ export class CompositeActionViewItem extends ActivityActionViewItem { this._register(CompositeDragAndDropObserver.INSTANCE.registerDraggable(this.container, () => { return { type: 'composite', id: this.activity.id }; }, { onDragOver: e => { const isValidMove = e.dragAndDropData.getData().id !== this.activity.id && this.dndHandler.onDragOver(e.dragAndDropData, this.activity.id, e.eventData); + toggleDropEffect(e.eventData.dataTransfer, 'move', isValidMove); insertDropBefore = this.updateFromDragging(container, isValidMove, e.eventData); }, diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 381e835ed03..09a3e5b4ccf 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -331,7 +331,7 @@ export abstract class CompositePart extends Part { toolBar.context = this.actionsContextProvider(); // Return fn to set into toolbar - return toolBar.setActions(prepareActions(primaryActions), prepareActions(secondaryActions)); + return () => toolBar.setActions(prepareActions(primaryActions), prepareActions(secondaryActions)); } protected getActiveComposite(): IComposite | undefined { @@ -392,7 +392,8 @@ export abstract class CompositePart extends Part { actionViewItemProvider: action => this.actionViewItemProvider(action), orientation: ActionsOrientation.HORIZONTAL, getKeyBinding: action => this.keybindingService.lookupKeybinding(action.id), - anchorAlignmentProvider: () => this.getTitleAreaDropDownAnchorAlignment() + anchorAlignmentProvider: () => this.getTitleAreaDropDownAnchorAlignment(), + toggleMenuTitle: nls.localize('viewsAndMoreActions', "Views and More Actions...") })); this.collectCompositeActions()(); diff --git a/src/vs/workbench/browser/parts/editor/baseEditor.ts b/src/vs/workbench/browser/parts/editor/baseEditor.ts index bb44caf15e3..1e0f2719a55 100644 --- a/src/vs/workbench/browser/parts/editor/baseEditor.ts +++ b/src/vs/workbench/browser/parts/editor/baseEditor.ts @@ -27,9 +27,17 @@ import { IDisposable } from 'vs/base/common/lifecycle'; * information about the state of the editor data. * * The workbench will keep an editor alive after it has been created and show/hide it based on - * user interaction. The lifecycle of a editor goes in the order create(), setVisible(true|false), - * layout(), setInput(), focus(), dispose(). During use of the workbench, a editor will often receive a - * clearInput, setVisible, layout and focus call, but only one create and dispose call. + * user interaction. The lifecycle of a editor goes in the order: + * + * - `createEditor()` + * - `setEditorVisible()` + * - `layout()` + * - `setInput()` + * - `focus()` + * - `dispose()`: when the editor group the editor is in closes + * + * During use of the workbench, a editor will often receive a `clearInput()`, `setEditorVisible()`, `layout()` and + * `focus()` calls, but only one `create()` and `dispose()` call. * * This class is only intended to be subclassed and not instantiated. */ @@ -50,7 +58,7 @@ export abstract class BaseEditor extends Composite implements IEditorPane { protected _options: EditorOptions | undefined; get options(): EditorOptions | undefined { return this._options; } - private _group?: IEditorGroup; + private _group: IEditorGroup | undefined; get group(): IEditorGroup | undefined { return this._group; } constructor( @@ -62,12 +70,25 @@ export abstract class BaseEditor extends Composite implements IEditorPane { super(id, telemetryService, themeService, storageService); } + create(parent: HTMLElement): void { + super.create(parent); + + // Create Editor + this.createEditor(parent); + } + + /** + * Called to create the editor in the parent HTMLElement. Subclasses implement + * this method to construct the editor widget. + */ + protected abstract createEditor(parent: HTMLElement): void; + /** * Note: Clients should not call this method, the workbench calls this * method. Calling it otherwise may result in unexpected behavior. * * Sets the given input with the options to the editor. The input is guaranteed - * to be different from the previous input that was set using the input.matches() + * to be different from the previous input that was set using the `input.matches()` * method. * * The provided cancellation token should be used to test if the operation @@ -81,6 +102,12 @@ export abstract class BaseEditor extends Composite implements IEditorPane { /** * Called to indicate to the editor that the input should be cleared and * resources associated with the input should be freed. + * + * This method can be called based on different contexts, e.g. when opening + * a different editor control or when closing all editors in a group. + * + * To monitor the lifecycle of editor inputs, you should not rely on this + * method, rather refer to the listeners on `IEditorGroup` via `IEditorGroupService`. */ clearInput(): void { this._input = undefined; @@ -98,18 +125,6 @@ export abstract class BaseEditor extends Composite implements IEditorPane { this._options = options; } - create(parent: HTMLElement): void { - super.create(parent); - - // Create Editor - this.createEditor(parent); - } - - /** - * Called to create the editor in the parent HTMLElement. - */ - protected abstract createEditor(parent: HTMLElement): void; - setVisible(visible: boolean, group?: IEditorGroup): void { super.setVisible(visible); @@ -128,16 +143,6 @@ export abstract class BaseEditor extends Composite implements IEditorPane { this._group = group; } - /** - * Called before the editor is being removed from the DOM. - */ - onWillHide() { } - - /** - * Called after the editor has been removed from the DOM. - */ - onDidHide() { } - protected getEditorMemento(editorGroupService: IEditorGroupsService, key: string, limit: number = 10): IEditorMemento { const mementoKey = `${this.getId()}${key}`; diff --git a/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts b/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts index 964c8852ac5..9d285cea910 100644 --- a/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts @@ -29,11 +29,11 @@ export class BinaryResourceDiffEditor extends SideBySideEditor { } getMetadata(): string | undefined { - const master = this.masterEditorPane; - const details = this.detailsEditorPane; + const primary = this.primaryEditorPane; + const secondary = this.secondaryEditorPane; - if (master instanceof BaseBinaryResourceEditor && details instanceof BaseBinaryResourceEditor) { - return nls.localize('metadataDiff', "{0} ↔ {1}", details.getMetadata(), master.getMetadata()); + if (primary instanceof BaseBinaryResourceEditor && secondary instanceof BaseBinaryResourceEditor) { + return nls.localize('metadataDiff', "{0} ↔ {1}", secondary.getMetadata(), primary.getMetadata()); } return undefined; diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 7863a8c2c12..3a1bd949168 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -38,7 +38,7 @@ import { ResourceLabel } from 'vs/workbench/browser/labels'; import { BreadcrumbsConfig, IBreadcrumbsService } from 'vs/workbench/browser/parts/editor/breadcrumbs'; import { BreadcrumbElement, EditorBreadcrumbsModel, FileElement } from 'vs/workbench/browser/parts/editor/breadcrumbsModel'; import { BreadcrumbsPicker, createBreadcrumbsPicker } from 'vs/workbench/browser/parts/editor/breadcrumbsPicker'; -import { SideBySideEditorInput, IEditorPartOptions } from 'vs/workbench/common/editor'; +import { IEditorPartOptions, toResource, SideBySideEditor, SideBySideEditorInput, IEditorInputFactoryRegistry, Extensions } from 'vs/workbench/common/editor'; import { ACTIVE_GROUP, ACTIVE_GROUP_TYPE, IEditorService, SIDE_GROUP, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -49,6 +49,7 @@ import { withNullAsUndefined, withUndefinedAsNull } from 'vs/base/common/types'; import { ILabelService } from 'vs/platform/label/common/label'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; import { TextEditorSelectionRevealType } from 'vs/platform/editor/common/editor'; +import { Registry } from 'vs/platform/registry/common/platform'; class Item extends BreadcrumbsItem { @@ -234,12 +235,9 @@ export class BreadcrumbsControl { this._breadcrumbsDisposables.clear(); // honor diff editors and such - let input = this._editorGroup.activeEditor; - if (input instanceof SideBySideEditorInput) { - input = input.master; - } + const uri = toResource(this._editorGroup.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }); - if (!input || !input.resource || !this._fileService.canHandleResource(input.resource!)) { + if (!uri || !this._fileService.canHandleResource(uri)) { // cleanup and return when there is no input or when // we cannot handle this input this._ckBreadcrumbsPossible.set(false); @@ -251,13 +249,23 @@ export class BreadcrumbsControl { } } + // display uri which can be derived from file input + let fileInfoUri = uri; + let input = this._editorGroup.activeEditor; + if (input instanceof SideBySideEditorInput) { + input = input.primary; + } + if (Registry.as(Extensions.EditorInputFactories).getFileEditorInputFactory().isFileEditorInput(input)) { + fileInfoUri = input.label; + } + this.domNode.classList.toggle('hidden', false); this._ckBreadcrumbsVisible.set(true); this._ckBreadcrumbsPossible.set(true); - const uri = input.resource; const editor = this._getActiveCodeEditor(); const model = new EditorBreadcrumbsModel( + fileInfoUri, uri, editor, this._configurationService, this._textResourceConfigurationService, diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts index 1d7752320b4..01ff3916e98 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts @@ -52,6 +52,7 @@ export class EditorBreadcrumbsModel { readonly onDidUpdate: Event = this._onDidUpdate.event; constructor( + fileInfoUri: URI, private readonly _uri: URI, private readonly _editor: ICodeEditor | undefined, @IConfigurationService private readonly _configurationService: IConfigurationService, @@ -64,7 +65,7 @@ export class EditorBreadcrumbsModel { this._disposables.add(this._cfgFilePath.onDidChange(_ => this._onDidUpdate.fire(this))); this._disposables.add(this._cfgSymbolPath.onDidChange(_ => this._onDidUpdate.fire(this))); - this._fileInfo = EditorBreadcrumbsModel._initFilePathInfo(this._uri, workspaceService); + this._fileInfo = EditorBreadcrumbsModel._initFilePathInfo(fileInfoUri, workspaceService); this._bindToEditor(); this._onDidUpdate.fire(this); } diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index cc889f73d01..78a7613f52e 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -7,7 +7,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import * as nls from 'vs/nls'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IEditorRegistry, EditorDescriptor, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; -import { EditorInput, IEditorInputFactory, SideBySideEditorInput, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions, TextCompareEditorActiveContext, EditorPinnedContext, EditorGroupEditorsCountContext, EditorStickyContext } from 'vs/workbench/common/editor'; +import { EditorInput, IEditorInputFactory, SideBySideEditorInput, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions, TextCompareEditorActiveContext, EditorPinnedContext, EditorGroupEditorsCountContext, EditorStickyContext, ActiveEditorAvailableEditorIdsContext } from 'vs/workbench/common/editor'; import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor'; import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; @@ -34,7 +34,7 @@ import { JoinAllGroupsAction, FocusLeftGroup, FocusAboveGroup, FocusRightGroup, FocusBelowGroup, EditorLayoutSingleAction, EditorLayoutTwoColumnsAction, EditorLayoutThreeColumnsAction, EditorLayoutTwoByTwoGridAction, EditorLayoutTwoRowsAction, EditorLayoutThreeRowsAction, EditorLayoutTwoColumnsBottomAction, EditorLayoutTwoRowsRightAction, NewEditorGroupLeftAction, NewEditorGroupRightAction, NewEditorGroupAboveAction, NewEditorGroupBelowAction, SplitEditorOrthogonalAction, CloseEditorInAllGroupsAction, NavigateToLastEditLocationAction, ToggleGroupSizesAction, ShowAllEditorsByMostRecentlyUsedAction, - QuickAccessPreviousRecentlyUsedEditorAction, OpenPreviousRecentlyUsedEditorInGroupAction, OpenNextRecentlyUsedEditorInGroupAction, QuickAccessLeastRecentlyUsedEditorAction, QuickAccessLeastRecentlyUsedEditorInGroupAction + QuickAccessPreviousRecentlyUsedEditorAction, OpenPreviousRecentlyUsedEditorInGroupAction, OpenNextRecentlyUsedEditorInGroupAction, QuickAccessLeastRecentlyUsedEditorAction, QuickAccessLeastRecentlyUsedEditorInGroupAction, ReopenResourcesAction, ToggleEditorTypeAction } from 'vs/workbench/browser/parts/editor/editorActions'; import * as editorCommands from 'vs/workbench/browser/parts/editor/editorCommands'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -173,28 +173,28 @@ interface ISerializedSideBySideEditorInput { name: string; description: string | undefined; - detailsSerialized: string; - masterSerialized: string; + primarySerialized: string; + secondarySerialized: string; - detailsTypeId: string; - masterTypeId: string; + primaryTypeId: string; + secondaryTypeId: string; } export abstract class AbstractSideBySideEditorInputFactory implements IEditorInputFactory { - private getInputFactories(detailsId: string, masterId: string): [IEditorInputFactory | undefined, IEditorInputFactory | undefined] { + private getInputFactories(secondaryId: string, primaryId: string): [IEditorInputFactory | undefined, IEditorInputFactory | undefined] { const registry = Registry.as(EditorInputExtensions.EditorInputFactories); - return [registry.getEditorInputFactory(detailsId), registry.getEditorInputFactory(masterId)]; + return [registry.getEditorInputFactory(secondaryId), registry.getEditorInputFactory(primaryId)]; } canSerialize(editorInput: EditorInput): boolean { const input = editorInput as SideBySideEditorInput | DiffEditorInput; - if (input.details && input.master) { - const [detailsInputFactory, masterInputFactory] = this.getInputFactories(input.details.getTypeId(), input.master.getTypeId()); + if (input.primary && input.secondary) { + const [secondaryInputFactory, primaryInputFactory] = this.getInputFactories(input.secondary.getTypeId(), input.primary.getTypeId()); - return !!(detailsInputFactory?.canSerialize(input.details) && masterInputFactory?.canSerialize(input.master)); + return !!(secondaryInputFactory?.canSerialize(input.secondary) && primaryInputFactory?.canSerialize(input.primary)); } return false; @@ -203,20 +203,20 @@ export abstract class AbstractSideBySideEditorInputFactory implements IEditorInp serialize(editorInput: EditorInput): string | undefined { const input = editorInput as SideBySideEditorInput | DiffEditorInput; - if (input.details && input.master) { - const [detailsInputFactory, masterInputFactory] = this.getInputFactories(input.details.getTypeId(), input.master.getTypeId()); - if (detailsInputFactory && masterInputFactory) { - const detailsSerialized = detailsInputFactory.serialize(input.details); - const masterSerialized = masterInputFactory.serialize(input.master); + if (input.primary && input.secondary) { + const [secondaryInputFactory, primaryInputFactory] = this.getInputFactories(input.secondary.getTypeId(), input.primary.getTypeId()); + if (primaryInputFactory && secondaryInputFactory) { + const primarySerialized = primaryInputFactory.serialize(input.primary); + const secondarySerialized = secondaryInputFactory.serialize(input.secondary); - if (detailsSerialized && masterSerialized) { + if (primarySerialized && secondarySerialized) { const serializedEditorInput: ISerializedSideBySideEditorInput = { name: input.getName(), description: input.getDescription(), - detailsSerialized, - masterSerialized, - detailsTypeId: input.details.getTypeId(), - masterTypeId: input.master.getTypeId() + primarySerialized: primarySerialized, + secondarySerialized: secondarySerialized, + primaryTypeId: input.primary.getTypeId(), + secondaryTypeId: input.secondary.getTypeId() }; return JSON.stringify(serializedEditorInput); @@ -230,33 +230,33 @@ export abstract class AbstractSideBySideEditorInputFactory implements IEditorInp deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput | undefined { const deserialized: ISerializedSideBySideEditorInput = JSON.parse(serializedEditorInput); - const [detailsInputFactory, masterInputFactory] = this.getInputFactories(deserialized.detailsTypeId, deserialized.masterTypeId); - if (detailsInputFactory && masterInputFactory) { - const detailsInput = detailsInputFactory.deserialize(instantiationService, deserialized.detailsSerialized); - const masterInput = masterInputFactory.deserialize(instantiationService, deserialized.masterSerialized); + const [secondaryInputFactory, primaryInputFactory] = this.getInputFactories(deserialized.secondaryTypeId, deserialized.primaryTypeId); + if (primaryInputFactory && secondaryInputFactory) { + const primaryInput = primaryInputFactory.deserialize(instantiationService, deserialized.primarySerialized); + const secondaryInput = secondaryInputFactory.deserialize(instantiationService, deserialized.secondarySerialized); - if (detailsInput && masterInput) { - return this.createEditorInput(deserialized.name, deserialized.description, detailsInput, masterInput); + if (primaryInput && secondaryInput) { + return this.createEditorInput(deserialized.name, deserialized.description, secondaryInput, primaryInput); } } return undefined; } - protected abstract createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput; + protected abstract createEditorInput(name: string, description: string | undefined, secondaryInput: EditorInput, primaryInput: EditorInput): EditorInput; } class SideBySideEditorInputFactory extends AbstractSideBySideEditorInputFactory { - protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput { - return new SideBySideEditorInput(name, description, detailsInput, masterInput); + protected createEditorInput(name: string, description: string | undefined, secondaryInput: EditorInput, primaryInput: EditorInput): EditorInput { + return new SideBySideEditorInput(name, description, secondaryInput, primaryInput); } } class DiffEditorInputFactory extends AbstractSideBySideEditorInputFactory { - protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput { - return new DiffEditorInput(name, description, detailsInput, masterInput); + protected createEditorInput(name: string, description: string | undefined, secondaryInput: EditorInput, primaryInput: EditorInput): EditorInput { + return new DiffEditorInput(name, description, secondaryInput, primaryInput); } } @@ -386,6 +386,8 @@ registry.registerWorkbenchAction(SyncActionDescriptor.from(EditorLayoutThreeRows registry.registerWorkbenchAction(SyncActionDescriptor.from(EditorLayoutTwoByTwoGridAction), 'View: Grid Editor Layout (2x2)', category); registry.registerWorkbenchAction(SyncActionDescriptor.from(EditorLayoutTwoRowsRightAction), 'View: Two Rows Right Editor Layout', category); registry.registerWorkbenchAction(SyncActionDescriptor.from(EditorLayoutTwoColumnsBottomAction), 'View: Two Columns Bottom Editor Layout', category); +registry.registerWorkbenchAction(SyncActionDescriptor.from(ReopenResourcesAction), 'View: Reopen Editor With...', category, ActiveEditorAvailableEditorIdsContext); +registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleEditorTypeAction), 'View: Toggle Editor Type', category, ActiveEditorAvailableEditorIdsContext); // Register Quick Editor Actions including built in quick navigate support for some @@ -458,9 +460,10 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { command: { id: editorCo // Editor Title Menu MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: editorCommands.TOGGLE_DIFF_SIDE_BY_SIDE, title: nls.localize('toggleInlineView', "Toggle Inline View") }, group: '1_diff', order: 10, when: ContextKeyExpr.has('isInDiffEditor') }); -MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: editorCommands.SHOW_EDITORS_IN_GROUP, title: nls.localize('showOpenedEditors', "Show Opened Editors") }, group: '3_open', order: 10, when: ContextKeyExpr.has('config.workbench.editor.showTabs') }); -MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: editorCommands.CLOSE_EDITORS_IN_GROUP_COMMAND_ID, title: nls.localize('closeAll', "Close All") }, group: '5_close', order: 10, when: ContextKeyExpr.has('config.workbench.editor.showTabs') }); -MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: editorCommands.CLOSE_SAVED_EDITORS_COMMAND_ID, title: nls.localize('closeAllSaved', "Close Saved") }, group: '5_close', order: 20, when: ContextKeyExpr.has('config.workbench.editor.showTabs') }); +MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: editorCommands.SHOW_EDITORS_IN_GROUP, title: nls.localize('showOpenedEditors', "Show Opened Editors") }, group: '3_open', order: 10 }); +MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: editorCommands.CLOSE_EDITORS_IN_GROUP_COMMAND_ID, title: nls.localize('closeAll', "Close All") }, group: '5_close', order: 10 }); +MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: editorCommands.CLOSE_SAVED_EDITORS_COMMAND_ID, title: nls.localize('closeAllSaved', "Close Saved") }, group: '5_close', order: 20 }); +MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: ReopenResourcesAction.ID, title: ReopenResourcesAction.LABEL }, group: '6_reopen', order: 20, when: ActiveEditorAvailableEditorIdsContext }); interface IEditorToolItem { id: string; title: string; icon?: { dark?: URI; light?: URI; } | ThemeIcon; } diff --git a/src/vs/workbench/browser/parts/editor/editor.ts b/src/vs/workbench/browser/parts/editor/editor.ts index 0881aa2a264..e562c83198d 100644 --- a/src/vs/workbench/browser/parts/editor/editor.ts +++ b/src/vs/workbench/browser/parts/editor/editor.ts @@ -79,7 +79,7 @@ export interface IEditorOpeningEvent extends IEditorIdentifier { * to return a promise that resolves to `undefined` to prevent the opening * alltogether. */ - prevent(callback: () => undefined | Promise): void; + prevent(callback: () => Promise | undefined): void; } export interface IEditorGroupsAccessor { diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 5e03ab84808..b149f3a788f 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -11,7 +11,7 @@ import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { CLOSE_EDITOR_COMMAND_ID, MOVE_ACTIVE_EDITOR_COMMAND_ID, ActiveEditorMoveArguments, SPLIT_EDITOR_LEFT, SPLIT_EDITOR_RIGHT, SPLIT_EDITOR_UP, SPLIT_EDITOR_DOWN, splitEditor, LAYOUT_EDITOR_GROUPS_COMMAND_ID, mergeAllGroups } from 'vs/workbench/browser/parts/editor/editorCommands'; -import { IEditorGroupsService, IEditorGroup, GroupsArrangement, GroupLocation, GroupDirection, preferredSideBySideGroupDirection, IFindGroupScope, GroupOrientation, EditorGroupLayout, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsArrangement, GroupLocation, GroupDirection, preferredSideBySideGroupDirection, IFindGroupScope, GroupOrientation, EditorGroupLayout, GroupsOrder, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { DisposableStore } from 'vs/base/common/lifecycle'; @@ -22,6 +22,7 @@ import { ItemActivation, IQuickInputService } from 'vs/platform/quickinput/commo import { AllEditorsByMostRecentlyUsedQuickAccess, ActiveGroupEditorsByMostRecentlyUsedQuickAccess, AllEditorsByAppearanceQuickAccess } from 'vs/workbench/browser/parts/editor/editorQuickAccess'; import { Codicon } from 'vs/base/common/codicons'; import { IFilesConfigurationService, AutoSaveMode } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; +import { openEditorWith, getAllAvailableEditors } from 'vs/workbench/services/editor/common/editorOpenWith'; export class ExecuteCommandAction extends Action { @@ -491,27 +492,26 @@ export class CloseLeftEditorsInGroupAction extends Action { constructor( id: string, label: string, - @IEditorService private readonly editorService: IEditorService, @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService ) { super(id, label); } async run(context?: IEditorIdentifier): Promise { - const { group, editor } = getTarget(this.editorService, this.editorGroupService, context); + const { group, editor } = this.getTarget(context); if (group && editor) { return group.closeEditors({ direction: CloseDirection.LEFT, except: editor, excludeSticky: true }); } } -} -function getTarget(editorService: IEditorService, editorGroupService: IEditorGroupsService, context?: IEditorIdentifier): { editor: IEditorInput | null, group: IEditorGroup | undefined } { - if (context) { - return { editor: context.editor, group: editorGroupService.getGroup(context.groupId) }; + private getTarget(context?: IEditorIdentifier): { editor: IEditorInput | null, group: IEditorGroup | undefined } { + if (context) { + return { editor: context.editor, group: this.editorGroupService.getGroup(context.groupId) }; + } + + // Fallback to active group + return { group: this.editorGroupService.activeGroup, editor: this.editorGroupService.activeGroup.activeEditor }; } - - // Fallback to active group - return { group: editorGroupService.activeGroup, editor: editorGroupService.activeGroup.activeEditor }; } abstract class BaseCloseAllAction extends Action { @@ -581,7 +581,7 @@ abstract class BaseCloseAllAction extends Action { else { let name: string; if (editor instanceof SideBySideEditorInput) { - name = editor.master.getName(); // prefer shorter names by using master's name in this case + name = editor.primary.getName(); // prefer shorter names by using primary's name in this case } else { name = editor.getName(); } @@ -1776,3 +1776,72 @@ export class NewEditorGroupBelowAction extends BaseCreateEditorGroupAction { super(id, label, GroupDirection.DOWN, editorGroupService); } } + +export class ReopenResourcesAction extends Action { + + static readonly ID = 'workbench.action.reopenWithEditor'; + static readonly LABEL = nls.localize('workbench.action.reopenWithEditor', "Reopen Editor With..."); + + constructor( + id: string, + label: string, + @IQuickInputService private readonly quickInputService: IQuickInputService, + @IEditorService private readonly editorService: IEditorService, + @IConfigurationService private readonly configurationService: IConfigurationService + ) { + super(id, label); + } + + async run(): Promise { + const activeInput = this.editorService.activeEditor; + if (!activeInput) { + return; + } + + const activeEditorPane = this.editorService.activeEditorPane; + if (!activeEditorPane) { + return; + } + + const options = activeEditorPane.options; + const group = activeEditorPane.group; + await openEditorWith(activeInput, undefined, options, group, this.editorService, this.configurationService, this.quickInputService); + } +} + +export class ToggleEditorTypeAction extends Action { + + static readonly ID = 'workbench.action.toggleEditorType'; + static readonly LABEL = nls.localize('workbench.action.toggleEditorType', "Toggle Editor Type"); + + constructor( + id: string, + label: string, + @IEditorService private readonly editorService: IEditorService, + ) { + super(id, label); + } + + async run(): Promise { + const activeEditorPane = this.editorService.activeEditorPane; + if (!activeEditorPane) { + return; + } + + const input = activeEditorPane.input; + if (!input.resource) { + return; + } + + const options = activeEditorPane.options; + const group = activeEditorPane.group; + + const overrides = getAllAvailableEditors(input.resource, undefined, options, group, this.editorService); + const firstNonActiveOverride = overrides.find(([_, entry]) => !entry.active); + if (!firstNonActiveOverride) { + return; + } + + await firstNonActiveOverride[0].open(input, { ...options, override: firstNonActiveOverride[1].id }, group, OpenEditorContext.NEW_EDITOR)?.override; + } +} diff --git a/src/vs/workbench/browser/parts/editor/editorControl.ts b/src/vs/workbench/browser/parts/editor/editorControl.ts index d7ccd8c71c8..b3a49e5d197 100644 --- a/src/vs/workbench/browser/parts/editor/editorControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorControl.ts @@ -41,18 +41,16 @@ export class EditorControl extends Disposable { private readonly activeEditorPaneDisposables = this._register(new DisposableStore()); private dimension: Dimension | undefined; - private editorOperation: LongRunningOperation; + private readonly editorOperation = this._register(new LongRunningOperation(this.editorProgressService)); constructor( private parent: HTMLElement, private groupView: IEditorGroupView, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IInstantiationService private readonly instantiationService: IInstantiationService, - @IEditorProgressService editorProgressService: IEditorProgressService + @IEditorProgressService private readonly editorProgressService: IEditorProgressService ) { super(); - - this.editorOperation = this._register(new LongRunningOperation(editorProgressService)); } async openEditor(editor: EditorInput, options?: EditorOptions): Promise { @@ -200,19 +198,19 @@ export class EditorControl extends Disposable { // Stop any running operation this.editorOperation.stop(); - // Remove editor pane from parent and hide - const editorPaneContainer = this._activeEditorPane.getContainer(); - if (editorPaneContainer) { - this._activeEditorPane.onWillHide(); - this.parent.removeChild(editorPaneContainer); - hide(editorPaneContainer); - this._activeEditorPane.onDidHide(); - } - - // Indicate to editor pane + // Indicate to editor pane before removing the editor from + // the DOM to give a chance to persist certain state that + // might depend on still being the active DOM element. this._activeEditorPane.clearInput(); this._activeEditorPane.setVisible(false, this.groupView); + // Remove editor pane from parent + const editorPaneContainer = this._activeEditorPane.getContainer(); + if (editorPaneContainer) { + this.parent.removeChild(editorPaneContainer); + hide(editorPaneContainer); + } + // Clear active editor pane this.doSetActiveEditorPane(null); } @@ -224,16 +222,12 @@ export class EditorControl extends Disposable { } setVisible(visible: boolean): void { - if (this._activeEditorPane) { - this._activeEditorPane.setVisible(visible, this.groupView); - } + this._activeEditorPane?.setVisible(visible, this.groupView); } layout(dimension: Dimension): void { this.dimension = dimension; - if (this._activeEditorPane && this.dimension) { - this._activeEditorPane.layout(this.dimension); - } + this._activeEditorPane?.layout(dimension); } } diff --git a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts index 1f7016f89ba..bc9f5db8216 100644 --- a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts +++ b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts @@ -530,8 +530,12 @@ class DropOverlay extends Themable { } } -export interface EditorDropTargetDelegate { - groupContainsPredicate?(groupView: IEditorGroupView): boolean; +export interface IEditorDropTargetDelegate { + + /** + * A helper to figure out if the drop target contains the provided group. + */ + containsGroup?(groupView: IEditorGroupView): boolean; } export class EditorDropTarget extends Themable { @@ -546,7 +550,7 @@ export class EditorDropTarget extends Themable { constructor( private accessor: IEditorGroupsAccessor, private container: HTMLElement, - private readonly delegate: EditorDropTargetDelegate, + private readonly delegate: IEditorDropTargetDelegate, @IThemeService themeService: IThemeService, @IInstantiationService private readonly instantiationService: IInstantiationService ) { @@ -620,7 +624,8 @@ export class EditorDropTarget extends Themable { private findTargetGroupView(child: HTMLElement): IEditorGroupView | undefined { const groups = this.accessor.groups; - return groups.find(groupView => isAncestor(child, groupView.element) || this.delegate.groupContainsPredicate?.(groupView)); + + return groups.find(groupView => isAncestor(child, groupView.element) || this.delegate.containsGroup?.(groupView)); } private updateContainer(isDraggedOver: boolean): void { diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 989d05f0f0c..0bf99cb44ea 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -275,9 +275,9 @@ export class EditorGroupView extends Themable implements IEditorGroupView { })); // Close empty editor group via middle mouse click - this._register(addDisposableListener(this.element, EventType.MOUSE_UP, e => { + this._register(addDisposableListener(this.element, EventType.AUXCLICK, e => { if (this.isEmpty && e.button === 1 /* Middle Button */) { - EventHelper.stop(e); + EventHelper.stop(e, true); this.accessor.removeGroup(this); } @@ -525,17 +525,23 @@ export class EditorGroupView extends Themable implements IEditorGroupView { const editor = event.editor; const editorsToClose = [editor]; - // Include both sides of side by side editors when being closed and not opened multiple times - if (editor instanceof SideBySideEditorInput && !this.accessor.groups.some(groupView => groupView.group.contains(editor))) { - editorsToClose.push(editor.master, editor.details); + // Include both sides of side by side editors when being closed + if (editor instanceof SideBySideEditorInput) { + editorsToClose.push(editor.primary, editor.secondary); } - // Forward close to editor input for handling within - editorsToClose.forEach(editorToClose => { - const openedInOtherGroups = this.accessor.groups.some(groupView => groupView.group.contains(editorToClose, true /* include side by side editor master & details */)); - - editorToClose.close(this._group.id, openedInOtherGroups); - }); + // For each editor to close, we call dispose() to free up any resources. + // However, certain editors might be shared across multiple editor groups + // (including being visible in side by side / diff editors) and as such we + // only dispose when they are not opened elsewhere. + for (const editor of editorsToClose) { + if (!this.accessor.groups.some(groupView => groupView.group.contains(editor, { + strictEquals: true, // only if this input is not shared across editor groups + supportSideBySide: true // include side by side editor primary & secondary + }))) { + editor.dispose(); + } + } /* __GDPR__ "editorClosed" : { @@ -1353,8 +1359,8 @@ export class EditorGroupView extends Themable implements IEditorGroupView { return false; // editor must be dirty and not saving } - if (editor instanceof SideBySideEditorInput && this._group.contains(editor.master)) { - return false; // master-side of editor is still opened somewhere else + if (editor instanceof SideBySideEditorInput && this._group.contains(editor.primary)) { + return false; // primary-side of editor is still opened somewhere else } // Note: we explicitly decide to ask for confirm if closing a normal editor even @@ -1372,8 +1378,8 @@ export class EditorGroupView extends Themable implements IEditorGroupView { return true; // exact editor still opened } - if (editor instanceof SideBySideEditorInput && otherGroup.contains(editor.master)) { - return true; // master side of side by side editor still opened + if (editor instanceof SideBySideEditorInput && otherGroup.contains(editor.primary)) { + return true; // primary side of side by side editor still opened } return false; @@ -1398,7 +1404,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { let name: string; if (editor instanceof SideBySideEditorInput) { - name = editor.master.getName(); // prefer shorter names by using master's name in this case + name = editor.primary.getName(); // prefer shorter names by using primary's name in this case } else { name = editor.getName(); } diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index 12401397e72..c65d738df0b 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -9,7 +9,7 @@ import { Part } from 'vs/workbench/browser/part'; import { Dimension, isAncestor, toggleClass, addClass, $, EventHelper, addDisposableGenericMouseDownListner } from 'vs/base/browser/dom'; import { Event, Emitter, Relay } from 'vs/base/common/event'; import { contrastBorder, editorBackground } from 'vs/platform/theme/common/colorRegistry'; -import { GroupDirection, IAddGroupOptions, GroupsArrangement, GroupOrientation, IMergeGroupOptions, MergeGroupMode, ICopyEditorOptions, GroupsOrder, GroupChangeKind, GroupLocation, IFindGroupScope, EditorGroupLayout, GroupLayoutArgument, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { GroupDirection, IAddGroupOptions, GroupsArrangement, GroupOrientation, IMergeGroupOptions, MergeGroupMode, GroupsOrder, GroupChangeKind, GroupLocation, IFindGroupScope, EditorGroupLayout, GroupLayoutArgument, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IView, orthogonal, LayoutPriority, IViewSize, Direction, SerializableGrid, Sizing, ISerializedGrid, Orientation, GridBranchNode, isGridBranchNode, GridNode, createSerializedGrid, Grid } from 'vs/base/browser/ui/grid/grid'; import { GroupIdentifier, IEditorPartOptions, IEditorPartOptionsChangeEvent } from 'vs/workbench/common/editor'; @@ -21,7 +21,8 @@ import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/co import { IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ISerializedEditorGroup, isSerializedEditorGroup } from 'vs/workbench/common/editor/editorGroup'; -import { EditorDropTarget, EditorDropTargetDelegate } from 'vs/workbench/browser/parts/editor/editorDropTarget'; +import { EditorDropTarget, IEditorDropTargetDelegate } from 'vs/workbench/browser/parts/editor/editorDropTarget'; +import { IEditorDropService } from 'vs/workbench/services/editor/browser/editorDropService'; import { Color } from 'vs/base/common/color'; import { CenteredViewLayout } from 'vs/base/browser/ui/centered/centeredViewLayout'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -80,7 +81,7 @@ class GridWidgetView implements IView { } } -export class EditorPart extends Part implements IEditorGroupsService, IEditorGroupsAccessor { +export class EditorPart extends Part implements IEditorGroupsService, IEditorGroupsAccessor, IEditorDropService { declare readonly _serviceBrand: undefined; @@ -123,8 +124,6 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro private readonly workspaceMemento: MementoObject; private readonly globalMemento: MementoObject; - private _partOptions: IEditorPartOptions; - private readonly groupViews = new Map(); private mostRecentActiveGroups: GroupIdentifier[] = []; @@ -149,8 +148,6 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro this.gridWidgetView = new GridWidgetView(); - this._partOptions = getEditorPartOptions(this.configurationService, this.themeService); - this.workspaceMemento = this.getMemento(StorageScope.WORKSPACE); this.globalMemento = this.getMemento(StorageScope.GLOBAL); @@ -187,9 +184,8 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro private enforcedPartOptions: IEditorPartOptions[] = []; - get partOptions(): IEditorPartOptions { - return this._partOptions; - } + private _partOptions = getEditorPartOptions(this.configurationService, this.themeService); + get partOptions(): IEditorPartOptions { return this._partOptions; } enforcePartOptions(options: IEditorPartOptions): IDisposable { this.enforcedPartOptions.push(options); @@ -748,12 +744,13 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro let index = (options && typeof options.index === 'number') ? options.index : targetView.count; sourceView.editors.forEach(editor => { const inactive = !sourceView.isActive(editor) || this._activeGroup !== sourceView; - const copyOptions: ICopyEditorOptions = { index, inactive, preserveFocus: inactive }; + const sticky = sourceView.isSticky(editor); + const editorOptions = { index: !sticky ? index : undefined /* do not set index to preserve sticky flag */, inactive, preserveFocus: inactive }; if (options?.mode === MergeGroupMode.COPY_EDITORS) { - sourceView.copyEditor(editor, targetView, copyOptions); + sourceView.copyEditor(editor, targetView, editorOptions); } else { - sourceView.moveEditor(editor, targetView, copyOptions); + sourceView.moveEditor(editor, targetView, editorOptions); } index++; @@ -784,6 +781,14 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro //#endregion + //#region IEditorDropService + + createEditorDropTarget(container: HTMLElement, delegate: IEditorDropTargetDelegate): IDisposable { + return this.instantiationService.createInstance(EditorDropTarget, this, container, delegate); + } + + //#endregion + //#region Part // TODO @sbatten @joao find something better to prevent editor taking over #79897 @@ -824,7 +829,7 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro this.centeredLayoutWidget = this._register(new CenteredViewLayout(this.container, this.gridWidgetView, this.globalMemento[EditorPart.EDITOR_PART_CENTERED_VIEW_STORAGE_KEY])); // Drop support - this._register(this.createEditorDropTarget(this.container, {})); + this._register(this.createEditorDropTarget(this.container, Object.create(null))); // No drop in the editor const overlay = document.createElement('div'); @@ -1101,16 +1106,24 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro } // Persist centered view state - const centeredLayoutState = this.centeredLayoutWidget.state; - if (this.centeredLayoutWidget.isDefault(centeredLayoutState)) { - delete this.globalMemento[EditorPart.EDITOR_PART_CENTERED_VIEW_STORAGE_KEY]; - } else { - this.globalMemento[EditorPart.EDITOR_PART_CENTERED_VIEW_STORAGE_KEY] = centeredLayoutState; + if (this.centeredLayoutWidget) { + const centeredLayoutState = this.centeredLayoutWidget.state; + if (this.centeredLayoutWidget.isDefault(centeredLayoutState)) { + delete this.globalMemento[EditorPart.EDITOR_PART_CENTERED_VIEW_STORAGE_KEY]; + } else { + this.globalMemento[EditorPart.EDITOR_PART_CENTERED_VIEW_STORAGE_KEY] = centeredLayoutState; + } } super.saveState(); } + toJSON(): object { + return { + type: Parts.EDITOR_PART + }; + } + dispose(): void { // Forward to all groups @@ -1126,20 +1139,18 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro } //#endregion +} - toJSON(): object { - return { - type: Parts.EDITOR_PART - }; +class EditorDropService implements IEditorDropService { + + declare readonly _serviceBrand: undefined; + + constructor(@IEditorGroupsService private readonly editorPart: EditorPart) { } + + createEditorDropTarget(container: HTMLElement, delegate: IEditorDropTargetDelegate): IDisposable { + return this.editorPart.createEditorDropTarget(container, delegate); } - - //#region TODO@matt this should move into some kind of service - - createEditorDropTarget(container: HTMLElement, delegate: EditorDropTargetDelegate): IDisposable { - return this.instantiationService.createInstance(EditorDropTarget, this, container, delegate); - } - - //#endregion } registerSingleton(IEditorGroupsService, EditorPart); +registerSingleton(IEditorDropService, EditorDropService); diff --git a/src/vs/workbench/browser/parts/editor/editorQuickAccess.ts b/src/vs/workbench/browser/parts/editor/editorQuickAccess.ts index 60e46cc5c02..231efdd147a 100644 --- a/src/vs/workbench/browser/parts/editor/editorQuickAccess.ts +++ b/src/vs/workbench/browser/parts/editor/editorQuickAccess.ts @@ -137,7 +137,7 @@ export abstract class BaseEditorQuickAccessProvider extends PickerQuickAccessPro } return this.doGetEditors().map(({ editor, groupId }): IEditorQuickPickItem => { - const resource = toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); const isDirty = editor.isDirty() && !editor.isSaving(); const description = editor.getDescription(); const nameAndDescription = description ? `${editor.getName()} ${description}` : editor.getName(); diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index d6f0950099d..b3d0cab0c11 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -54,22 +54,22 @@ import { STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_FOREGRO import { themeColorFromId } from 'vs/platform/theme/common/themeService'; class SideBySideEditorEncodingSupport implements IEncodingSupport { - constructor(private master: IEncodingSupport, private details: IEncodingSupport) { } + constructor(private primary: IEncodingSupport, private secondary: IEncodingSupport) { } getEncoding(): string | undefined { - return this.master.getEncoding(); // always report from modified (right hand) side + return this.primary.getEncoding(); // always report from modified (right hand) side } setEncoding(encoding: string, mode: EncodingMode): void { - [this.master, this.details].forEach(editor => editor.setEncoding(encoding, mode)); + [this.primary, this.secondary].forEach(editor => editor.setEncoding(encoding, mode)); } } class SideBySideEditorModeSupport implements IModeSupport { - constructor(private master: IModeSupport, private details: IModeSupport) { } + constructor(private primary: IModeSupport, private secondary: IModeSupport) { } setMode(mode: string): void { - [this.master, this.details].forEach(editor => editor.setMode(mode)); + [this.primary, this.secondary].forEach(editor => editor.setMode(mode)); } } @@ -82,14 +82,14 @@ function toEditorWithEncodingSupport(input: IEditorInput): IEncodingSupport | nu // Side by Side (diff) Editor if (input instanceof SideBySideEditorInput) { - const masterEncodingSupport = toEditorWithEncodingSupport(input.master); - const detailsEncodingSupport = toEditorWithEncodingSupport(input.details); + const primaryEncodingSupport = toEditorWithEncodingSupport(input.primary); + const secondaryEncodingSupport = toEditorWithEncodingSupport(input.secondary); - if (masterEncodingSupport && detailsEncodingSupport) { - return new SideBySideEditorEncodingSupport(masterEncodingSupport, detailsEncodingSupport); + if (primaryEncodingSupport && secondaryEncodingSupport) { + return new SideBySideEditorEncodingSupport(primaryEncodingSupport, secondaryEncodingSupport); } - return masterEncodingSupport; + return primaryEncodingSupport; } // File or Resource Editor @@ -111,14 +111,14 @@ function toEditorWithModeSupport(input: IEditorInput): IModeSupport | null { // Side by Side (diff) Editor if (input instanceof SideBySideEditorInput) { - const masterModeSupport = toEditorWithModeSupport(input.master); - const detailsModeSupport = toEditorWithModeSupport(input.details); + const primaryModeSupport = toEditorWithModeSupport(input.primary); + const secondaryModeSupport = toEditorWithModeSupport(input.secondary); - if (masterModeSupport && detailsModeSupport) { - return new SideBySideEditorModeSupport(masterModeSupport, detailsModeSupport); + if (primaryModeSupport && secondaryModeSupport) { + return new SideBySideEditorModeSupport(primaryModeSupport, secondaryModeSupport); } - return masterModeSupport; + return primaryModeSupport; } // File or Resource Editor @@ -685,14 +685,14 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { else if (activeEditorPane instanceof BaseBinaryResourceEditor || activeEditorPane instanceof BinaryResourceDiffEditor) { const binaryEditors: BaseBinaryResourceEditor[] = []; if (activeEditorPane instanceof BinaryResourceDiffEditor) { - const details = activeEditorPane.getDetailsEditorPane(); - if (details instanceof BaseBinaryResourceEditor) { - binaryEditors.push(details); + const primary = activeEditorPane.getPrimaryEditorPane(); + if (primary instanceof BaseBinaryResourceEditor) { + binaryEditors.push(primary); } - const master = activeEditorPane.getMasterEditorPane(); - if (master instanceof BaseBinaryResourceEditor) { - binaryEditors.push(master); + const secondary = activeEditorPane.getSecondaryEditorPane(); + if (secondary instanceof BaseBinaryResourceEditor) { + binaryEditors.push(secondary); } } else { binaryEditors.push(activeEditorPane); @@ -871,7 +871,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { private onResourceEncodingChange(resource: URI): void { const activeEditorPane = this.editorService.activeEditorPane; if (activeEditorPane) { - const activeResource = toResource(activeEditorPane.input, { supportSideBySide: SideBySideEditor.MASTER }); + const activeResource = toResource(activeEditorPane.input, { supportSideBySide: SideBySideEditor.PRIMARY }); if (activeResource && isEqual(activeResource, resource)) { const activeCodeEditor = withNullAsUndefined(getCodeEditor(activeEditorPane.getControl())); @@ -1064,7 +1064,7 @@ export class ChangeModeAction extends Action { } const textModel = activeTextEditorControl.getModel(); - const resource = this.editorService.activeEditor ? toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER }) : null; + const resource = this.editorService.activeEditor ? toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }) : null; let hasLanguageSupport = !!resource; if (resource?.scheme === Schemas.untitled && !this.textFileService.untitled.get(resource)?.hasAssociatedFilePath) { @@ -1161,7 +1161,7 @@ export class ChangeModeAction extends Action { let languageSelection: ILanguageSelection | undefined; if (pick === autoDetectMode) { if (textModel) { - const resource = toResource(activeEditor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }); if (resource) { languageSelection = this.modeService.createByFilepathOrFirstLine(resource, textModel.getLineContent(1)); } @@ -1356,7 +1356,7 @@ export class ChangeEncodingAction extends Action { await timeout(50); // quick input is sensitive to being opened so soon after another - const resource = toResource(activeEditorPane.input, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(activeEditorPane.input, { supportSideBySide: SideBySideEditor.PRIMARY }); if (!resource || (!this.fileService.canHandleResource(resource) && resource.scheme !== Schemas.untitled)) { return; // encoding detection only possible for resources the file service can handle or that are untitled } diff --git a/src/vs/workbench/browser/parts/editor/editorsObserver.ts b/src/vs/workbench/browser/parts/editor/editorsObserver.ts index 4573dbdeb1a..a14a7fdc9c0 100644 --- a/src/vs/workbench/browser/parts/editor/editorsObserver.ts +++ b/src/vs/workbench/browser/parts/editor/editorsObserver.ts @@ -185,7 +185,7 @@ export class EditorsObserver extends Disposable { } private updateEditorResourcesMap(editor: IEditorInput, add: boolean): void { - const resource = toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); if (!resource) { return; // require a resource } diff --git a/src/vs/workbench/browser/parts/editor/media/titlecontrol.css b/src/vs/workbench/browser/parts/editor/media/titlecontrol.css index 90b596924ec..59ab0d4afac 100644 --- a/src/vs/workbench/browser/parts/editor/media/titlecontrol.css +++ b/src/vs/workbench/browser/parts/editor/media/titlecontrol.css @@ -28,7 +28,7 @@ /* Title Actions */ -.monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label, +.monaco-workbench .part.editor > .content .editor-group-container > .title .title-actions .action-label:not(span), .monaco-workbench .part.editor > .content .editor-group-container > .title .editor-actions .action-label:not(span) { display: flex; height: 35px; diff --git a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts index e309691bcf4..f96ff3982d2 100644 --- a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts @@ -67,10 +67,10 @@ export class NoTabsTitleControl extends TitleControl { this._register(addDisposableListener(titleContainer, EventType.DBLCLICK, (e: MouseEvent) => this.onTitleDoubleClick(e))); // Detect mouse click - this._register(addDisposableListener(titleContainer, EventType.MOUSE_UP, (e: MouseEvent) => this.onTitleClick(e))); + this._register(addDisposableListener(titleContainer, EventType.AUXCLICK, (e: MouseEvent) => this.onTitleAuxClick(e))); // Detect touch - this._register(addDisposableListener(titleContainer, TouchEventType.Tap, (e: GestureEvent) => this.onTitleClick(e))); + this._register(addDisposableListener(titleContainer, TouchEventType.Tap, (e: GestureEvent) => this.onTitleTap(e))); // Context Menu this._register(addDisposableListener(titleContainer, EventType.CONTEXT_MENU, (e: Event) => { @@ -98,25 +98,21 @@ export class NoTabsTitleControl extends TitleControl { this.group.pinEditor(); } - private onTitleClick(e: MouseEvent | GestureEvent): void { - if (e instanceof MouseEvent) { - // Close editor on middle mouse click - if (e.button === 1 /* Middle Button */) { - EventHelper.stop(e, true /* for https://github.com/Microsoft/vscode/issues/56715 */); + private onTitleAuxClick(e: MouseEvent): void { + if (e.button === 1 /* Middle Button */ && this.group.activeEditor) { + EventHelper.stop(e, true /* for https://github.com/Microsoft/vscode/issues/56715 */); - if (this.group.activeEditor) { - this.group.closeEditor(this.group.activeEditor); - } - } - } else { - // TODO@rebornix - // gesture tap should open the quick access - // editorGroupView will focus on the editor again when there are mouse/pointer/touch down events - // we need to wait a bit as `GesureEvent.Tap` is generated from `touchstart` and then `touchend` evnets, which are not an atom event. - setTimeout(() => this.quickInputService.quickAccess.show(), 50); + this.group.closeEditor(this.group.activeEditor); } } + private onTitleTap(e: GestureEvent): void { + // TODO@rebornix gesture tap should open the quick access + // editorGroupView will focus on the editor again when there are mouse/pointer/touch down events + // we need to wait a bit as `GesureEvent.Tap` is generated from `touchstart` and then `touchend` evnets, which are not an atom event. + setTimeout(() => this.quickInputService.quickAccess.show(), 50); + } + getPreferredHeight(): number { return EDITOR_TITLE_HEIGHT; } diff --git a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts index fd57b26ca33..aff171a997f 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts @@ -22,17 +22,16 @@ import { assertIsDefined } from 'vs/base/common/types'; export class SideBySideEditor extends BaseEditor { static readonly ID: string = 'workbench.editor.sidebysideEditor'; - static MASTER: SideBySideEditor | undefined; - get minimumMasterWidth() { return this.masterEditorPane ? this.masterEditorPane.minimumWidth : 0; } - get maximumMasterWidth() { return this.masterEditorPane ? this.masterEditorPane.maximumWidth : Number.POSITIVE_INFINITY; } - get minimumMasterHeight() { return this.masterEditorPane ? this.masterEditorPane.minimumHeight : 0; } - get maximumMasterHeight() { return this.masterEditorPane ? this.masterEditorPane.maximumHeight : Number.POSITIVE_INFINITY; } + private get minimumPrimaryWidth() { return this.primaryEditorPane ? this.primaryEditorPane.minimumWidth : 0; } + private get maximumPrimaryWidth() { return this.primaryEditorPane ? this.primaryEditorPane.maximumWidth : Number.POSITIVE_INFINITY; } + private get minimumPrimaryHeight() { return this.primaryEditorPane ? this.primaryEditorPane.minimumHeight : 0; } + private get maximumPrimaryHeight() { return this.primaryEditorPane ? this.primaryEditorPane.maximumHeight : Number.POSITIVE_INFINITY; } - get minimumDetailsWidth() { return this.detailsEditorPane ? this.detailsEditorPane.minimumWidth : 0; } - get maximumDetailsWidth() { return this.detailsEditorPane ? this.detailsEditorPane.maximumWidth : Number.POSITIVE_INFINITY; } - get minimumDetailsHeight() { return this.detailsEditorPane ? this.detailsEditorPane.minimumHeight : 0; } - get maximumDetailsHeight() { return this.detailsEditorPane ? this.detailsEditorPane.maximumHeight : Number.POSITIVE_INFINITY; } + private get minimumSecondaryWidth() { return this.secondaryEditorPane ? this.secondaryEditorPane.minimumWidth : 0; } + private get maximumSecondaryWidth() { return this.secondaryEditorPane ? this.secondaryEditorPane.maximumWidth : Number.POSITIVE_INFINITY; } + private get minimumSecondaryHeight() { return this.secondaryEditorPane ? this.secondaryEditorPane.minimumHeight : 0; } + private get maximumSecondaryHeight() { return this.secondaryEditorPane ? this.secondaryEditorPane.maximumHeight : Number.POSITIVE_INFINITY; } // these setters need to exist because this extends from BaseEditor set minimumWidth(value: number) { /* noop */ } @@ -40,16 +39,16 @@ export class SideBySideEditor extends BaseEditor { set minimumHeight(value: number) { /* noop */ } set maximumHeight(value: number) { /* noop */ } - get minimumWidth() { return this.minimumMasterWidth + this.minimumDetailsWidth; } - get maximumWidth() { return this.maximumMasterWidth + this.maximumDetailsWidth; } - get minimumHeight() { return this.minimumMasterHeight + this.minimumDetailsHeight; } - get maximumHeight() { return this.maximumMasterHeight + this.maximumDetailsHeight; } + get minimumWidth() { return this.minimumPrimaryWidth + this.minimumSecondaryWidth; } + get maximumWidth() { return this.maximumPrimaryWidth + this.maximumSecondaryWidth; } + get minimumHeight() { return this.minimumPrimaryHeight + this.minimumSecondaryHeight; } + get maximumHeight() { return this.maximumPrimaryHeight + this.maximumSecondaryHeight; } - protected masterEditorPane?: BaseEditor; - protected detailsEditorPane?: BaseEditor; + protected primaryEditorPane?: BaseEditor; + protected secondaryEditorPane?: BaseEditor; - private masterEditorContainer: HTMLElement | undefined; - private detailsEditorContainer: HTMLElement | undefined; + private primaryEditorContainer: HTMLElement | undefined; + private secondaryEditorContainer: HTMLElement | undefined; private splitview: SplitView | undefined; private dimension: DOM.Dimension = new DOM.Dimension(0, 0); @@ -74,19 +73,19 @@ export class SideBySideEditor extends BaseEditor { const splitview = this.splitview = this._register(new SplitView(parent, { orientation: Orientation.HORIZONTAL })); this._register(this.splitview.onDidSashReset(() => splitview.distributeViewSizes())); - this.detailsEditorContainer = DOM.$('.details-editor-container'); + this.secondaryEditorContainer = DOM.$('.secondary-editor-container'); this.splitview.addView({ - element: this.detailsEditorContainer, - layout: size => this.detailsEditorPane && this.detailsEditorPane.layout(new DOM.Dimension(size, this.dimension.height)), + element: this.secondaryEditorContainer, + layout: size => this.secondaryEditorPane && this.secondaryEditorPane.layout(new DOM.Dimension(size, this.dimension.height)), minimumSize: 220, maximumSize: Number.POSITIVE_INFINITY, onDidChange: Event.None }, Sizing.Distribute); - this.masterEditorContainer = DOM.$('.master-editor-container'); + this.primaryEditorContainer = DOM.$('.primary-editor-container'); this.splitview.addView({ - element: this.masterEditorContainer, - layout: size => this.masterEditorPane && this.masterEditorPane.layout(new DOM.Dimension(size, this.dimension.height)), + element: this.primaryEditorContainer, + layout: size => this.primaryEditorPane && this.primaryEditorPane.layout(new DOM.Dimension(size, this.dimension.height)), minimumSize: 220, maximumSize: Number.POSITIVE_INFINITY, onDidChange: Event.None @@ -103,30 +102,30 @@ export class SideBySideEditor extends BaseEditor { } setOptions(options: EditorOptions | undefined): void { - if (this.masterEditorPane) { - this.masterEditorPane.setOptions(options); + if (this.primaryEditorPane) { + this.primaryEditorPane.setOptions(options); } } protected setEditorVisible(visible: boolean, group: IEditorGroup | undefined): void { - if (this.masterEditorPane) { - this.masterEditorPane.setVisible(visible, group); + if (this.primaryEditorPane) { + this.primaryEditorPane.setVisible(visible, group); } - if (this.detailsEditorPane) { - this.detailsEditorPane.setVisible(visible, group); + if (this.secondaryEditorPane) { + this.secondaryEditorPane.setVisible(visible, group); } super.setEditorVisible(visible, group); } clearInput(): void { - if (this.masterEditorPane) { - this.masterEditorPane.clearInput(); + if (this.primaryEditorPane) { + this.primaryEditorPane.clearInput(); } - if (this.detailsEditorPane) { - this.detailsEditorPane.clearInput(); + if (this.secondaryEditorPane) { + this.secondaryEditorPane.clearInput(); } this.disposeEditors(); @@ -135,8 +134,8 @@ export class SideBySideEditor extends BaseEditor { } focus(): void { - if (this.masterEditorPane) { - this.masterEditorPane.focus(); + if (this.primaryEditorPane) { + this.primaryEditorPane.focus(); } } @@ -148,19 +147,19 @@ export class SideBySideEditor extends BaseEditor { } getControl(): IEditorControl | undefined { - if (this.masterEditorPane) { - return this.masterEditorPane.getControl(); + if (this.primaryEditorPane) { + return this.primaryEditorPane.getControl(); } return undefined; } - getMasterEditorPane(): IEditorPane | undefined { - return this.masterEditorPane; + getPrimaryEditorPane(): IEditorPane | undefined { + return this.primaryEditorPane; } - getDetailsEditorPane(): IEditorPane | undefined { - return this.detailsEditorPane; + getSecondaryEditorPane(): IEditorPane | undefined { + return this.secondaryEditorPane; } private async updateInput(oldInput: SideBySideEditorInput, newInput: SideBySideEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise { @@ -172,21 +171,21 @@ export class SideBySideEditor extends BaseEditor { return this.setNewInput(newInput, options, token); } - if (!this.detailsEditorPane || !this.masterEditorPane) { + if (!this.secondaryEditorPane || !this.primaryEditorPane) { return; } await Promise.all([ - this.detailsEditorPane.setInput(newInput.details, undefined, token), - this.masterEditorPane.setInput(newInput.master, options, token) + this.secondaryEditorPane.setInput(newInput.secondary, undefined, token), + this.primaryEditorPane.setInput(newInput.primary, options, token) ]); } private setNewInput(newInput: SideBySideEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise { - const detailsEditor = this.doCreateEditor(newInput.details, assertIsDefined(this.detailsEditorContainer)); - const masterEditor = this.doCreateEditor(newInput.master, assertIsDefined(this.masterEditorContainer)); + const secondaryEditor = this.doCreateEditor(newInput.secondary, assertIsDefined(this.secondaryEditorContainer)); + const primaryEditor = this.doCreateEditor(newInput.primary, assertIsDefined(this.primaryEditorContainer)); - return this.onEditorsCreated(detailsEditor, masterEditor, newInput.details, newInput.master, options, token); + return this.onEditorsCreated(secondaryEditor, primaryEditor, newInput.secondary, newInput.primary, options, token); } private doCreateEditor(editorInput: EditorInput, container: HTMLElement): BaseEditor { @@ -202,48 +201,48 @@ export class SideBySideEditor extends BaseEditor { return editor; } - private async onEditorsCreated(details: BaseEditor, master: BaseEditor, detailsInput: EditorInput, masterInput: EditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise { - this.detailsEditorPane = details; - this.masterEditorPane = master; + private async onEditorsCreated(secondary: BaseEditor, primary: BaseEditor, secondaryInput: EditorInput, primaryInput: EditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise { + this.secondaryEditorPane = secondary; + this.primaryEditorPane = primary; this._onDidSizeConstraintsChange.input = Event.any( - Event.map(details.onDidSizeConstraintsChange, () => undefined), - Event.map(master.onDidSizeConstraintsChange, () => undefined) + Event.map(secondary.onDidSizeConstraintsChange, () => undefined), + Event.map(primary.onDidSizeConstraintsChange, () => undefined) ); this.onDidCreateEditors.fire(undefined); await Promise.all([ - this.detailsEditorPane.setInput(detailsInput, undefined, token), - this.masterEditorPane.setInput(masterInput, options, token)] + this.secondaryEditorPane.setInput(secondaryInput, undefined, token), + this.primaryEditorPane.setInput(primaryInput, options, token)] ); } updateStyles(): void { super.updateStyles(); - if (this.masterEditorContainer) { - this.masterEditorContainer.style.boxShadow = `-6px 0 5px -5px ${this.getColor(scrollbarShadow)}`; + if (this.primaryEditorContainer) { + this.primaryEditorContainer.style.boxShadow = `-6px 0 5px -5px ${this.getColor(scrollbarShadow)}`; } } private disposeEditors(): void { - if (this.detailsEditorPane) { - this.detailsEditorPane.dispose(); - this.detailsEditorPane = undefined; + if (this.secondaryEditorPane) { + this.secondaryEditorPane.dispose(); + this.secondaryEditorPane = undefined; } - if (this.masterEditorPane) { - this.masterEditorPane.dispose(); - this.masterEditorPane = undefined; + if (this.primaryEditorPane) { + this.primaryEditorPane.dispose(); + this.primaryEditorPane = undefined; } - if (this.detailsEditorContainer) { - DOM.clearNode(this.detailsEditorContainer); + if (this.secondaryEditorContainer) { + DOM.clearNode(this.secondaryEditorContainer); } - if (this.masterEditorContainer) { - DOM.clearNode(this.masterEditorContainer); + if (this.primaryEditorContainer) { + DOM.clearNode(this.primaryEditorContainer); } } diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index fa8861a64fc..f3eb689c73a 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -601,7 +601,7 @@ export class TabsTitleControl extends TitleControl { const disposables = new DisposableStore(); const handleClickOrTouch = (e: MouseEvent | GestureEvent): void => { - tab.blur(); + tab.blur(); // prevent flicker of focus outline on tab until editor got focus if (e instanceof MouseEvent && e.button !== 0) { if (e.button === 1) { @@ -642,14 +642,17 @@ export class TabsTitleControl extends TitleControl { tabsScrollbar.setScrollPosition({ scrollLeft: tabsScrollbar.getScrollPosition().scrollLeft - e.translationX }); })); - // Close on mouse middle click + // Prevent flicker of focus outline on tab until editor got focus disposables.add(addDisposableListener(tab, EventType.MOUSE_UP, (e: MouseEvent) => { EventHelper.stop(e); tab.blur(); + })); + // Close on mouse middle click + disposables.add(addDisposableListener(tab, EventType.AUXCLICK, (e: MouseEvent) => { if (e.button === 1 /* Middle Button*/) { - e.stopPropagation(); // for https://github.com/Microsoft/vscode/issues/56715 + EventHelper.stop(e, true /* for https://github.com/Microsoft/vscode/issues/56715 */); this.blockRevealActiveTabOnce(); this.closeOneEditorAction.run({ groupId: this.group.id, editorIndex: index }); @@ -1087,7 +1090,7 @@ export class TabsTitleControl extends TitleControl { ); // Tests helper - const resource = toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); if (resource) { tabContainer.setAttribute('data-resource-name', basenameOrAuthority(resource)); } else { diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 7a6e4137db8..debadbd7e93 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -191,7 +191,7 @@ export abstract class TitleControl extends Themable { secondaryEditorActions.some(action => action instanceof ExecuteCommandAction) // see also https://github.com/Microsoft/vscode/issues/16298 ) { const editorActionsToolbar = assertIsDefined(this.editorActionsToolbar); - editorActionsToolbar.setActions(primaryEditorActions, secondaryEditorActions)(); + editorActionsToolbar.setActions(primaryEditorActions, secondaryEditorActions); this.currentPrimaryEditorActionIds = primaryEditorActionIds; this.currentSecondaryEditorActionIds = secondaryEditorActionIds; @@ -223,7 +223,7 @@ export abstract class TitleControl extends Themable { this.editorToolBarMenuDisposables.clear(); // Update contexts - this.resourceContext.set(this.group.activeEditor ? withUndefinedAsNull(toResource(this.group.activeEditor, { supportSideBySide: SideBySideEditor.MASTER })) : null); + this.resourceContext.set(this.group.activeEditor ? withUndefinedAsNull(toResource(this.group.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY })) : null); this.editorPinnedContext.set(this.group.activeEditor ? this.group.isPinned(this.group.activeEditor) : false); this.editorStickyContext.set(this.group.activeEditor ? this.group.isSticky(this.group.activeEditor) : false); @@ -238,7 +238,7 @@ export abstract class TitleControl extends Themable { this.updateEditorActionsToolbar(); // Update editor toolbar whenever contributed actions change })); - this.editorToolBarMenuDisposables.add(createAndFillInActionBarActions(titleBarMenu, { arg: this.resourceContext.get(), shouldForwardArgs: true }, { primary, secondary })); + this.editorToolBarMenuDisposables.add(createAndFillInActionBarActions(titleBarMenu, { arg: this.resourceContext.get(), shouldForwardArgs: true }, { primary, secondary }, (group: string) => group === 'navigation' || group === '1_run')); } return { primary, secondary }; @@ -246,7 +246,7 @@ export abstract class TitleControl extends Themable { protected clearEditorActionsToolbar(): void { if (this.editorActionsToolbar) { - this.editorActionsToolbar.setActions([], [])(); + this.editorActionsToolbar.setActions([], []); } this.currentPrimaryEditorActionIds = []; @@ -298,7 +298,7 @@ export abstract class TitleControl extends Themable { } protected doFillResourceDataTransfers(editor: IEditorInput, e: DragEvent): boolean { - const resource = toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); if (!resource) { return false; } @@ -326,7 +326,7 @@ export abstract class TitleControl extends Themable { // Update contexts based on editor picked and remember previous to restore const currentResourceContext = this.resourceContext.get(); - this.resourceContext.set(withUndefinedAsNull(toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }))); + this.resourceContext.set(withUndefinedAsNull(toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }))); const currentPinnedContext = !!this.editorPinnedContext.get(); this.editorPinnedContext.set(this.group.isPinned(editor)); const currentStickyContext = !!this.editorStickyContext.get(); diff --git a/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts b/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts index 3c048a86e08..366e9d64b6b 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts @@ -109,18 +109,18 @@ export class NotificationsStatus extends Disposable { return localize('oneNotification', "1 New Notification"); } - return localize('notifications', "{0} New Notifications", this.newNotificationsCount); + return localize({ key: 'notifications', comment: ['{0} will be replaced by a number'] }, "{0} New Notifications", this.newNotificationsCount); } if (this.newNotificationsCount === 0) { - return localize('noNotificationsWithProgress', "No New Notifications ({0} in progress)", notificationsInProgress); + return localize({ key: 'noNotificationsWithProgress', comment: ['{0} will be replaced by a number'] }, "No New Notifications ({0} in progress)", notificationsInProgress); } if (this.newNotificationsCount === 1) { - return localize('oneNotificationWithProgress', "1 New Notification ({0} in progress)", notificationsInProgress); + return localize({ key: 'oneNotificationWithProgress', comment: ['{0} will be replaced by a number'] }, "1 New Notification ({0} in progress)", notificationsInProgress); } - return localize('notificationsWithProgress', "{0} New Notifications ({0} in progress)", this.newNotificationsCount, notificationsInProgress); + return localize({ key: 'notificationsWithProgress', comment: ['{0} and {1} will be replaced by a number'] }, "{0} New Notifications ({1} in progress)", this.newNotificationsCount, notificationsInProgress); } update(isCenterVisible: boolean, isToastsVisible: boolean): void { diff --git a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts index f78cee5dd95..4b213eb468a 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts @@ -307,9 +307,9 @@ export class NotificationTemplateRenderer extends Disposable { // Container toggleClass(this.template.container, 'expanded', notification.expanded); - this.inputDisposables.add(addDisposableListener(this.template.container, EventType.MOUSE_UP, e => { + this.inputDisposables.add(addDisposableListener(this.template.container, EventType.AUXCLICK, e => { if (!notification.hasProgress && e.button === 1 /* Middle Button */) { - EventHelper.stop(e); + EventHelper.stop(e, true); notification.close(); } diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index ce7f627e8cb..c6e5792c34a 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -50,10 +50,15 @@ outline-offset: -2px; } -.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item.clicked:focus .action-label { +.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item.clicked:not(.checked):focus .action-label { border-bottom-color: transparent !important; /* hides border on clicked state */ } +.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked.clicked:focus .action-label, +.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked.active:focus .action-label { + border-bottom-color: currentColor !important; +} + /** Panel Switcher */ .monaco-workbench .part.panel > .composite.title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.codicon-more { @@ -173,19 +178,6 @@ box-sizing: border-box; } -/** Actions */ - -.monaco-workbench .panel .monaco-action-bar .action-item.select-container { - cursor: default; -} - -.monaco-workbench .panel .monaco-action-bar .action-item .monaco-select-box { - cursor: pointer; - min-width: 110px; - min-height: 18px; - padding: 2px 23px 2px 8px; -} - /* Rotate icons when panel is on right */ .monaco-workbench .part.panel.right .title-actions .codicon-split-horizontal, .monaco-workbench .part.panel.right .title-actions .codicon-panel-maximize, diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 9a773d82e32..80cb4da2082 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -38,7 +38,7 @@ import { MenuId } from 'vs/platform/actions/common/actions'; import { ViewMenuActions, ViewContainerMenuActions } from 'vs/workbench/browser/parts/views/viewMenuActions'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { Before2D, CompositeDragAndDropObserver, ICompositeDragAndDrop } from 'vs/workbench/browser/dnd'; +import { Before2D, CompositeDragAndDropObserver, ICompositeDragAndDrop, toggleDropEffect } from 'vs/workbench/browser/dnd'; import { IActivity } from 'vs/workbench/common/activity'; interface ICachedPanel { @@ -434,6 +434,8 @@ export class PanelPart extends CompositePart implements IPanelService { this._register(CompositeDragAndDropObserver.INSTANCE.registerTarget(this.emptyPanelMessageElement, { onDragOver: (e) => { EventHelper.stop(e.eventData, true); + const validDropTarget = this.dndHandler.onDragEnter(e.dragAndDropData, undefined, e.eventData); + toggleDropEffect(e.eventData.dataTransfer, 'move', validDropTarget); }, onDragEnter: (e) => { EventHelper.stop(e.eventData, true); diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index fe6a54fcbca..fd6e67fbc09 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -765,6 +765,9 @@ class StatusbarEntryItem extends Disposable { this.container.setAttribute('aria-label', entry.ariaLabel); this.labelContainer.setAttribute('aria-label', entry.ariaLabel); } + if (!this.entry || entry.role !== this.entry.role) { + this.labelContainer.setAttribute('role', entry.role || 'button'); + } // Update: Tooltip (on the container, because label can be disabled) if (!this.entry || entry.tooltip !== this.entry.tooltip) { diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 1b2f52c6ab7..0f5d124a005 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -429,7 +429,8 @@ export class CustomMenubarControl extends MenubarControl { primary: KeyCode.F10, weight: KeybindingWeight.WorkbenchContrib, when: IsWebContext - } + }, + f1: true }); } diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 22eb36afbc7..9c02c267018 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -271,7 +271,7 @@ export class TitlebarPart extends Part implements ITitleService { if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { folder = workspace.folders[0]; } else { - const resource = toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); if (resource) { folder = this.contextService.getWorkspaceFolder(resource); } diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index be38ca6c005..130382bb9a7 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -3,44 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./media/views'; -import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IAction, ActionRunner } from 'vs/base/common/actions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IMenuService, MenuId, MenuItemAction, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; -import { ContextAwareMenuEntryActionViewItem, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { IContextKeyService, ContextKeyExpr, ContextKeyEqualsExpr, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { ITreeView, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeViewDescriptor, IViewsRegistry, ITreeItemLabel, Extensions, IViewDescriptorService, ViewContainer, ViewContainerLocation } from 'vs/workbench/common/views'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { ITreeView, ITreeViewDescriptor, IViewsRegistry, Extensions, IViewDescriptorService } from 'vs/workbench/common/views'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IProgressService } from 'vs/platform/progress/common/progress'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import * as DOM from 'vs/base/browser/dom'; -import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels'; -import { ActionBar, IActionViewItemProvider, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; -import { URI } from 'vs/base/common/uri'; -import { dirname, basename } from 'vs/base/common/resources'; -import { LIGHT, FileThemeIcon, FolderThemeIcon, registerThemingParticipant, ThemeIcon, IThemeService } from 'vs/platform/theme/common/themeService'; -import { FileKind } from 'vs/platform/files/common/files'; -import { WorkbenchAsyncDataTree, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; -import { localize } from 'vs/nls'; -import { timeout } from 'vs/base/common/async'; -import { textLinkForeground, textCodeBlockBackground, focusBorder, listFilterMatchHighlight, listFilterMatchHighlightBorder } from 'vs/platform/theme/common/colorRegistry'; -import { isString } from 'vs/base/common/types'; -import { ILabelService } from 'vs/platform/label/common/label'; import { Registry } from 'vs/platform/registry/common/platform'; -import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { ITreeRenderer, ITreeNode, IAsyncDataSource, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; -import { FuzzyScore, createMatches } from 'vs/base/common/filters'; -import { CollapseAllAction } from 'vs/base/browser/ui/tree/treeDefaults'; -import { isFalsyOrWhitespace } from 'vs/base/common/strings'; -import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -81,10 +55,7 @@ export class TreeViewPane extends ViewPane { renderBody(container: HTMLElement): void { super.renderBody(container); - - if (this.treeView instanceof TreeView) { - this.treeView.show(container); - } + this.treeView.show(container); } shouldShowWelcome(): boolean { @@ -104,937 +75,3 @@ export class TreeViewPane extends ViewPane { this.treeView.setVisibility(this.isBodyVisible()); } } - -class Root implements ITreeItem { - label = { label: 'root' }; - handle = '0'; - parentHandle: string | undefined = undefined; - collapsibleState = TreeItemCollapsibleState.Expanded; - children: ITreeItem[] | undefined = undefined; -} - -const noDataProviderMessage = localize('no-dataprovider', "There is no data provider registered that can provide view data."); - -class Tree extends WorkbenchAsyncDataTree { } - -export class TreeView extends Disposable implements ITreeView { - - private isVisible: boolean = false; - private _hasIconForParentNode = false; - private _hasIconForLeafNode = false; - - private readonly collapseAllContextKey: RawContextKey; - private readonly collapseAllContext: IContextKey; - private readonly refreshContextKey: RawContextKey; - private readonly refreshContext: IContextKey; - - private focused: boolean = false; - private domNode!: HTMLElement; - private treeContainer!: HTMLElement; - private _messageValue: string | undefined; - private _canSelectMany: boolean = false; - private messageElement!: HTMLDivElement; - private tree: Tree | undefined; - private treeLabels: ResourceLabels | undefined; - - private root: ITreeItem; - private elementsToRefresh: ITreeItem[] = []; - - private readonly _onDidExpandItem: Emitter = this._register(new Emitter()); - readonly onDidExpandItem: Event = this._onDidExpandItem.event; - - private readonly _onDidCollapseItem: Emitter = this._register(new Emitter()); - readonly onDidCollapseItem: Event = this._onDidCollapseItem.event; - - private _onDidChangeSelection: Emitter = this._register(new Emitter()); - readonly onDidChangeSelection: Event = this._onDidChangeSelection.event; - - private readonly _onDidChangeVisibility: Emitter = this._register(new Emitter()); - readonly onDidChangeVisibility: Event = this._onDidChangeVisibility.event; - - private readonly _onDidChangeActions: Emitter = this._register(new Emitter()); - readonly onDidChangeActions: Event = this._onDidChangeActions.event; - - private readonly _onDidChangeWelcomeState: Emitter = this._register(new Emitter()); - readonly onDidChangeWelcomeState: Event = this._onDidChangeWelcomeState.event; - - private readonly _onDidChangeTitle: Emitter = this._register(new Emitter()); - readonly onDidChangeTitle: Event = this._onDidChangeTitle.event; - - private readonly _onDidCompleteRefresh: Emitter = this._register(new Emitter()); - - constructor( - readonly id: string, - private _title: string, - @IThemeService private readonly themeService: IThemeService, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @ICommandService private readonly commandService: ICommandService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IProgressService protected readonly progressService: IProgressService, - @IContextMenuService private readonly contextMenuService: IContextMenuService, - @IKeybindingService private readonly keybindingService: IKeybindingService, - @INotificationService private readonly notificationService: INotificationService, - @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, - @IContextKeyService contextKeyService: IContextKeyService - ) { - super(); - this.root = new Root(); - this.collapseAllContextKey = new RawContextKey(`treeView.${this.id}.enableCollapseAll`, false); - this.collapseAllContext = this.collapseAllContextKey.bindTo(contextKeyService); - this.refreshContextKey = new RawContextKey(`treeView.${this.id}.enableRefresh`, false); - this.refreshContext = this.refreshContextKey.bindTo(contextKeyService); - - this._register(this.themeService.onDidFileIconThemeChange(() => this.doRefresh([this.root]) /** soft refresh **/)); - this._register(this.themeService.onDidColorThemeChange(() => this.doRefresh([this.root]) /** soft refresh **/)); - this._register(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('explorer.decorations')) { - this.doRefresh([this.root]); /** soft refresh **/ - } - })); - this._register(this.viewDescriptorService.onDidChangeLocation(({ views, from, to }) => { - if (views.some(v => v.id === this.id)) { - this.tree?.updateOptions({ overrideStyles: { listBackground: this.viewLocation === ViewContainerLocation.Sidebar ? SIDE_BAR_BACKGROUND : PANEL_BACKGROUND } }); - } - })); - this.registerActions(); - - this.create(); - } - - get viewContainer(): ViewContainer { - return this.viewDescriptorService.getViewContainerByViewId(this.id)!; - } - - get viewLocation(): ViewContainerLocation { - return this.viewDescriptorService.getViewLocationById(this.id)!; - } - - private _dataProvider: ITreeViewDataProvider | undefined; - get dataProvider(): ITreeViewDataProvider | undefined { - return this._dataProvider; - } - - set dataProvider(dataProvider: ITreeViewDataProvider | undefined) { - if (this.tree === undefined) { - this.createTree(); - } - - if (dataProvider) { - this._dataProvider = new class implements ITreeViewDataProvider { - private _isEmpty: boolean = true; - private _onDidChangeEmpty: Emitter = new Emitter(); - public onDidChangeEmpty: Event = this._onDidChangeEmpty.event; - - get isTreeEmpty(): boolean { - return this._isEmpty; - } - - async getChildren(node: ITreeItem): Promise { - let children: ITreeItem[]; - if (node && node.children) { - children = node.children; - } else { - children = await (node instanceof Root ? dataProvider.getChildren() : dataProvider.getChildren(node)); - node.children = children; - } - if (node instanceof Root) { - const oldEmpty = this._isEmpty; - this._isEmpty = children.length === 0; - if (oldEmpty !== this._isEmpty) { - this._onDidChangeEmpty.fire(); - } - } - return children; - } - }; - if (this._dataProvider.onDidChangeEmpty) { - this._register(this._dataProvider.onDidChangeEmpty(() => this._onDidChangeWelcomeState.fire())); - } - this.updateMessage(); - this.refresh(); - } else { - this._dataProvider = undefined; - this.updateMessage(); - } - - this._onDidChangeWelcomeState.fire(); - } - - private _message: string | undefined; - get message(): string | undefined { - return this._message; - } - - set message(message: string | undefined) { - this._message = message; - this.updateMessage(); - this._onDidChangeWelcomeState.fire(); - } - - get title(): string { - return this._title; - } - - set title(name: string) { - this._title = name; - this._onDidChangeTitle.fire(this._title); - } - - get canSelectMany(): boolean { - return this._canSelectMany; - } - - set canSelectMany(canSelectMany: boolean) { - this._canSelectMany = canSelectMany; - } - - get hasIconForParentNode(): boolean { - return this._hasIconForParentNode; - } - - get hasIconForLeafNode(): boolean { - return this._hasIconForLeafNode; - } - - get visible(): boolean { - return this.isVisible; - } - - get showCollapseAllAction(): boolean { - return !!this.collapseAllContext.get(); - } - - set showCollapseAllAction(showCollapseAllAction: boolean) { - this.collapseAllContext.set(showCollapseAllAction); - } - - get showRefreshAction(): boolean { - return !!this.refreshContext.get(); - } - - set showRefreshAction(showRefreshAction: boolean) { - this.refreshContext.set(showRefreshAction); - } - - private registerActions() { - const that = this; - this._register(registerAction2(class extends Action2 { - constructor() { - super({ - id: `workbench.actions.treeView.${that.id}.refresh`, - title: localize('refresh', "Refresh"), - menu: { - id: MenuId.ViewTitle, - when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', that.id), that.refreshContextKey), - group: 'navigation', - order: Number.MAX_SAFE_INTEGER - 1, - }, - icon: { id: 'codicon/refresh' } - }); - } - async run(): Promise { - return that.refresh(); - } - })); - this._register(registerAction2(class extends Action2 { - constructor() { - super({ - id: `workbench.actions.treeView.${that.id}.collapseAll`, - title: localize('collapseAll', "Collapse All"), - menu: { - id: MenuId.ViewTitle, - when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', that.id), that.collapseAllContextKey), - group: 'navigation', - order: Number.MAX_SAFE_INTEGER, - }, - icon: { id: 'codicon/collapse-all' } - }); - } - async run(): Promise { - if (that.tree) { - return new CollapseAllAction(that.tree, true).run(); - } - } - })); - } - - setVisibility(isVisible: boolean): void { - isVisible = !!isVisible; - if (this.isVisible === isVisible) { - return; - } - - this.isVisible = isVisible; - - if (this.tree) { - if (this.isVisible) { - DOM.show(this.tree.getHTMLElement()); - } else { - DOM.hide(this.tree.getHTMLElement()); // make sure the tree goes out of the tabindex world by hiding it - } - - if (this.isVisible && this.elementsToRefresh.length) { - this.doRefresh(this.elementsToRefresh); - this.elementsToRefresh = []; - } - } - - this._onDidChangeVisibility.fire(this.isVisible); - } - - focus(reveal: boolean = true): void { - if (this.tree && this.root.children && this.root.children.length > 0) { - // Make sure the current selected element is revealed - const selectedElement = this.tree.getSelection()[0]; - if (selectedElement && reveal) { - this.tree.reveal(selectedElement, 0.5); - } - - // Pass Focus to Viewer - this.tree.domFocus(); - } else if (this.tree) { - this.tree.domFocus(); - } else { - this.domNode.focus(); - } - } - - show(container: HTMLElement): void { - DOM.append(container, this.domNode); - } - - private create() { - this.domNode = DOM.$('.tree-explorer-viewlet-tree-view'); - this.messageElement = DOM.append(this.domNode, DOM.$('.message')); - this.treeContainer = DOM.append(this.domNode, DOM.$('.customview-tree')); - DOM.addClass(this.treeContainer, 'file-icon-themable-tree'); - DOM.addClass(this.treeContainer, 'show-file-icons'); - const focusTracker = this._register(DOM.trackFocus(this.domNode)); - this._register(focusTracker.onDidFocus(() => this.focused = true)); - this._register(focusTracker.onDidBlur(() => this.focused = false)); - } - - private createTree() { - const actionViewItemProvider = (action: IAction) => action instanceof MenuItemAction ? this.instantiationService.createInstance(ContextAwareMenuEntryActionViewItem, action) : undefined; - const treeMenus = this._register(this.instantiationService.createInstance(TreeMenus, this.id)); - this.treeLabels = this._register(this.instantiationService.createInstance(ResourceLabels, this)); - const dataSource = this.instantiationService.createInstance(TreeDataSource, this, (task: Promise) => this.progressService.withProgress({ location: this.id }, () => task)); - const aligner = new Aligner(this.themeService); - const renderer = this.instantiationService.createInstance(TreeRenderer, this.id, treeMenus, this.treeLabels, actionViewItemProvider, aligner); - const widgetAriaLabel = this._title; - - this.tree = this._register(this.instantiationService.createInstance(Tree, this.id, this.treeContainer, new TreeViewDelegate(), [renderer], - dataSource, { - identityProvider: new TreeViewIdentityProvider(), - accessibilityProvider: { - getAriaLabel(element: ITreeItem): string { - if (element.accessibilityInformation) { - return element.accessibilityInformation.label; - } - - return element.tooltip ? element.tooltip : element.label ? element.label.label : ''; - }, - getRole(element: ITreeItem): string | undefined { - return element.accessibilityInformation?.role; - }, - getWidgetAriaLabel(): string { - return widgetAriaLabel; - } - }, - keyboardNavigationLabelProvider: { - getKeyboardNavigationLabel: (item: ITreeItem) => { - return item.label ? item.label.label : (item.resourceUri ? basename(URI.revive(item.resourceUri)) : undefined); - } - }, - expandOnlyOnTwistieClick: (e: ITreeItem) => !!e.command, - collapseByDefault: (e: ITreeItem): boolean => { - return e.collapsibleState !== TreeItemCollapsibleState.Expanded; - }, - multipleSelectionSupport: this.canSelectMany, - overrideStyles: { - listBackground: this.viewLocation === ViewContainerLocation.Sidebar ? SIDE_BAR_BACKGROUND : PANEL_BACKGROUND - } - }) as WorkbenchAsyncDataTree); - aligner.tree = this.tree; - const actionRunner = new MultipleSelectionActionRunner(this.notificationService, () => this.tree!.getSelection()); - renderer.actionRunner = actionRunner; - - this.tree.contextKeyService.createKey(this.id, true); - this._register(this.tree.onContextMenu(e => this.onContextMenu(treeMenus, e, actionRunner))); - this._register(this.tree.onDidChangeSelection(e => this._onDidChangeSelection.fire(e.elements))); - this._register(this.tree.onDidChangeCollapseState(e => { - if (!e.node.element) { - return; - } - - const element: ITreeItem = Array.isArray(e.node.element.element) ? e.node.element.element[0] : e.node.element.element; - if (e.node.collapsed) { - this._onDidCollapseItem.fire(element); - } else { - this._onDidExpandItem.fire(element); - } - })); - this.tree.setInput(this.root).then(() => this.updateContentAreas()); - - const treeNavigator = new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false }); - this._register(treeNavigator); - this._register(treeNavigator.onDidOpenResource(e => { - if (!e.browserEvent) { - return; - } - const selection = this.tree!.getSelection(); - if ((selection.length === 1) && selection[0].command) { - this.commandService.executeCommand(selection[0].command.id, ...(selection[0].command.arguments || [])); - } - })); - } - - private onContextMenu(treeMenus: TreeMenus, treeEvent: ITreeContextMenuEvent, actionRunner: MultipleSelectionActionRunner): void { - const node: ITreeItem | null = treeEvent.element; - if (node === null) { - return; - } - const event: UIEvent = treeEvent.browserEvent; - - event.preventDefault(); - event.stopPropagation(); - - this.tree!.setFocus([node]); - const actions = treeMenus.getResourceContextActions(node); - if (!actions.length) { - return; - } - this.contextMenuService.showContextMenu({ - getAnchor: () => treeEvent.anchor, - - getActions: () => actions, - - getActionViewItem: (action) => { - const keybinding = this.keybindingService.lookupKeybinding(action.id); - if (keybinding) { - return new ActionViewItem(action, action, { label: true, keybinding: keybinding.getLabel() }); - } - return undefined; - }, - - onHide: (wasCancelled?: boolean) => { - if (wasCancelled) { - this.tree!.domFocus(); - } - }, - - getActionsContext: () => ({ $treeViewId: this.id, $treeItemHandle: node.handle }), - - actionRunner - }); - } - - protected updateMessage(): void { - if (this._message) { - this.showMessage(this._message); - } else if (!this.dataProvider) { - this.showMessage(noDataProviderMessage); - } else { - this.hideMessage(); - } - this.updateContentAreas(); - } - - private showMessage(message: string): void { - DOM.removeClass(this.messageElement, 'hide'); - this.resetMessageElement(); - this._messageValue = message; - if (!isFalsyOrWhitespace(this._message)) { - this.messageElement.textContent = this._messageValue; - } - this.layout(this._height, this._width); - } - - private hideMessage(): void { - this.resetMessageElement(); - DOM.addClass(this.messageElement, 'hide'); - this.layout(this._height, this._width); - } - - private resetMessageElement(): void { - DOM.clearNode(this.messageElement); - } - - private _height: number = 0; - private _width: number = 0; - layout(height: number, width: number) { - if (height && width) { - this._height = height; - this._width = width; - const treeHeight = height - DOM.getTotalHeight(this.messageElement); - this.treeContainer.style.height = treeHeight + 'px'; - if (this.tree) { - this.tree.layout(treeHeight, width); - } - } - } - - getOptimalWidth(): number { - if (this.tree) { - const parentNode = this.tree.getHTMLElement(); - const childNodes = ([] as HTMLElement[]).slice.call(parentNode.querySelectorAll('.outline-item-label > a')); - return DOM.getLargestChildWidth(parentNode, childNodes); - } - return 0; - } - - async refresh(elements?: ITreeItem[]): Promise { - if (this.dataProvider && this.tree) { - if (this.refreshing) { - await Event.toPromise(this._onDidCompleteRefresh.event); - } - if (!elements) { - elements = [this.root]; - // remove all waiting elements to refresh if root is asked to refresh - this.elementsToRefresh = []; - } - for (const element of elements) { - element.children = undefined; // reset children - } - if (this.isVisible) { - return this.doRefresh(elements); - } else { - if (this.elementsToRefresh.length) { - const seen: Set = new Set(); - this.elementsToRefresh.forEach(element => seen.add(element.handle)); - for (const element of elements) { - if (!seen.has(element.handle)) { - this.elementsToRefresh.push(element); - } - } - } else { - this.elementsToRefresh.push(...elements); - } - } - } - return undefined; - } - - async expand(itemOrItems: ITreeItem | ITreeItem[]): Promise { - const tree = this.tree; - if (tree) { - itemOrItems = Array.isArray(itemOrItems) ? itemOrItems : [itemOrItems]; - await Promise.all(itemOrItems.map(element => { - return tree.expand(element, false); - })); - } - } - - setSelection(items: ITreeItem[]): void { - if (this.tree) { - this.tree.setSelection(items); - } - } - - setFocus(item: ITreeItem): void { - if (this.tree) { - this.focus(); - this.tree.setFocus([item]); - } - } - - async reveal(item: ITreeItem): Promise { - if (this.tree) { - return this.tree.reveal(item); - } - } - - private refreshing: boolean = false; - private async doRefresh(elements: ITreeItem[]): Promise { - const tree = this.tree; - if (tree && this.visible) { - this.refreshing = true; - await Promise.all(elements.map(element => tree.updateChildren(element, true, true))); - this.refreshing = false; - this._onDidCompleteRefresh.fire(); - this.updateContentAreas(); - if (this.focused) { - this.focus(false); - } - } - } - - private updateContentAreas(): void { - const isTreeEmpty = !this.root.children || this.root.children.length === 0; - // Hide tree container only when there is a message and tree is empty and not refreshing - if (this._messageValue && isTreeEmpty && !this.refreshing) { - DOM.addClass(this.treeContainer, 'hide'); - this.domNode.setAttribute('tabindex', '0'); - } else { - DOM.removeClass(this.treeContainer, 'hide'); - this.domNode.removeAttribute('tabindex'); - } - } -} - -class TreeViewIdentityProvider implements IIdentityProvider { - getId(element: ITreeItem): { toString(): string; } { - return element.handle; - } -} - -class TreeViewDelegate implements IListVirtualDelegate { - - getHeight(element: ITreeItem): number { - return TreeRenderer.ITEM_HEIGHT; - } - - getTemplateId(element: ITreeItem): string { - return TreeRenderer.TREE_TEMPLATE_ID; - } -} - -class TreeDataSource implements IAsyncDataSource { - - constructor( - private treeView: ITreeView, - private withProgress: (task: Promise) => Promise - ) { - } - - hasChildren(element: ITreeItem): boolean { - return !!this.treeView.dataProvider && (element.collapsibleState !== TreeItemCollapsibleState.None); - } - - async getChildren(element: ITreeItem): Promise { - if (this.treeView.dataProvider) { - return this.withProgress(this.treeView.dataProvider.getChildren(element)); - } - return []; - } -} - -// todo@joh,sandy make this proper and contributable from extensions -registerThemingParticipant((theme, collector) => { - - const matchBackgroundColor = theme.getColor(listFilterMatchHighlight); - if (matchBackgroundColor) { - collector.addRule(`.file-icon-themable-tree .monaco-list-row .content .monaco-highlighted-label .highlight { color: unset !important; background-color: ${matchBackgroundColor}; }`); - collector.addRule(`.monaco-tl-contents .monaco-highlighted-label .highlight { color: unset !important; background-color: ${matchBackgroundColor}; }`); - } - const matchBorderColor = theme.getColor(listFilterMatchHighlightBorder); - if (matchBorderColor) { - collector.addRule(`.file-icon-themable-tree .monaco-list-row .content .monaco-highlighted-label .highlight { color: unset !important; border: 1px dotted ${matchBorderColor}; box-sizing: border-box; }`); - collector.addRule(`.monaco-tl-contents .monaco-highlighted-label .highlight { color: unset !important; border: 1px dotted ${matchBorderColor}; box-sizing: border-box; }`); - } - const link = theme.getColor(textLinkForeground); - if (link) { - collector.addRule(`.tree-explorer-viewlet-tree-view > .message a { color: ${link}; }`); - } - const focusBorderColor = theme.getColor(focusBorder); - if (focusBorderColor) { - collector.addRule(`.tree-explorer-viewlet-tree-view > .message a:focus { outline: 1px solid ${focusBorderColor}; outline-offset: -1px; }`); - } - const codeBackground = theme.getColor(textCodeBlockBackground); - if (codeBackground) { - collector.addRule(`.tree-explorer-viewlet-tree-view > .message code { background-color: ${codeBackground}; }`); - } -}); - -interface ITreeExplorerTemplateData { - elementDisposable: IDisposable; - container: HTMLElement; - resourceLabel: IResourceLabel; - icon: HTMLElement; - actionBar: ActionBar; -} - -class TreeRenderer extends Disposable implements ITreeRenderer { - static readonly ITEM_HEIGHT = 22; - static readonly TREE_TEMPLATE_ID = 'treeExplorer'; - - private _actionRunner: MultipleSelectionActionRunner | undefined; - - constructor( - private treeViewId: string, - private menus: TreeMenus, - private labels: ResourceLabels, - private actionViewItemProvider: IActionViewItemProvider, - private aligner: Aligner, - @IThemeService private readonly themeService: IThemeService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @ILabelService private readonly labelService: ILabelService - ) { - super(); - } - - get templateId(): string { - return TreeRenderer.TREE_TEMPLATE_ID; - } - - set actionRunner(actionRunner: MultipleSelectionActionRunner) { - this._actionRunner = actionRunner; - } - - renderTemplate(container: HTMLElement): ITreeExplorerTemplateData { - DOM.addClass(container, 'custom-view-tree-node-item'); - - const icon = DOM.append(container, DOM.$('.custom-view-tree-node-item-icon')); - - const resourceLabel = this.labels.create(container, { supportHighlights: true }); - const actionsContainer = DOM.append(resourceLabel.element, DOM.$('.actions')); - const actionBar = new ActionBar(actionsContainer, { - actionViewItemProvider: this.actionViewItemProvider - }); - - return { resourceLabel, icon, actionBar, container, elementDisposable: Disposable.None }; - } - - renderElement(element: ITreeNode, index: number, templateData: ITreeExplorerTemplateData): void { - templateData.elementDisposable.dispose(); - const node = element.element; - const resource = node.resourceUri ? URI.revive(node.resourceUri) : null; - const treeItemLabel: ITreeItemLabel | undefined = node.label ? node.label : resource ? { label: basename(resource) } : undefined; - const description = isString(node.description) ? node.description : resource && node.description === true ? this.labelService.getUriLabel(dirname(resource), { relative: true }) : undefined; - const label = treeItemLabel ? treeItemLabel.label : undefined; - const matches = (treeItemLabel && treeItemLabel.highlights && label) ? treeItemLabel.highlights.map(([start, end]) => { - if (start < 0) { - start = label.length + start; - } - if (end < 0) { - end = label.length + end; - } - if ((start >= label.length) || (end > label.length)) { - return ({ start: 0, end: 0 }); - } - if (start > end) { - const swap = start; - start = end; - end = swap; - } - return ({ start, end }); - }) : undefined; - const icon = this.themeService.getColorTheme().type === LIGHT ? node.icon : node.iconDark; - const iconUrl = icon ? URI.revive(icon) : null; - const title = node.tooltip ? node.tooltip : resource ? undefined : label; - - // reset - templateData.actionBar.clear(); - - if (resource || this.isFileKindThemeIcon(node.themeIcon)) { - const fileDecorations = this.configurationService.getValue<{ colors: boolean, badges: boolean }>('explorer.decorations'); - templateData.resourceLabel.setResource({ name: label, description, resource: resource ? resource : URI.parse('missing:_icon_resource') }, { fileKind: this.getFileKind(node), title, hideIcon: !!iconUrl, fileDecorations, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches: matches ? matches : createMatches(element.filterData) }); - } else { - templateData.resourceLabel.setResource({ name: label, description }, { title, hideIcon: true, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches: matches ? matches : createMatches(element.filterData) }); - } - - templateData.icon.title = title ? title : ''; - - if (iconUrl) { - templateData.icon.className = 'custom-view-tree-node-item-icon'; - templateData.icon.style.backgroundImage = DOM.asCSSUrl(iconUrl); - - } else { - let iconClass: string | undefined; - if (node.themeIcon && !this.isFileKindThemeIcon(node.themeIcon)) { - iconClass = ThemeIcon.asClassName(node.themeIcon); - } - templateData.icon.className = iconClass ? `custom-view-tree-node-item-icon ${iconClass}` : ''; - templateData.icon.style.backgroundImage = ''; - } - - templateData.actionBar.context = { $treeViewId: this.treeViewId, $treeItemHandle: node.handle }; - templateData.actionBar.push(this.menus.getResourceActions(node), { icon: true, label: false }); - if (this._actionRunner) { - templateData.actionBar.actionRunner = this._actionRunner; - } - this.setAlignment(templateData.container, node); - templateData.elementDisposable = (this.themeService.onDidFileIconThemeChange(() => this.setAlignment(templateData.container, node))); - } - - private setAlignment(container: HTMLElement, treeItem: ITreeItem) { - DOM.toggleClass(container.parentElement!, 'align-icon-with-twisty', this.aligner.alignIconWithTwisty(treeItem)); - } - - private isFileKindThemeIcon(icon: ThemeIcon | undefined): boolean { - if (icon) { - return icon.id === FileThemeIcon.id || icon.id === FolderThemeIcon.id; - } else { - return false; - } - } - - private getFileKind(node: ITreeItem): FileKind { - if (node.themeIcon) { - switch (node.themeIcon.id) { - case FileThemeIcon.id: - return FileKind.FILE; - case FolderThemeIcon.id: - return FileKind.FOLDER; - } - } - return node.collapsibleState === TreeItemCollapsibleState.Collapsed || node.collapsibleState === TreeItemCollapsibleState.Expanded ? FileKind.FOLDER : FileKind.FILE; - } - - disposeElement(resource: ITreeNode, index: number, templateData: ITreeExplorerTemplateData): void { - templateData.elementDisposable.dispose(); - } - - disposeTemplate(templateData: ITreeExplorerTemplateData): void { - templateData.resourceLabel.dispose(); - templateData.actionBar.dispose(); - templateData.elementDisposable.dispose(); - } -} - -class Aligner extends Disposable { - private _tree: WorkbenchAsyncDataTree | undefined; - - constructor(private themeService: IThemeService) { - super(); - } - - set tree(tree: WorkbenchAsyncDataTree) { - this._tree = tree; - } - - public alignIconWithTwisty(treeItem: ITreeItem): boolean { - if (treeItem.collapsibleState !== TreeItemCollapsibleState.None) { - return false; - } - if (!this.hasIcon(treeItem)) { - return false; - } - - if (this._tree) { - const parent: ITreeItem = this._tree.getParentElement(treeItem) || this._tree.getInput(); - if (this.hasIcon(parent)) { - return false; - } - return !!parent.children && parent.children.every(c => c.collapsibleState === TreeItemCollapsibleState.None || !this.hasIcon(c)); - } else { - return false; - } - } - - private hasIcon(node: ITreeItem): boolean { - const icon = this.themeService.getColorTheme().type === LIGHT ? node.icon : node.iconDark; - if (icon) { - return true; - } - if (node.resourceUri || node.themeIcon) { - const fileIconTheme = this.themeService.getFileIconTheme(); - const isFolder = node.themeIcon ? node.themeIcon.id === FolderThemeIcon.id : node.collapsibleState !== TreeItemCollapsibleState.None; - if (isFolder) { - return fileIconTheme.hasFileIcons && fileIconTheme.hasFolderIcons; - } - return fileIconTheme.hasFileIcons; - } - return false; - } -} - -class MultipleSelectionActionRunner extends ActionRunner { - - constructor(notificationService: INotificationService, private getSelectedResources: (() => ITreeItem[])) { - super(); - this._register(this.onDidRun(e => { - if (e.error) { - notificationService.error(localize('command-error', 'Error running command {1}: {0}. This is likely caused by the extension that contributes {1}.', e.error.message, e.action.id)); - } - })); - } - - runAction(action: IAction, context: TreeViewItemHandleArg): Promise { - const selection = this.getSelectedResources(); - let selectionHandleArgs: TreeViewItemHandleArg[] | undefined = undefined; - let actionInSelected: boolean = false; - if (selection.length > 1) { - selectionHandleArgs = selection.map(selected => { - if (selected.handle === context.$treeItemHandle) { - actionInSelected = true; - } - return { $treeViewId: context.$treeViewId, $treeItemHandle: selected.handle }; - }); - } - - if (!actionInSelected) { - selectionHandleArgs = undefined; - } - - return action.run(...[context, selectionHandleArgs]); - } -} - -class TreeMenus extends Disposable implements IDisposable { - - constructor( - private id: string, - @IContextKeyService private readonly contextKeyService: IContextKeyService, - @IMenuService private readonly menuService: IMenuService, - @IContextMenuService private readonly contextMenuService: IContextMenuService - ) { - super(); - } - - getResourceActions(element: ITreeItem): IAction[] { - return this.getActions(MenuId.ViewItemContext, { key: 'viewItem', value: element.contextValue }).primary; - } - - getResourceContextActions(element: ITreeItem): IAction[] { - return this.getActions(MenuId.ViewItemContext, { key: 'viewItem', value: element.contextValue }).secondary; - } - - private getActions(menuId: MenuId, context: { key: string, value?: string }): { primary: IAction[]; secondary: IAction[]; } { - const contextKeyService = this.contextKeyService.createScoped(); - contextKeyService.createKey('view', this.id); - contextKeyService.createKey(context.key, context.value); - - const menu = this.menuService.createMenu(menuId, contextKeyService); - const primary: IAction[] = []; - const secondary: IAction[] = []; - const result = { primary, secondary }; - createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => /^inline/.test(g)); - - menu.dispose(); - contextKeyService.dispose(); - - return result; - } -} - -export class CustomTreeView extends TreeView { - - private activated: boolean = false; - - constructor( - id: string, - title: string, - @IThemeService themeService: IThemeService, - @IInstantiationService instantiationService: IInstantiationService, - @ICommandService commandService: ICommandService, - @IConfigurationService configurationService: IConfigurationService, - @IProgressService progressService: IProgressService, - @IContextMenuService contextMenuService: IContextMenuService, - @IKeybindingService keybindingService: IKeybindingService, - @INotificationService notificationService: INotificationService, - @IViewDescriptorService viewDescriptorService: IViewDescriptorService, - @IContextKeyService contextKeyService: IContextKeyService, - @IExtensionService private readonly extensionService: IExtensionService, - ) { - super(id, title, themeService, instantiationService, commandService, configurationService, progressService, contextMenuService, keybindingService, notificationService, viewDescriptorService, contextKeyService); - } - - setVisibility(isVisible: boolean): void { - super.setVisibility(isVisible); - if (this.visible) { - this.activate(); - } - } - - private activate() { - if (!this.activated) { - this.progressService.withProgress({ location: this.id }, () => this.extensionService.activateByEvent(`onView:${this.id}`)) - .then(() => timeout(2000)) - .then(() => { - this.updateMessage(); - }); - this.activated = true; - } - } -} diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index d617a9a2406..4c94254d513 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -40,7 +40,7 @@ import { parseLinkedText } from 'vs/base/common/linkedText'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { Button } from 'vs/base/browser/ui/button/button'; import { Link } from 'vs/platform/opener/browser/link'; -import { CompositeDragAndDropObserver, DragAndDropObserver } from 'vs/workbench/browser/dnd'; +import { CompositeDragAndDropObserver, DragAndDropObserver, toggleDropEffect } from 'vs/workbench/browser/dnd'; import { Orientation } from 'vs/base/browser/ui/sash/sash'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { CompositeProgressIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; @@ -450,7 +450,7 @@ export abstract class ViewPane extends Pane implements IView { private setActions(): void { if (this.toolbar) { - this.toolbar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions()))(); + this.toolbar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions())); this.toolbar.context = this.getActionsContext(); } } @@ -924,6 +924,11 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { } }, + onDragOver: (e) => { + if (this.panes.length === 0) { + toggleDropEffect(e.eventData.dataTransfer, 'move', overlay !== undefined); + } + }, onDragLeave: (e) => { overlay?.dispose(); overlay = undefined; @@ -1035,14 +1040,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { } } - const viewToggleActions = this.viewContainerModel.activeViewDescriptors.map(viewDescriptor => ({ - id: `${viewDescriptor.id}.toggleVisibility`, - label: viewDescriptor.name, - checked: this.viewContainerModel.isVisible(viewDescriptor.id), - enabled: viewDescriptor.canToggleVisibility && (!this.viewContainerModel.isVisible(viewDescriptor.id) || this.viewContainerModel.visibleViewDescriptors.length > 1), - run: () => this.toggleViewVisibility(viewDescriptor.id) - })); - + const viewToggleActions = this.getViewsVisibilityActions(); if (result.length && viewToggleActions.length) { result.push(new Separator()); } @@ -1068,6 +1066,16 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { return []; } + getViewsVisibilityActions(): IAction[] { + return this.viewContainerModel.activeViewDescriptors.map(viewDescriptor => ({ + id: `${viewDescriptor.id}.toggleVisibility`, + label: viewDescriptor.name, + checked: this.viewContainerModel.isVisible(viewDescriptor.id), + enabled: viewDescriptor.canToggleVisibility && (!this.viewContainerModel.isVisible(viewDescriptor.id) || this.viewContainerModel.visibleViewDescriptors.length > 1), + run: () => this.toggleViewVisibility(viewDescriptor.id) + })); + } + getActionViewItem(action: IAction): IActionViewItem | undefined { if (this.isViewMergedWithContainer()) { return this.paneItems[0].pane.getActionViewItem(action); @@ -1363,6 +1371,9 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { } } }, + onDragOver: (e) => { + toggleDropEffect(e.eventData.dataTransfer, 'move', overlay !== undefined); + }, onDragLeave: (e) => { overlay?.dispose(); overlay = undefined; diff --git a/src/vs/workbench/browser/parts/views/viewsService.ts b/src/vs/workbench/browser/parts/views/viewsService.ts index 7deee848574..b7ae7fe9eb9 100644 --- a/src/vs/workbench/browser/parts/views/viewsService.ts +++ b/src/vs/workbench/browser/parts/views/viewsService.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./media/views'; import { Disposable, IDisposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IViewDescriptorService, ViewContainer, IViewDescriptor, IView, ViewContainerLocation, IViewsService, IViewPaneContainer, getVisbileViewContextKey } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -159,7 +158,7 @@ export class ViewsService extends Disposable implements IViewsService { constructor() { super({ id: viewDescriptor.focusCommand ? viewDescriptor.focusCommand.id : `${viewDescriptor.id}.focus`, - title: { original: `Focus on ${viewDescriptor.name} View`, value: localize('focus view', "Focus on {0} View", viewDescriptor.name) }, + title: { original: `Focus on ${viewDescriptor.name} View`, value: localize({ key: 'focus view', comment: ['{0} indicates the name of the view to be focused.'] }, "Focus on {0} View", viewDescriptor.name) }, category: composite ? composite.name : localize('view category', "View"), menu: [{ id: MenuId.CommandPalette, @@ -276,6 +275,11 @@ export class ViewsService extends Disposable implements IViewsService { return viewContainerId ? this.viewDescriptorService.getViewContainerById(viewContainerId) : null; } + getActiveViewPaneContainerWithId(viewContainerId: string): IViewPaneContainer | null { + const viewContainer = this.viewDescriptorService.getViewContainerById(viewContainerId); + return viewContainer ? this.getActiveViewPaneContainer(viewContainer) : null; + } + async openViewContainer(id: string, focus?: boolean): Promise { const viewContainer = this.viewDescriptorService.getViewContainerById(id); if (viewContainer) { diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index 8335c7352c3..47b8f051583 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -139,4 +139,8 @@ export abstract class FilterViewPaneContainer extends ViewPaneContainer { } abstract getTitle(): string; + + getViewsVisibilityActions(): IAction[] { + return []; + } } diff --git a/src/vs/workbench/browser/viewlet.ts b/src/vs/workbench/browser/viewlet.ts index 9c4d5a10f01..91431c7e3de 100644 --- a/src/vs/workbench/browser/viewlet.ts +++ b/src/vs/workbench/browser/viewlet.ts @@ -27,6 +27,8 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { PaneComposite } from 'vs/workbench/browser/panecomposite'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ContextSubMenu } from 'vs/base/browser/contextmenu'; +import { Event } from 'vs/base/common/event'; export abstract class Viewlet extends PaneComposite implements IViewlet { @@ -43,6 +45,10 @@ export abstract class Viewlet extends PaneComposite implements IViewlet { @IConfigurationService protected configurationService: IConfigurationService ) { super(id, viewPaneContainer, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); + this._register(Event.any(viewPaneContainer.onDidAddViews, viewPaneContainer.onDidRemoveViews)(() => { + // Update title area since there is no better way to update secondary actions + this.updateTitleArea(); + })); } getContextMenuActions(): IAction[] { @@ -60,6 +66,24 @@ export abstract class Viewlet extends PaneComposite implements IViewlet { run: () => this.layoutService.setSideBarHidden(true) }]; } + + getSecondaryActions(): IAction[] { + const viewSecondaryActions = this.viewPaneContainer.getViewsVisibilityActions(); + const secondaryActions = this.viewPaneContainer.getSecondaryActions(); + if (viewSecondaryActions.length <= 1) { + return secondaryActions; + } + + if (secondaryActions.length === 0) { + return viewSecondaryActions; + } + + return [ + new ContextSubMenu(nls.localize('views', "Views"), viewSecondaryActions), + new Separator(), + ...secondaryActions + ]; + } } /** diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 980ba375b1b..0462617196b 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -19,7 +19,7 @@ import { RemoteAgentService } from 'vs/workbench/services/remote/browser/remoteA import { RemoteAuthorityResolverService } from 'vs/platform/remote/browser/remoteAuthorityResolverService'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { IFileService } from 'vs/platform/files/common/files'; +import { IFileService, IFileSystemProvider } from 'vs/platform/files/common/files'; import { FileService } from 'vs/platform/files/common/fileService'; import { Schemas } from 'vs/base/common/network'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -43,14 +43,13 @@ import { registerWindowDriver } from 'vs/platform/driver/browser/driver'; import { BufferLogService } from 'vs/platform/log/common/bufferLog'; import { FileLogService } from 'vs/platform/log/common/fileLogService'; import { toLocalISOString } from 'vs/base/common/date'; -import { IndexedDBLogProvider } from 'vs/workbench/services/log/browser/indexedDBLogProvider'; -import { InMemoryLogProvider } from 'vs/workbench/services/log/common/inMemoryLogProvider'; import { isWorkspaceToOpen, isFolderToOpen } from 'vs/platform/windows/common/windows'; import { getWorkspaceIdentifier } from 'vs/workbench/services/workspaces/browser/workspaces'; import { coalesce } from 'vs/base/common/arrays'; import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider'; import { WebResourceIdentityService, IResourceIdentityService } from 'vs/platform/resource/common/resourceIdentityService'; import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IndexedDB, INDEXEDDB_LOGS_OBJECT_STORE, INDEXEDDB_USERDATA_OBJECT_STORE } from 'vs/platform/files/browser/indexedDBFileSystemProvider'; class BrowserMain extends Disposable { @@ -160,7 +159,7 @@ class BrowserMain extends Disposable { serviceCollection.set(IWorkbenchEnvironmentService, environmentService); // Product - const productService: IProductService = { _serviceBrand: undefined, ...product }; + const productService: IProductService = { _serviceBrand: undefined, ...product, ...this.configuration.productConfiguration }; serviceCollection.set(IProductService, productService); // Remote @@ -178,7 +177,7 @@ class BrowserMain extends Disposable { // Files const fileService = this._register(new FileService(logService)); serviceCollection.set(IFileService, fileService); - this.registerFileSystemProviders(environmentService, fileService, remoteAgentService, logService, logsPath); + await this.registerFileSystemProviders(environmentService, fileService, remoteAgentService, logService, logsPath); // Long running services (workspace, config, storage) const services = await Promise.all([ @@ -205,24 +204,21 @@ class BrowserMain extends Disposable { return { serviceCollection, logService, storageService: services[1] }; } - private registerFileSystemProviders(environmentService: IWorkbenchEnvironmentService, fileService: IFileService, remoteAgentService: IRemoteAgentService, logService: BufferLogService, logsPath: URI): void { + private async registerFileSystemProviders(environmentService: IWorkbenchEnvironmentService, fileService: IFileService, remoteAgentService: IRemoteAgentService, logService: BufferLogService, logsPath: URI): Promise { + const indexedDB = new IndexedDB(); // Logger (async () => { - if (browser.isEdge) { - fileService.registerProvider(logsPath.scheme, new InMemoryLogProvider(logsPath.scheme)); + let indexedDBLogProvider: IFileSystemProvider | null = null; + try { + indexedDBLogProvider = await indexedDB.createFileSystemProvider(logsPath.scheme, INDEXEDDB_LOGS_OBJECT_STORE); + } catch (error) { + console.error(error); + } + if (indexedDBLogProvider) { + fileService.registerProvider(logsPath.scheme, indexedDBLogProvider); } else { - try { - const indexedDBLogProvider = new IndexedDBLogProvider(logsPath.scheme); - await indexedDBLogProvider.database; - - fileService.registerProvider(logsPath.scheme, indexedDBLogProvider); - } catch (error) { - logService.info('Error while creating indexedDB log provider. Falling back to in-memory log provider.'); - logService.error(error); - - fileService.registerProvider(logsPath.scheme, new InMemoryLogProvider(logsPath.scheme)); - } + fileService.registerProvider(logsPath.scheme, new InMemoryFileSystemProvider()); } logService.logger = new MultiplexLogService(coalesce([ @@ -250,8 +246,19 @@ class BrowserMain extends Disposable { // User data if (!this.configuration.userDataProvider) { - this.configuration.userDataProvider = this._register(new InMemoryFileSystemProvider()); + let indexedDBUserDataProvider: IFileSystemProvider | null = null; + try { + indexedDBUserDataProvider = await indexedDB.createFileSystemProvider(Schemas.userData, INDEXEDDB_USERDATA_OBJECT_STORE); + } catch (error) { + console.error(error); + } + if (indexedDBUserDataProvider) { + this.configuration.userDataProvider = indexedDBUserDataProvider; + } else { + this.configuration.userDataProvider = new InMemoryFileSystemProvider(); + } } + fileService.registerProvider(Schemas.userData, this.configuration.userDataProvider); } diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts index 539765cfe19..b3601db90a7 100644 --- a/src/vs/workbench/browser/workbench.ts +++ b/src/vs/workbench/browser/workbench.ts @@ -20,9 +20,7 @@ import { getSingletonServiceDescriptors } from 'vs/platform/instantiation/common import { Position, Parts, IWorkbenchLayoutService, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; import { IStorageService, WillSaveStateReason, StorageScope } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { LifecyclePhase, ILifecycleService, WillShutdownEvent, BeforeShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -32,8 +30,6 @@ import { NotificationsAlerts } from 'vs/workbench/browser/parts/notifications/no import { NotificationsStatus } from 'vs/workbench/browser/parts/notifications/notificationsStatus'; import { registerNotificationCommands } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; import { NotificationsToasts } from 'vs/workbench/browser/parts/notifications/notificationsToasts'; -import { IEditorService, IResourceEditorInputType } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { setARIAContainer } from 'vs/base/browser/ui/aria/aria'; import { readFontInfo, restoreFontInfo, serializeFontInfo } from 'vs/editor/browser/config/configuration'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; @@ -44,9 +40,6 @@ import { coalesce } from 'vs/base/common/arrays'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { Layout } from 'vs/workbench/browser/layout'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { Extensions as PanelExtensions, PanelRegistry } from 'vs/workbench/browser/panel'; -import { IViewDescriptorService, ViewContainerLocation, IViewsService } from 'vs/workbench/common/views'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export class Workbench extends Layout { @@ -146,7 +139,8 @@ export class Workbench extends Layout { this.initLayout(accessor); // Registries - this.startRegistries(accessor); + Registry.as(WorkbenchExtensions.Workbench).start(accessor); + Registry.as(EditorExtensions.EditorInputFactories).start(accessor); // Context Keys this._register(instantiationService.createInstance(WorkbenchContextKeysHandler)); @@ -165,11 +159,7 @@ export class Workbench extends Layout { // Restore try { - await this.restoreWorkbench( - accessor.get(IEditorService), accessor.get(IEditorGroupsService), accessor.get(IExtensionService), accessor.get(IViewDescriptorService), - accessor.get(IViewsService), accessor.get(IViewletService), accessor.get(IPanelService), - accessor.get(ILogService), lifecycleService - ); + await this.restoreWorkbench(accessor.get(ILogService), lifecycleService); } catch (error) { onUnexpectedError(error); } @@ -220,11 +210,6 @@ export class Workbench extends Layout { return instantiationService; } - private startRegistries(accessor: ServicesAccessor): void { - Registry.as(WorkbenchExtensions.Workbench).start(accessor); - Registry.as(EditorExtensions.EditorInputFactories).start(accessor); - } - private registerListeners( lifecycleService: ILifecycleService, storageService: IStorageService, @@ -404,137 +389,15 @@ export class Workbench extends Layout { } private async restoreWorkbench( - editorService: IEditorService, - editorGroupService: IEditorGroupsService, - extensionService: IExtensionService, - viewDescriptorService: IViewDescriptorService, - viewsService: IViewsService, - viewletService: IViewletService, - panelService: IPanelService, logService: ILogService, lifecycleService: ILifecycleService ): Promise { - const restorePromises: Promise[] = []; - - // Restore editors - restorePromises.push((async () => { - mark('willRestoreEditors'); - - // first ensure the editor part is restored - await editorGroupService.whenRestored; - - // then see for editors to open as instructed - let editors: IResourceEditorInputType[]; - if (Array.isArray(this.state.editor.editorsToOpen)) { - editors = this.state.editor.editorsToOpen; - } else { - editors = await this.state.editor.editorsToOpen; - } - - if (editors.length) { - await editorService.openEditors(editors); - } - - mark('didRestoreEditors'); - })()); - - if (this.state.views.defaults?.length) { - mark('willOpenDefaultViews'); - - const defaultViews = [...this.state.views.defaults]; - - let locationsRestored: boolean[] = []; - - async function tryOpenView(viewId: string, index: number) { - const location = viewDescriptorService.getViewLocationById(viewId); - // eslint-disable-next-line eqeqeq - if (location != null) { - // If the view is in the same location that has already been restored, remove it and continue - if (locationsRestored[location]) { - defaultViews.splice(index, 1); - - return; - } - - const view = await viewsService.openView(viewId); - if (view) { - locationsRestored[location] = true; - defaultViews.splice(index, 1); - } - } - } - - let i = -1; - for (const viewId of defaultViews) { - await tryOpenView(viewId, ++i); - } - - // If we still have views left over, wait until all extensions have been registered and try again - if (defaultViews.length) { - await extensionService.whenInstalledExtensionsRegistered(); - - let i = -1; - for (const viewId of defaultViews) { - await tryOpenView(viewId, ++i); - } - } - - // If we opened a view in the sidebar, stop any restore there - if (locationsRestored[ViewContainerLocation.Sidebar]) { - this.state.sideBar.viewletToRestore = undefined; - } - - // If we opened a view in the panel, stop any restore there - if (locationsRestored[ViewContainerLocation.Panel]) { - this.state.panel.panelToRestore = undefined; - } - - mark('didOpenDefaultViews'); - } - - // Restore Sidebar - if (this.state.sideBar.viewletToRestore) { - restorePromises.push((async () => { - mark('willRestoreViewlet'); - - const viewlet = await viewletService.openViewlet(this.state.sideBar.viewletToRestore); - if (!viewlet) { - await viewletService.openViewlet(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)?.id); // fallback to default viewlet as needed - } - - mark('didRestoreViewlet'); - })()); - } - - // Restore Panel - if (this.state.panel.panelToRestore) { - restorePromises.push((async () => { - mark('willRestorePanel'); - - const panel = await panelService.openPanel(this.state.panel.panelToRestore!); - if (!panel) { - await panelService.openPanel(Registry.as(PanelExtensions.Panels).getDefaultPanelId()); // fallback to default panel as needed - } - - mark('didRestorePanel'); - })()); - } - - // Restore Zen Mode - if (this.state.zenMode.restore) { - this.toggleZenMode(false, true); - } - - // Restore Editor Center Mode - if (this.state.editor.restoreCentered) { - this.centerEditorLayout(true, true); - } // Emit a warning after 10s if restore does not complete const restoreTimeoutHandle = setTimeout(() => logService.warn('Workbench did not finish loading in 10 seconds, that might be a problem that should be reported.'), 10000); try { - await Promise.all(restorePromises); + await super.restoreWorkbenchLayout(); clearTimeout(restoreTimeoutHandle); } catch (error) { @@ -551,6 +414,10 @@ export class Workbench extends Layout { // Telemetry: startup metrics mark('didStartWorkbench'); + + // Perf reporting (devtools) + performance.mark('workbench-end'); + performance.measure('perf: workbench create & restore', 'workbench-start', 'workbench-end'); } } } diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 22caaaa4e86..16d38a9a18f 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -468,24 +468,14 @@ export interface IEditorInput extends IDisposable { revert(group: GroupIdentifier, options?: IRevertOptions): Promise; /** - * Called to determine how to handle a resource that is moved that matches + * Called to determine how to handle a resource that is renamed that matches * the editors resource (or is a child of). * * Implementors are free to not implement this method to signal no intent * to participate. If an editor is returned though, it will replace the * current one with that editor and optional options. */ - move(group: GroupIdentifier, target: URI): IMoveResult | undefined; - - /** - * Called when this input was closed in a group. The second parameter - * is a hint wether the editor is still opened in other groups. This - * may include normal editors as well as side-by-side or diff editors. - * - * Subclasses can override what should happen. By default, an editor - * input will dispose when it is closed. - */ - close(group: GroupIdentifier, openedInOtherGroups: boolean): void; + rename(group: GroupIdentifier, target: URI): IMoveResult | undefined; /** * Subclasses can set this to false if it does not make sense to split the editor input. @@ -592,20 +582,10 @@ export abstract class EditorInput extends Disposable implements IEditorInput { async revert(group: GroupIdentifier, options?: IRevertOptions): Promise { } - move(group: GroupIdentifier, target: URI): IMoveResult | undefined { + rename(group: GroupIdentifier, target: URI): IMoveResult | undefined { return undefined; } - close(group: GroupIdentifier, openedInOtherGroups: boolean): void { - // TODO@ben revisit this behaviour, should just dispose by default after adoption - // However this requires that we never open the same input in multiple editor groups - // which today we cannot enforce (e.g. when opening the same editor in an empty - // group via quick open editor history) - if (!openedInOtherGroups) { - this.dispose(); - } - } - supportsSplitEditor(): boolean { return true; } @@ -669,10 +649,16 @@ export interface IModeSupport { export interface IFileEditorInput extends IEditorInput, IEncodingSupport, IModeSupport { /** - * Gets the resource this editor is about. + * Gets the resource this file input is about. */ readonly resource: URI; + /** + * Gets the label of the editor. In most cases this will + * be identical to the resource. + */ + readonly label: URI; + /** * Sets the preferred label to use for this file input. */ @@ -700,7 +686,7 @@ export interface IFileEditorInput extends IEditorInput, IEncodingSupport, IModeS } /** - * Side by side editor inputs that have a master and details side. + * Side by side editor inputs that have a primary and secondary side. */ export class SideBySideEditorInput extends EditorInput { @@ -709,24 +695,46 @@ export class SideBySideEditorInput extends EditorInput { constructor( protected readonly name: string | undefined, private readonly description: string | undefined, - private readonly _details: EditorInput, - private readonly _master: EditorInput + private readonly _secondary: EditorInput, + private readonly _primary: EditorInput ) { super(); this.registerListeners(); } + private registerListeners(): void { + + // When the primary or secondary input gets disposed, dispose this diff editor input + const onceSecondaryDisposed = Event.once(this.secondary.onDispose); + this._register(onceSecondaryDisposed(() => { + if (!this.isDisposed()) { + this.dispose(); + } + })); + + const oncePrimaryDisposed = Event.once(this.primary.onDispose); + this._register(oncePrimaryDisposed(() => { + if (!this.isDisposed()) { + this.dispose(); + } + })); + + // Reemit some events from the primary side to the outside + this._register(this.primary.onDidChangeDirty(() => this._onDidChangeDirty.fire())); + this._register(this.primary.onDidChangeLabel(() => this._onDidChangeLabel.fire())); + } + get resource(): URI | undefined { return undefined; } - get master(): EditorInput { - return this._master; + get primary(): EditorInput { + return this._primary; } - get details(): EditorInput { - return this._details; + get secondary(): EditorInput { + return this._secondary; } getTypeId(): string { @@ -735,7 +743,7 @@ export class SideBySideEditorInput extends EditorInput { getName(): string { if (!this.name) { - return localize('sideBySideLabels', "{0} - {1}", this._details.getName(), this._master.getName()); + return localize('sideBySideLabels', "{0} - {1}", this._secondary.getName(), this._primary.getName()); } return this.name; @@ -746,72 +754,46 @@ export class SideBySideEditorInput extends EditorInput { } isReadonly(): boolean { - return this.master.isReadonly(); + return this.primary.isReadonly(); } isUntitled(): boolean { - return this.master.isUntitled(); + return this.primary.isUntitled(); } isDirty(): boolean { - return this.master.isDirty(); + return this.primary.isDirty(); } isSaving(): boolean { - return this.master.isSaving(); + return this.primary.isSaving(); } save(group: GroupIdentifier, options?: ISaveOptions): Promise { - return this.master.save(group, options); + return this.primary.save(group, options); } saveAs(group: GroupIdentifier, options?: ISaveOptions): Promise { - return this.master.saveAs(group, options); + return this.primary.saveAs(group, options); } revert(group: GroupIdentifier, options?: IRevertOptions): Promise { - return this.master.revert(group, options); + return this.primary.revert(group, options); } getTelemetryDescriptor(): { [key: string]: unknown } { - const descriptor = this.master.getTelemetryDescriptor(); + const descriptor = this.primary.getTelemetryDescriptor(); return Object.assign(descriptor, super.getTelemetryDescriptor()); } - private registerListeners(): void { - - // When the details or master input gets disposed, dispose this diff editor input - const onceDetailsDisposed = Event.once(this.details.onDispose); - this._register(onceDetailsDisposed(() => { - if (!this.isDisposed()) { - this.dispose(); - } - })); - - const onceMasterDisposed = Event.once(this.master.onDispose); - this._register(onceMasterDisposed(() => { - if (!this.isDisposed()) { - this.dispose(); - } - })); - - // Reemit some events from the master side to the outside - this._register(this.master.onDidChangeDirty(() => this._onDidChangeDirty.fire())); - this._register(this.master.onDidChangeLabel(() => this._onDidChangeLabel.fire())); - } - matches(otherInput: unknown): boolean { - if (super.matches(otherInput) === true) { + if (otherInput === this) { return true; } - if (otherInput) { - if (!(otherInput instanceof SideBySideEditorInput)) { - return false; - } - - return this.details.matches(otherInput.details) && this.master.matches(otherInput.master); + if (otherInput instanceof SideBySideEditorInput) { + return this.primary.matches(otherInput.primary) && this.secondary.matches(otherInput.secondary); } return false; @@ -1230,8 +1212,8 @@ export interface IEditorPartOptionsChangeEvent { } export enum SideBySideEditor { - MASTER = 1, - DETAILS = 2, + PRIMARY = 1, + SECONDARY = 2, BOTH = 3 } @@ -1240,10 +1222,10 @@ export interface IResourceOptions { filterByScheme?: string | string[]; } -export function toResource(editor: IEditorInput | undefined): URI | undefined; -export function toResource(editor: IEditorInput | undefined, options: IResourceOptions & { supportSideBySide?: SideBySideEditor.MASTER | SideBySideEditor.DETAILS }): URI | undefined; -export function toResource(editor: IEditorInput | undefined, options: IResourceOptions & { supportSideBySide: SideBySideEditor.BOTH }): URI | { master?: URI, detail?: URI } | undefined; -export function toResource(editor: IEditorInput | undefined, options?: IResourceOptions): URI | { master?: URI, detail?: URI } | undefined { +export function toResource(editor: IEditorInput | undefined | null): URI | undefined; +export function toResource(editor: IEditorInput | undefined | null, options: IResourceOptions & { supportSideBySide?: SideBySideEditor.PRIMARY | SideBySideEditor.SECONDARY }): URI | undefined; +export function toResource(editor: IEditorInput | undefined | null, options: IResourceOptions & { supportSideBySide: SideBySideEditor.BOTH }): URI | { primary?: URI, secondary?: URI } | undefined; +export function toResource(editor: IEditorInput | undefined | null, options?: IResourceOptions): URI | { primary?: URI, secondary?: URI } | undefined { if (!editor) { return undefined; } @@ -1251,12 +1233,12 @@ export function toResource(editor: IEditorInput | undefined, options?: IResource if (options?.supportSideBySide && editor instanceof SideBySideEditorInput) { if (options?.supportSideBySide === SideBySideEditor.BOTH) { return { - master: toResource(editor.master, { filterByScheme: options.filterByScheme }), - detail: toResource(editor.details, { filterByScheme: options.filterByScheme }) + primary: toResource(editor.primary, { filterByScheme: options.filterByScheme }), + secondary: toResource(editor.secondary, { filterByScheme: options.filterByScheme }) }; } - editor = options.supportSideBySide === SideBySideEditor.MASTER ? editor.master : editor.details; + editor = options.supportSideBySide === SideBySideEditor.PRIMARY ? editor.primary : editor.secondary; } const resource = editor.resource; diff --git a/src/vs/workbench/common/editor/editorGroup.ts b/src/vs/workbench/common/editor/editorGroup.ts index 178aa1d792f..99d46391837 100644 --- a/src/vs/workbench/common/editor/editorGroup.ts +++ b/src/vs/workbench/common/editor/editorGroup.ts @@ -689,14 +689,14 @@ export class EditorGroup extends Disposable { return [this.editors[index], index]; } - contains(candidate: EditorInput, searchInSideBySideEditors?: boolean): boolean { + contains(candidate: EditorInput, options?: { supportSideBySide?: boolean, strictEquals?: boolean }): boolean { for (const editor of this.editors) { - if (this.matches(editor, candidate)) { + if (this.matches(editor, candidate, options?.strictEquals)) { return true; } - if (searchInSideBySideEditors && editor instanceof SideBySideEditorInput) { - if (this.matches(editor.master, candidate) || this.matches(editor.details, candidate)) { + if (options?.supportSideBySide && editor instanceof SideBySideEditorInput) { + if (this.matches(editor.primary, candidate, options?.strictEquals) || this.matches(editor.secondary, candidate, options?.strictEquals)) { return true; } } @@ -705,11 +705,15 @@ export class EditorGroup extends Disposable { return false; } - private matches(editor: IEditorInput | null, candidate: IEditorInput | null): boolean { + private matches(editor: IEditorInput | null, candidate: IEditorInput | null, strictEquals?: boolean): boolean { if (!editor || !candidate) { return false; } + if (strictEquals) { + return editor === candidate; + } + return editor.matches(candidate); } diff --git a/src/vs/workbench/common/editor/resourceEditorInput.ts b/src/vs/workbench/common/editor/resourceEditorInput.ts index 5d0cf51c87b..d9006712fcf 100644 --- a/src/vs/workbench/common/editor/resourceEditorInput.ts +++ b/src/vs/workbench/common/editor/resourceEditorInput.ts @@ -15,6 +15,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { ILabelService } from 'vs/platform/label/common/label'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { AbstractTextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput'; +import { extUri } from 'vs/base/common/resources'; /** * A read-only text editor input whos contents are made of the provided resource that points to an existing @@ -109,13 +110,12 @@ export class ResourceEditorInput extends AbstractTextResourceEditorInput impleme } matches(otherInput: unknown): boolean { - if (super.matches(otherInput) === true) { + if (otherInput === this) { return true; } - // Compare by properties if (otherInput instanceof ResourceEditorInput) { - return otherInput.resource.toString() === this.resource.toString(); + return extUri.isEqual(otherInput.resource, this.resource); } return false; diff --git a/src/vs/workbench/common/editor/textResourceEditorInput.ts b/src/vs/workbench/common/editor/textResourceEditorInput.ts index 82f04d7aebc..ad427fbf461 100644 --- a/src/vs/workbench/common/editor/textResourceEditorInput.ts +++ b/src/vs/workbench/common/editor/textResourceEditorInput.ts @@ -22,7 +22,8 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { private static readonly MEMOIZER = createMemoizer(); - private label: URI; + private _label: URI; + get label(): URI { return this._label; } constructor( public readonly resource: URI, @@ -36,7 +37,7 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { ) { super(); - this.label = preferredLabel || resource; + this._label = preferredLabel || resource; this.registerListeners(); } @@ -50,7 +51,7 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { } private onLabelEvent(scheme: string): void { - if (scheme === this.label.scheme) { + if (scheme === this._label.scheme) { this.updateLabel(); } } @@ -65,15 +66,15 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { } setLabel(label: URI): void { - if (!extUri.isEqual(label, this.label)) { - this.label = label; + if (!extUri.isEqual(label, this._label)) { + this._label = label; this.updateLabel(); } } getLabel(): URI { - return this.label; + return this._label; } getName(): string { @@ -82,7 +83,7 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { @AbstractTextResourceEditorInput.MEMOIZER private get basename(): string { - return this.labelService.getUriBasenameLabel(this.label); + return this.labelService.getUriBasenameLabel(this._label); } getDescription(verbosity: Verbosity = Verbosity.MEDIUM): string | undefined { @@ -99,17 +100,17 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { @AbstractTextResourceEditorInput.MEMOIZER private get shortDescription(): string { - return this.labelService.getUriBasenameLabel(dirname(this.label)); + return this.labelService.getUriBasenameLabel(dirname(this._label)); } @AbstractTextResourceEditorInput.MEMOIZER private get mediumDescription(): string { - return this.labelService.getUriLabel(dirname(this.label), { relative: true }); + return this.labelService.getUriLabel(dirname(this._label), { relative: true }); } @AbstractTextResourceEditorInput.MEMOIZER private get longDescription(): string { - return this.labelService.getUriLabel(dirname(this.label)); + return this.labelService.getUriLabel(dirname(this._label)); } @AbstractTextResourceEditorInput.MEMOIZER @@ -119,12 +120,12 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { @AbstractTextResourceEditorInput.MEMOIZER private get mediumTitle(): string { - return this.labelService.getUriLabel(this.label, { relative: true }); + return this.labelService.getUriLabel(this._label, { relative: true }); } @AbstractTextResourceEditorInput.MEMOIZER private get longTitle(): string { - return this.labelService.getUriLabel(this.label); + return this.labelService.getUriLabel(this._label); } getTitle(verbosity: Verbosity): string { @@ -163,7 +164,7 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { return false; } - async save(group: GroupIdentifier, options?: ITextFileSaveOptions): Promise { + save(group: GroupIdentifier, options?: ITextFileSaveOptions): Promise { return this.doSave(group, options, false); } @@ -185,7 +186,12 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { return undefined; // save cancelled } - return this.editorService.createEditorInput({ resource: target }); + // If the target is a different resource, return with a new editor input + if (!extUri.isEqual(target, this.resource)) { + return this.editorService.createEditorInput({ resource: target }); + } + + return this; } async revert(group: GroupIdentifier, options?: IRevertOptions): Promise { diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 36f3c13126f..9c8e2795336 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -23,6 +23,7 @@ import { IProgressIndicator } from 'vs/platform/progress/common/progress'; import Severity from 'vs/base/common/severity'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; export const TEST_VIEW_CONTAINER_ID = 'workbench.view.extension.test'; @@ -483,6 +484,7 @@ export interface IViewsService { openViewContainer(id: string, focus?: boolean): Promise; closeViewContainer(id: string): void; getVisibleViewContainer(location: ViewContainerLocation): ViewContainer | null; + getActiveViewPaneContainerWithId(viewContainerId: string): IViewPaneContainer | null; // View APIs readonly onDidChangeViewVisibility: Event<{ id: string, visible: boolean }>; @@ -580,6 +582,7 @@ export interface ITreeView extends IDisposable { setFocus(item: ITreeItem): void; + show(container: any): void; } export interface IRevealOptions { @@ -635,7 +638,7 @@ export interface ITreeItem { resourceUri?: UriComponents; - tooltip?: string; + tooltip?: string | IMarkdownString; contextValue?: string; @@ -646,6 +649,56 @@ export interface ITreeItem { accessibilityInformation?: IAccessibilityInformation; } +export class ResolvableTreeItem implements ITreeItem { + handle: string; + parentHandle?: string; + collapsibleState: TreeItemCollapsibleState; + label?: ITreeItemLabel; + description?: string | boolean; + icon?: UriComponents; + iconDark?: UriComponents; + themeIcon?: ThemeIcon; + resourceUri?: UriComponents; + tooltip?: string | IMarkdownString; + contextValue?: string; + command?: Command; + children?: ITreeItem[]; + accessibilityInformation?: IAccessibilityInformation; + resolve: () => Promise; + private resolved: boolean = false; + private _hasResolve: boolean = false; + constructor(treeItem: ITreeItem, resolve?: (() => Promise)) { + this.handle = treeItem.handle; + this.parentHandle = treeItem.parentHandle; + this.collapsibleState = treeItem.collapsibleState; + this.label = treeItem.label; + this.description = treeItem.description; + this.icon = treeItem.icon; + this.iconDark = treeItem.iconDark; + this.themeIcon = treeItem.themeIcon; + this.resourceUri = treeItem.resourceUri; + this.tooltip = treeItem.tooltip; + this.contextValue = treeItem.contextValue; + this.command = treeItem.command; + this.children = treeItem.children; + this.accessibilityInformation = treeItem.accessibilityInformation; + this._hasResolve = !!resolve; + this.resolve = async () => { + if (resolve && !this.resolved) { + const resolvedItem = await resolve(); + if (resolvedItem) { + // Resolvable elements. Currently only tooltip. + this.tooltip = resolvedItem.tooltip; + } + } + this.resolved = true; + }; + } + get hasResolve(): boolean { + return this._hasResolve; + } +} + export interface ITreeViewDataProvider { readonly isTreeEmpty?: boolean; onDidChangeEmpty?: Event; diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts index 3be811c4082..353eb06c84c 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts @@ -365,5 +365,6 @@ Registry.as(ViewContainerExtensions.ViewsRegistry).registerViews when: BulkEditPreviewContribution.ctxEnabled, ctorDescriptor: new SyncDescriptor(BulkEditPane), containerIcon: Codicon.lightbulb.classNames, + canMoveView: true }], container); diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts index 8be28a631d1..b0c6afd8861 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./bulkEdit'; -import { WorkbenchAsyncDataTree, IOpenEvent, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree, IOpenEvent } from 'vs/platform/list/browser/listService'; import { WorkspaceEdit } from 'vs/editor/common/modes'; import { BulkEditElement, BulkEditDelegate, TextEditElementRenderer, FileElementRenderer, BulkEditDataSource, BulkEditIdentityProvider, FileElement, TextEditElement, BulkEditAccessibilityProvider, CategoryElementRenderer, BulkEditNaviLabelProvider, CategoryElement, BulkEditSorter } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditTree'; import { FuzzyScore } from 'vs/base/common/filters'; @@ -136,15 +136,13 @@ export class BulkEditPane extends ViewPane { expandOnlyOnTwistieClick: true, multipleSelectionSupport: false, keyboardNavigationLabelProvider: new BulkEditNaviLabelProvider(), - sorter: new BulkEditSorter() + sorter: new BulkEditSorter(), + openOnFocus: true } ); this._disposables.add(this._tree.onContextMenu(this._onContextMenu, this)); - - const navigator = new TreeResourceNavigator(this._tree, { openOnFocus: true }); - this._disposables.add(navigator); - this._disposables.add(navigator.onDidOpenResource(e => this._openElementAsEditor(e))); + this._disposables.add(this._tree.onDidOpen(e => this._openElementAsEditor(e))); // message this._message = document.createElement('span'); diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts index 76758b30160..c1bc2e5377d 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -9,7 +9,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { FuzzyScore, createMatches } from 'vs/base/common/filters'; import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; -import { SymbolKinds, Location } from 'vs/editor/common/modes'; +import { SymbolKinds, Location, SymbolTag } from 'vs/editor/common/modes'; import { compare } from 'vs/base/common/strings'; import { Range } from 'vs/editor/common/core/range'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; @@ -117,11 +117,12 @@ export class CallRenderer implements ITreeRenderer, _index: number, template: CallRenderingTemplate): void { const { element, filterData } = node; + const deprecated = element.item.tags?.includes(SymbolTag.Deprecated); template.icon.className = SymbolKinds.toCssClassName(element.item.kind, true); template.label.setLabel( element.item.name, element.item.detail, - { labelEscapeNewLines: true, matches: createMatches(filterData) } + { labelEscapeNewLines: true, matches: createMatches(filterData), strikethrough: deprecated } ); } disposeTemplate(template: CallRenderingTemplate): void { diff --git a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts index c82d0a7739d..28a29548511 100644 --- a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts +++ b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IRange } from 'vs/editor/common/core/range'; -import { SymbolKind, ProviderResult } from 'vs/editor/common/modes'; +import { SymbolKind, ProviderResult, SymbolTag } from 'vs/editor/common/modes'; import { ITextModel } from 'vs/editor/common/model'; import { CancellationToken } from 'vs/base/common/cancellation'; import { LanguageFeatureRegistry } from 'vs/editor/common/modes/languageFeatureRegistry'; @@ -32,6 +32,7 @@ export interface CallHierarchyItem { uri: URI; range: IRange; selectionRange: IRange; + tags?: SymbolTag[] } export interface IncomingCall { diff --git a/src/vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts b/src/vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts index b9992fde979..30a3c94fdf1 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts @@ -12,7 +12,6 @@ import './inspectEditorTokens/inspectEditorTokens'; import './quickaccess/gotoLineQuickAccess'; import './quickaccess/gotoSymbolQuickAccess'; import './saveParticipants'; -import './semanticTokensHelp'; import './toggleColumnSelection'; import './toggleMinimap'; import './toggleMultiCursorModifier'; diff --git a/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts b/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts index 4eed83f9e01..069b114a77a 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts @@ -29,10 +29,7 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { ColorThemeData, TokenStyleDefinitions, TokenStyleDefinition, TextMateThemingRuleDefinitions } from 'vs/workbench/services/themes/common/colorThemeData'; import { SemanticTokenRule, TokenStyleData, TokenStyle } from 'vs/platform/theme/common/tokenClassificationRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; - -export interface IEditorSemanticHighlightingOptions { - enabled?: boolean; -} +import { SEMANTIC_HIGHLIGHTING_SETTING_ID, IEditorSemanticHighlightingOptions } from 'vs/editor/common/services/modelServiceImpl'; class InspectEditorTokensController extends Disposable implements IEditorContribution { @@ -264,11 +261,11 @@ class InspectEditorTokensWidget extends Disposable implements IContentWidget { } private _isSemanticColoringEnabled() { - if (!this._themeService.getColorTheme().semanticHighlighting) { - return false; + const setting = this._configurationService.getValue(SEMANTIC_HIGHLIGHTING_SETTING_ID, { overrideIdentifier: this._model.getLanguageIdentifier().language, resource: this._model.uri })?.enabled; + if (typeof setting === 'boolean') { + return setting; } - const options = this._configurationService.getValue('editor.semanticHighlighting', { overrideIdentifier: this._model.getLanguageIdentifier().language, resource: this._model.uri }); - return options && options.enabled; + return this._themeService.getColorTheme().semanticHighlighting; } private _compute(grammar: IGrammar | null, semanticTokens: SemanticTokensResult | null, position: Position): string { diff --git a/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts b/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts index 319869b0a66..e41b57e5af1 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts @@ -53,4 +53,4 @@ class InspectKeyMapJSON extends Action { } const registry = Registry.as(ActionExtensions.WorkbenchActions); -registry.registerWorkbenchAction(SyncActionDescriptor.from(InspectKeyMapJSON), 'Developer: Inspect Key Mappings (JSON)', nls.localize('developer', "Developer")); +registry.registerWorkbenchAction(SyncActionDescriptor.from(InspectKeyMapJSON), 'Developer: Inspect Key Mappings (JSON)', nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer")); diff --git a/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts b/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts index dbb0f558d46..489581f1233 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts @@ -137,7 +137,7 @@ export class GotoSymbolQuickAccessProvider extends AbstractGotoSymbolQuickAccess picker.busy = true; - provider.provideTableOfContents(pane, cts.token).then(entries => { + provider.provideTableOfContents(pane, { disposables }, cts.token).then(entries => { picker.busy = false; @@ -256,7 +256,8 @@ export interface ITableOfContentsEntry { } export interface ITableOfContentsProvider { - provideTableOfContents(editor: T, token: CancellationToken): Promise; + + provideTableOfContents(editor: T, context: { disposables: DisposableStore }, token: CancellationToken): Promise; } class ProviderRegistry { diff --git a/src/vs/workbench/contrib/codeEditor/browser/semanticTokensHelp.ts b/src/vs/workbench/contrib/codeEditor/browser/semanticTokensHelp.ts deleted file mode 100644 index e694687c95b..00000000000 --- a/src/vs/workbench/contrib/codeEditor/browser/semanticTokensHelp.ts +++ /dev/null @@ -1,109 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as nls from 'vs/nls'; -import * as path from 'vs/base/common/path'; -import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { ICodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; -import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { URI } from 'vs/base/common/uri'; -import { ITextModel } from 'vs/editor/common/model'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; - -/** - * Shows a message when semantic tokens are shown the first time. - */ -export class SemanticTokensHelp extends Disposable implements IEditorContribution { - - public static readonly ID = 'editor.contrib.semanticHighlightHelp'; - - constructor( - _editor: ICodeEditor, - @INotificationService _notificationService: INotificationService, - @IOpenerService _openerService: IOpenerService, - @IWorkbenchThemeService _themeService: IWorkbenchThemeService, - @IEditorService _editorService: IEditorService, - @IStorageService _storageService: IStorageService, - @IStorageKeysSyncRegistryService storageKeysSyncRegistryService: IStorageKeysSyncRegistryService - ) { - super(); - // opt-in to syncing - const neverShowAgainId = 'editor.contrib.semanticTokensHelp'; - - if (_storageService.getBoolean(neverShowAgainId, StorageScope.GLOBAL)) { - return; - } - - storageKeysSyncRegistryService.registerStorageKey({ key: neverShowAgainId, version: 1 }); - - const toDispose = this._register(new DisposableStore()); - const localToDispose = toDispose.add(new DisposableStore()); - const installChangeTokenListener = (model: ITextModel) => { - localToDispose.add(model.onDidChangeTokens((e) => { - if (!e.semanticTokensApplied) { - return; - } - if (_storageService.getBoolean(neverShowAgainId, StorageScope.GLOBAL)) { - toDispose.dispose(); - return; - } - const activeEditorControl = _editorService.activeTextEditorControl; - if (!isCodeEditor(activeEditorControl) || activeEditorControl.getModel() !== model) { - return; // only show if model is in the active code editor - } - - toDispose.dispose(); // uninstall all listeners, make sure the notification is only shown once per window - _storageService.store(neverShowAgainId, true, StorageScope.GLOBAL); // never show again - - const message = nls.localize( - { - key: 'semanticTokensHelp', - comment: [ - 'Variable 0 will be a file name.', - 'Variable 1 will be a theme name.' - ] - }, - "Code coloring of '{0}' has been updated as the theme '{1}' has [semantic highlighting](https://go.microsoft.com/fwlink/?linkid=2122588) enabled.", - path.basename(model.uri.path), _themeService.getColorTheme().label - ); - - _notificationService.prompt(Severity.Info, message, [ - { - label: nls.localize('learnMoreButton', "Learn More"), - run: () => { - const url = 'https://go.microsoft.com/fwlink/?linkid=2122588'; - - _openerService.open(URI.parse(url)); - } - } - ]); - })); - }; - - - const model = _editor.getModel(); - if (model !== null) { - installChangeTokenListener(model); - } - - toDispose.add(_editor.onDidChangeModel((e) => { - localToDispose.clear(); - - const model = _editor.getModel(); - if (!model) { - return; - } - installChangeTokenListener(model); - })); - } -} - -registerEditorContribution(SemanticTokensHelp.ID, SemanticTokensHelp); diff --git a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts index dc87d2f8a21..5e809ac197e 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts @@ -314,7 +314,6 @@ function getSuggestEnabledInputOptions(ariaLabel?: string): IEditorOptions { cursorWidth: 1, fontFamily: DEFAULT_FONT_FAMILY, ariaLabel: ariaLabel || '', - snippetSuggestions: 'none', suggest: { filterGraceful: false, showIcons: false }, autoClosingBrackets: 'never' diff --git a/src/vs/workbench/contrib/codeEditor/electron-browser/startDebugTextMate.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/startDebugTextMate.ts index b2fb6d834d2..b114a94d5f5 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-browser/startDebugTextMate.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-browser/startDebugTextMate.ts @@ -104,4 +104,4 @@ class StartDebugTextMate extends Action { } const registry = Registry.as(ActionExtensions.WorkbenchActions); -registry.registerWorkbenchAction(SyncActionDescriptor.from(StartDebugTextMate), 'Start Text Mate Syntax Grammar Logging', nls.localize('developer', "Developer")); +registry.registerWorkbenchAction(SyncActionDescriptor.from(StartDebugTextMate), 'Start Text Mate Syntax Grammar Logging', nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer")); diff --git a/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts index 36e1dba73ac..e5cec611df9 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts @@ -6,17 +6,21 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; +import { Disposable } from 'vs/base/common/lifecycle'; -class SleepResumeRepaintMinimap implements IWorkbenchContribution { +class SleepResumeRepaintMinimap extends Disposable implements IWorkbenchContribution { constructor( - @ICodeEditorService codeEditorService: ICodeEditorService + @ICodeEditorService codeEditorService: ICodeEditorService, + @IElectronService electronService: IElectronService ) { - ipcRenderer.on('vscode:osResume', () => { + super(); + + this._register(electronService.onOSResume(() => { codeEditorService.listCodeEditors().forEach(editor => editor.render(true)); - }); + })); } } diff --git a/src/vs/workbench/contrib/comments/browser/commentNode.ts b/src/vs/workbench/contrib/comments/browser/commentNode.ts index 02867d26c03..a2b8e7786f0 100644 --- a/src/vs/workbench/contrib/comments/browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/browser/commentNode.ts @@ -197,7 +197,7 @@ export class CommentNode extends Disposable { this.createToolbar(); } - this.toolbar!.setActions(primary, secondary)(); + this.toolbar!.setActions(primary, secondary); })); const { primary, secondary } = this.getToolbarActions(menu); @@ -205,7 +205,7 @@ export class CommentNode extends Disposable { if (actions.length || secondary.length) { this.createToolbar(); - this.toolbar!.setActions(actions, secondary)(); + this.toolbar!.setActions(actions, secondary); } } @@ -401,6 +401,10 @@ export class CommentNode extends Disposable { this._commentEditContainer!.remove(); } + layout() { + this._commentEditor?.layout(); + } + public switchToEditMode() { if (this.isEditing) { return; diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts index ebae7f3b4e5..62c79e6c69c 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts @@ -739,6 +739,11 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget _refresh() { if (this._isExpanded && this._bodyElement) { let dimensions = dom.getClientArea(this._bodyElement); + + this._commentElements.forEach(element => { + element.layout(); + }); + const headHeight = Math.ceil(this.editor.getOption(EditorOption.lineHeight) * 1.2); const lineHeight = this.editor.getOption(EditorOption.lineHeight); const arrowHeight = Math.round(lineHeight / 3); diff --git a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts index 6c2745d2ec8..0abbf8b7626 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts @@ -17,11 +17,10 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { WorkbenchAsyncDataTree, IListService } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree, IListService, IWorkbenchAsyncDataTreeOptions } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IColorMapping } from 'vs/platform/theme/common/styler'; -import { basename } from 'vs/base/common/resources'; export const COMMENTS_VIEW_ID = 'workbench.panel.comments'; export const COMMENTS_VIEW_TITLE = 'Comments'; @@ -150,7 +149,7 @@ export class CommentNodeRenderer implements IListRenderer } } -export interface ICommentsListOptions { +export interface ICommentsListOptions extends IWorkbenchAsyncDataTreeOptions { overrideStyles?: IColorMapping; } @@ -182,30 +181,7 @@ export class CommentsList extends WorkbenchAsyncDataTree { renderers, dataSource, { - accessibilityProvider: { - getAriaLabel(element: any): string { - if (element instanceof CommentsModel) { - return nls.localize('rootCommentsLabel', "Comments for current workspace"); - } - if (element instanceof ResourceWithCommentThreads) { - return nls.localize('resourceWithCommentThreadsLabel', "Comments in {0}, full path {1}", basename(element.resource), element.resource.fsPath); - } - if (element instanceof CommentNode) { - return nls.localize('resourceWithCommentLabel', - "Comment from ${0} at line {1} column {2} in {3}, source: {4}", - element.comment.userName, - element.range.startLineNumber, - element.range.startColumn, - basename(element.resource), - element.comment.body.value - ); - } - return ''; - }, - getWidgetAriaLabel(): string { - return COMMENTS_VIEW_TITLE; - } - }, + accessibilityProvider: options.accessibilityProvider, keyboardSupport: true, identityProvider: { getId: (element: any) => { diff --git a/src/vs/workbench/contrib/comments/browser/commentsView.ts b/src/vs/workbench/contrib/comments/browser/commentsView.ts index f8c26805cf5..5410708c29f 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsView.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsView.ts @@ -6,6 +6,7 @@ import 'vs/css!./media/panel'; import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; +import { basename } from 'vs/base/common/resources'; import { IAction, Action } from 'vs/base/common/actions'; import { CollapseAllAction } from 'vs/base/browser/ui/tree/treeDefaults'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -27,8 +28,6 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { TreeResourceNavigator } from 'vs/platform/list/browser/listService'; - export class CommentsPanel extends ViewPane { private treeLabels!: ResourceLabels; @@ -150,10 +149,36 @@ export class CommentsPanel extends ViewPane { private createTree(): void { this.treeLabels = this._register(this.instantiationService.createInstance(ResourceLabels, this)); - this.tree = this._register(this.instantiationService.createInstance(CommentsList, this.treeLabels, this.treeContainer, { overrideStyles: { listBackground: this.getBackgroundColor() } })); + this.tree = this._register(this.instantiationService.createInstance(CommentsList, this.treeLabels, this.treeContainer, { + overrideStyles: { listBackground: this.getBackgroundColor() }, + openOnFocus: true, + accessibilityProvider: { + getAriaLabel(element: any): string { + if (element instanceof CommentsModel) { + return nls.localize('rootCommentsLabel', "Comments for current workspace"); + } + if (element instanceof ResourceWithCommentThreads) { + return nls.localize('resourceWithCommentThreadsLabel', "Comments in {0}, full path {1}", basename(element.resource), element.resource.fsPath); + } + if (element instanceof CommentNode) { + return nls.localize('resourceWithCommentLabel', + "Comment from ${0} at line {1} column {2} in {3}, source: {4}", + element.comment.userName, + element.range.startLineNumber, + element.range.startColumn, + basename(element.resource), + element.comment.body.value + ); + } + return ''; + }, + getWidgetAriaLabel(): string { + return COMMENTS_VIEW_TITLE; + } + } + })); - const commentsNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: true })); - this._register(commentsNavigator.onDidOpenResource(e => { + this._register(this.tree.onDidOpen(e => { this.openFile(e.element, e.editorOptions.pinned, e.editorOptions.preserveFocus, e.sideBySide); })); } diff --git a/src/vs/workbench/contrib/customEditor/browser/commands.ts b/src/vs/workbench/contrib/customEditor/browser/commands.ts deleted file mode 100644 index d96619b257a..00000000000 --- a/src/vs/workbench/contrib/customEditor/browser/commands.ts +++ /dev/null @@ -1,68 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { Command } from 'vs/editor/browser/editorExtensions'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { CustomEditorInput } from 'vs/workbench/contrib/customEditor/browser/customEditorInput'; -import { CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE } from 'vs/workbench/contrib/customEditor/common/customEditor'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; - - -(new class UndoCustomEditorCommand extends Command { - public static readonly ID = 'editor.action.customEditor.undo'; - - constructor() { - super({ - id: UndoCustomEditorCommand.ID, - precondition: ContextKeyExpr.and( - CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE, - ContextKeyExpr.not(InputFocusedContextKey)), - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_Z, - weight: KeybindingWeight.EditorContrib - } - }); - } - - public runCommand(accessor: ServicesAccessor): void { - const editorService = accessor.get(IEditorService); - const activeInput = editorService.activeEditorPane?.input; - if (activeInput instanceof CustomEditorInput) { - activeInput.undo(); - } - } -}).register(); - -(new class RedoWebviewEditorCommand extends Command { - public static readonly ID = 'editor.action.customEditor.redo'; - - constructor() { - super({ - id: RedoWebviewEditorCommand.ID, - precondition: ContextKeyExpr.and( - CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE, - ContextKeyExpr.not(InputFocusedContextKey)), - kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_Y, - secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z], - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z }, - weight: KeybindingWeight.EditorContrib - } - }); - } - - public runCommand(accessor: ServicesAccessor): void { - const editorService = accessor.get(IEditorService); - const activeInput = editorService.activeEditorPane?.input; - if (activeInput instanceof CustomEditorInput) { - activeInput.redo(); - } - } -}).register(); - diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditor.contribution.ts b/src/vs/workbench/contrib/customEditor/browser/customEditor.contribution.ts index 4189d2899a7..25069373665 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditor.contribution.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditor.contribution.ts @@ -14,7 +14,6 @@ import { Extensions as EditorInputExtensions, IEditorInputFactoryRegistry } from import { CustomEditorInputFactory } from 'vs/workbench/contrib/customEditor/browser/customEditorInputFactory'; import { ICustomEditorService } from 'vs/workbench/contrib/customEditor/common/customEditor'; import { WebviewEditor } from 'vs/workbench/contrib/webview/browser/webviewEditor'; -import './commands'; import { CustomEditorInput } from './customEditorInput'; import { CustomEditorContribution, CustomEditorService } from './customEditors'; diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts index 96c78b57d37..c75ea750e6f 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts @@ -166,7 +166,7 @@ export class CustomEditorInput extends LazilyResolvedWebviewEditorInput { return undefined; } - return this.move(groupId, target)?.editor; + return this.rename(groupId, target)?.editor; } public async revert(group: GroupIdentifier, options?: IRevertOptions): Promise { @@ -196,7 +196,7 @@ export class CustomEditorInput extends LazilyResolvedWebviewEditorInput { return null; } - move(group: GroupIdentifier, newResource: URI): { editor: IEditorInput } | undefined { + rename(group: GroupIdentifier, newResource: URI): { editor: IEditorInput } | undefined { // See if we can keep using the same custom editor provider const editorInfo = this.customEditorService.getCustomEditor(this.viewType); if (editorInfo?.matches(newResource)) { diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts b/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts index dcf62e4c3bb..cf1b74effb8 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts @@ -8,7 +8,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IEditorInput } from 'vs/workbench/common/editor'; import { CustomEditorInput } from 'vs/workbench/contrib/customEditor/browser/customEditorInput'; -import { IWebviewService, WebviewExtensionDescription } from 'vs/workbench/contrib/webview/browser/webview'; +import { IWebviewService, WebviewExtensionDescription, WebviewContentPurpose } from 'vs/workbench/contrib/webview/browser/webview'; import { reviveWebviewExtensionDescription, SerializedWebview, WebviewEditorInputFactory, DeserializedWebview } from 'vs/workbench/contrib/webview/browser/webviewEditorInputFactory'; import { IWebviewWorkbenchService, WebviewInputOptions } from 'vs/workbench/contrib/webview/browser/webviewWorkbenchService'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; @@ -96,6 +96,7 @@ export class CustomEditorInputFactory extends WebviewEditorInputFactory { private static reviveWebview(data: { id: string, state: any, options: WebviewInputOptions, extension?: WebviewExtensionDescription, }, webviewService: IWebviewService) { return new Lazy(() => { const webview = webviewService.createWebviewOverlay(data.id, { + purpose: WebviewContentPurpose.CustomEditor, enableFindWidget: data.options.enableFindWidget, retainContextWhenHidden: data.options.retainContextWhenHidden }, data.options, data.extension); diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts index bc56f862137..787ffd48fd8 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Registry } from 'vs/platform/registry/common/platform'; import { coalesce, distinct } from 'vs/base/common/arrays'; import { Emitter, Event } from 'vs/base/common/event'; import { Lazy } from 'vs/base/common/lazy'; @@ -11,6 +10,7 @@ import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle' import { basename, extname, isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; +import { RedoCommand, UndoCommand } from 'vs/editor/browser/editorExtensions'; import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -18,18 +18,18 @@ import { EditorActivation, IEditorOptions, ITextEditorOptions } from 'vs/platfor import { FileOperation, IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; +import { Registry } from 'vs/platform/registry/common/platform'; import { IStorageService } from 'vs/platform/storage/common/storage'; import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { EditorInput, EditorOptions, GroupIdentifier, IEditorInput, IEditorPane, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions } from 'vs/workbench/common/editor'; +import { EditorInput, EditorOptions, Extensions as EditorInputExtensions, GroupIdentifier, IEditorInput, IEditorInputFactoryRegistry, IEditorPane } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { CONTEXT_CUSTOM_EDITORS, CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE, CustomEditorCapabilities, CustomEditorInfo, CustomEditorInfoCollection, CustomEditorPriority, ICustomEditorService } from 'vs/workbench/contrib/customEditor/common/customEditor'; import { CustomEditorModelManager } from 'vs/workbench/contrib/customEditor/common/customEditorModelManager'; -import { defaultEditorOverrideEntry } from 'vs/workbench/contrib/files/common/openWith'; import { IWebviewService, webviewHasOwnEditFunctionsContext } from 'vs/workbench/contrib/webview/browser/webview'; -import { CustomEditorAssociation, CustomEditorsAssociations, customEditorsAssociationsSettingId } from 'vs/workbench/services/editor/common/editorAssociationsSetting'; import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { CustomEditorAssociation, CustomEditorsAssociations, customEditorsAssociationsSettingId, defaultEditorOverrideEntry } from 'vs/workbench/services/editor/common/editorOpenWith'; import { ICustomEditorInfo, ICustomEditorViewTypesHandler, IEditorService, IOpenEditorOverride, IOpenEditorOverrideEntry } from 'vs/workbench/services/editor/common/editorService'; import { ContributedCustomEditors, defaultCustomEditor } from '../common/contributedCustomEditors'; import { CustomEditorInput } from './customEditorInput'; @@ -67,7 +67,6 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ this._focusedCustomEditorIsEditable = CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE.bindTo(contextKeyService); this._webviewHasOwnEditFunctions = webviewHasOwnEditFunctionsContext.bindTo(contextKeyService); - this._contributedEditors = this._register(new ContributedCustomEditors(storageService)); this._register(this._contributedEditors.onChange(() => { this.updateContexts(); @@ -82,6 +81,14 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ } })); + const PRIORITY = 105; + this._register(UndoCommand.addImplementation(PRIORITY, () => { + return this.withActiveCustomEditor(editor => editor.undo()); + })); + this._register(RedoCommand.addImplementation(PRIORITY, () => { + return this.withActiveCustomEditor(editor => editor.redo()); + })); + this.updateContexts(); } @@ -89,6 +96,15 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ return [...this._contributedEditors]; } + private withActiveCustomEditor(f: (editor: CustomEditorInput) => void): boolean { + const activeEditor = this.editorService.activeEditor; + if (activeEditor instanceof CustomEditorInput) { + f(activeEditor); + return true; + } + return false; + } + public get models() { return this._models; } public getCustomEditor(viewType: string): CustomEditorInfo | undefined { @@ -432,53 +448,59 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo super(); this._register(this.editorService.overrideOpenEditor({ - open: (editor, options, group, context, id) => { - return this.onEditorOpening(editor, options, group, id); + open: (editor, options, group) => { + return this.onEditorOpening(editor, options, group); }, - getEditorOverrides: (resource: URI, _options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[] => { + getEditorOverrides: (resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[] => { const currentEditor = group?.editors.find(editor => isEqual(editor.resource, resource)); + const defaultEditorOverride: IOpenEditorOverrideEntry = { + ...defaultEditorOverrideEntry, + active: this._fileEditorInputFactory.isFileEditorInput(currentEditor), + }; + + const toOverride = (entry: CustomEditorInfo): IOpenEditorOverrideEntry => { + return { + id: entry.id, + active: currentEditor instanceof CustomEditorInput && currentEditor.viewType === entry.id, + label: entry.displayName, + detail: entry.providerDisplayName, + }; + }; + + if (typeof options?.override === 'string') { + // A specific override was requested. Only return it. + + if (options.override === defaultEditorOverride.id) { + return [defaultEditorOverride]; + } + + const matchingEditor = this.customEditorService.getCustomEditor(options.override); + return matchingEditor ? [toOverride(matchingEditor)] : []; + } + + // Otherwise, return all potential overrides. const customEditors = this.customEditorService.getAllCustomEditors(resource); if (!customEditors.length) { return []; } return [ - { - ...defaultEditorOverrideEntry, - active: this._fileEditorInputFactory.isFileEditorInput(currentEditor), - }, + defaultEditorOverride, ...customEditors.allEditors .filter(entry => entry.id !== defaultCustomEditor.id) - .map(entry => { - return { - id: entry.id, - active: currentEditor instanceof CustomEditorInput && currentEditor.viewType === entry.id, - label: entry.displayName, - detail: entry.providerDisplayName, - }; - }) + .map(toOverride) ]; } })); - - this._register(this.editorService.onDidCloseEditor(({ editor }) => { - if (!(editor instanceof CustomEditorInput)) { - return; - } - - if (!this.editorService.editors.some(other => other === editor)) { - editor.dispose(); - } - })); } private onEditorOpening( editor: IEditorInput, options: ITextEditorOptions | undefined, - group: IEditorGroup, - id?: string, + group: IEditorGroup ): IOpenEditorOverride | undefined { + const id = typeof options?.override === 'string' ? options.override : undefined; if (editor instanceof CustomEditorInput) { if (editor.group === group.id && (editor.viewType === id || typeof id !== 'string')) { // No need to do anything diff --git a/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors.ts b/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors.ts index 7633e95e174..d61f9874fcd 100644 --- a/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors.ts +++ b/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors.ts @@ -12,8 +12,8 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { Memento } from 'vs/workbench/common/memento'; import { CustomEditorDescriptor, CustomEditorInfo, CustomEditorPriority } from 'vs/workbench/contrib/customEditor/common/customEditor'; import { customEditorsExtensionPoint, ICustomEditorsExtensionPoint } from 'vs/workbench/contrib/customEditor/common/extensionPoint'; -import { DEFAULT_EDITOR_ID } from 'vs/workbench/contrib/files/common/files'; import { IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { DEFAULT_EDITOR_ID } from 'vs/workbench/services/editor/common/editorOpenWith'; const builtinProviderDisplayName = nls.localize('builtinProviderDisplayName', "Built-in"); diff --git a/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts b/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts index 930bbe1d161..56d2bd17c8b 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts @@ -35,6 +35,7 @@ import { BrowserFeatures } from 'vs/base/browser/canIUse'; import { isSafari } from 'vs/base/browser/browser'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { ILabelService } from 'vs/platform/label/common/label'; const $ = dom.$; @@ -72,7 +73,7 @@ export function createBreakpointDecorations(model: ITextModel, breakpoints: Read } function getBreakpointDecorationOptions(model: ITextModel, breakpoint: IBreakpoint, state: State, breakpointsActivated: boolean, showBreakpointsInOverviewRuler: boolean): IModelDecorationOptions { - const { className, message } = getBreakpointMessageAndClassName(state, breakpointsActivated, breakpoint); + const { className, message } = getBreakpointMessageAndClassName(state, breakpointsActivated, breakpoint, undefined); let glyphMarginHoverMessage: MarkdownString | undefined; if (message) { @@ -163,7 +164,8 @@ export class BreakpointEditorContribution implements IBreakpointEditorContributi @IInstantiationService private readonly instantiationService: IInstantiationService, @IContextKeyService contextKeyService: IContextKeyService, @IDialogService private readonly dialogService: IDialogService, - @IConfigurationService private readonly configurationService: IConfigurationService + @IConfigurationService private readonly configurationService: IConfigurationService, + @ILabelService private readonly labelService: ILabelService ) { this.breakpointWidgetVisible = CONTEXT_BREAKPOINT_WIDGET_VISIBLE.bindTo(contextKeyService); this.registerListeners(); @@ -443,7 +445,7 @@ export class BreakpointEditorContribution implements IBreakpointEditorContributi // Candidate decoration has a breakpoint attached when a breakpoint is already at that location and we did not yet set a decoration there // In practice this happens for the first breakpoint that was set on a line // We could have also rendered this first decoration as part of desiredBreakpointDecorations however at that moment we have no location information - const cssClass = candidate.breakpoint ? getBreakpointMessageAndClassName(this.debugService.state, this.debugService.getModel().areBreakpointsActivated(), candidate.breakpoint).className : 'codicon-debug-breakpoint-disabled'; + const cssClass = candidate.breakpoint ? getBreakpointMessageAndClassName(this.debugService.state, this.debugService.getModel().areBreakpointsActivated(), candidate.breakpoint, this.labelService).className : 'codicon-debug-breakpoint-disabled'; const contextMenuActions = () => this.getContextMenuActions(candidate.breakpoint ? [candidate.breakpoint] : [], activeCodeEditor.getModel().uri, candidate.range.startLineNumber, candidate.range.startColumn); const inlineWidget = new InlineBreakpointWidget(activeCodeEditor, decorationId, cssClass, candidate.breakpoint, this.debugService, this.contextMenuService, contextMenuActions); diff --git a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts index b49fc1f8ae3..c0164a0d939 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts @@ -22,7 +22,7 @@ import { IEditorPane } from 'vs/workbench/common/editor'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { WorkbenchList } from 'vs/platform/list/browser/listService'; +import { WorkbenchList, ListResourceNavigator } from 'vs/platform/list/browser/listService'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -77,6 +77,7 @@ export class BreakpointsView extends ViewPane { @IContextKeyService contextKeyService: IContextKeyService, @IOpenerService openerService: IOpenerService, @ITelemetryService telemetryService: ITelemetryService, + @ILabelService private readonly labelService: ILabelService ) { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); @@ -95,12 +96,12 @@ export class BreakpointsView extends ViewPane { new ExceptionBreakpointsRenderer(this.debugService), this.instantiationService.createInstance(FunctionBreakpointsRenderer), this.instantiationService.createInstance(DataBreakpointsRenderer), - new FunctionBreakpointInputRenderer(this.debugService, this.contextViewService, this.themeService) + new FunctionBreakpointInputRenderer(this.debugService, this.contextViewService, this.themeService, this.labelService) ], { identityProvider: { getId: (element: IEnablement) => element.getId() }, multipleSelectionSupport: false, keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IEnablement) => e }, - accessibilityProvider: new BreakpointsAccessibilityProvider(this.debugService), + accessibilityProvider: new BreakpointsAccessibilityProvider(this.debugService, this.labelService), overrideStyles: { listBackground: this.getBackgroundColor() } @@ -110,38 +111,33 @@ export class BreakpointsView extends ViewPane { this._register(this.list.onContextMenu(this.onListContextMenu, this)); - this._register(this.list.onDidOpen(async e => { - let isSingleClick = false; - let isDoubleClick = false; - let isMiddleClick = false; - let openToSide = false; - - const browserEvent = e.browserEvent; - if (browserEvent instanceof MouseEvent) { - isSingleClick = browserEvent.detail === 1; - isDoubleClick = browserEvent.detail === 2; - isMiddleClick = browserEvent.button === 1; - openToSide = (browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey); + this.list.onMouseMiddleClick(async ({ element }) => { + if (element instanceof Breakpoint) { + await this.debugService.removeBreakpoints(element.getId()); + } else if (element instanceof FunctionBreakpoint) { + await this.debugService.removeFunctionBreakpoints(element.getId()); + } else if (element instanceof DataBreakpoint) { + await this.debugService.removeDataBreakpoints(element.getId()); } + }); - const focused = this.list.getFocusedElements(); - const element = focused.length ? focused[0] : undefined; - - if (isMiddleClick) { - if (element instanceof Breakpoint) { - await this.debugService.removeBreakpoints(element.getId()); - } else if (element instanceof FunctionBreakpoint) { - await this.debugService.removeFunctionBreakpoints(element.getId()); - } else if (element instanceof DataBreakpoint) { - await this.debugService.removeDataBreakpoints(element.getId()); - } + const resourceNavigator = this._register(new ListResourceNavigator(this.list, { configurationService: this.configurationService })); + this._register(resourceNavigator.onDidOpen(async e => { + if (e.element === null) { return; } - if (element instanceof Breakpoint) { - openBreakpointSource(element, openToSide, isSingleClick, this.debugService, this.editorService); + if (e.browserEvent instanceof MouseEvent && e.browserEvent.button === 1) { // middle click + return; } - if (isDoubleClick && element instanceof FunctionBreakpoint && element !== this.debugService.getViewModel().getSelectedFunctionBreakpoint()) { + + const element = this.list.element(e.element); + + if (element instanceof Breakpoint) { + openBreakpointSource(element, e.sideBySide, e.editorOptions.preserveFocus || false, this.debugService, this.editorService); + } + if (e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2 && element instanceof FunctionBreakpoint && element !== this.debugService.getViewModel().getSelectedFunctionBreakpoint()) { + // double click this.debugService.getViewModel().setSelectedFunctionBreakpoint(element); this.onBreakpointsChange(); } @@ -384,7 +380,7 @@ class BreakpointsRenderer implements IListRenderer { constructor( - @IDebugService private readonly debugService: IDebugService + @IDebugService private readonly debugService: IDebugService, + @ILabelService private readonly labelService: ILabelService ) { // noop } @@ -479,7 +476,7 @@ class FunctionBreakpointsRenderer implements IListRenderer { constructor( - @IDebugService private readonly debugService: IDebugService + @IDebugService private readonly debugService: IDebugService, + @ILabelService private readonly labelService: ILabelService ) { // noop } @@ -534,7 +532,7 @@ class DataBreakpointsRenderer implements IListRenderer { - constructor(private readonly debugService: IDebugService) { } + constructor( + private readonly debugService: IDebugService, + private readonly labelService: ILabelService + ) { } getWidgetAriaLabel(): string { return nls.localize('breakpoints', "Breakpoints"); @@ -663,7 +665,7 @@ class BreakpointsAccessibilityProvider implements IListAccessibilityProvider 0 ? '...' : '') + stackFrame.source.uri.path.substr(from); } +async function expandTo(session: IDebugSession, tree: WorkbenchCompressibleAsyncDataTree): Promise { + if (session.parentSession) { + await expandTo(session.parentSession, tree); + } + await tree.expand(session); +} + export class CallStackView extends ViewPane { private pauseMessage!: HTMLSpanElement; private pauseMessageLabel!: HTMLSpanElement; @@ -109,9 +119,9 @@ export class CallStackView extends ViewPane { private ignoreFocusStackFrameEvent = false; private callStackItemType: IContextKey; private dataSource!: CallStackDataSource; - private tree!: WorkbenchAsyncDataTree; + private tree!: WorkbenchCompressibleAsyncDataTree; private menu: IMenu; - private parentSessionToExpand = new Set(); + private autoExpandedSessions = new Set(); private selectionNeedsUpdate = false; constructor( @@ -136,10 +146,14 @@ export class CallStackView extends ViewPane { this._register(this.menu); // Create scheduler to prevent unnecessary flashing of tree when reacting to changes - this.onCallStackChangeScheduler = new RunOnceScheduler(() => { + this.onCallStackChangeScheduler = new RunOnceScheduler(async () => { // Only show the global pause message if we do not display threads. // Otherwise there will be a pause message per thread and there is no need for a global one. const sessions = this.debugService.getModel().getSessions(); + if (sessions.length === 0) { + this.autoExpandedSessions.clear(); + } + const thread = sessions.length === 1 && sessions[0].getAllThreads().length === 1 ? sessions[0].getAllThreads()[0] : undefined; if (thread && thread.stoppedDetails) { this.pauseMessageLabel.textContent = thread.stoppedDetails.description || nls.localize('debugStopped', "Paused on {0}", thread.stoppedDetails.reason || ''); @@ -155,18 +169,26 @@ export class CallStackView extends ViewPane { this.needsRefresh = false; this.dataSource.deemphasizedStackFramesToShow = []; - this.tree.updateChildren().then(() => { - try { - this.parentSessionToExpand.forEach(s => this.tree.expand(s)); - } catch (e) { - // Ignore tree expand errors if element no longer present + await this.tree.updateChildren(); + try { + const toExpand = new Set(); + sessions.forEach(s => { + // Automatically expand sessions that have children, but only do this once. + if (s.parentSession && !this.autoExpandedSessions.has(s.parentSession)) { + toExpand.add(s.parentSession); + } + }); + for (let session of toExpand) { + await expandTo(session, this.tree); + this.autoExpandedSessions.add(session); } - this.parentSessionToExpand.clear(); - if (this.selectionNeedsUpdate) { - this.selectionNeedsUpdate = false; - this.updateTreeSelection(); - } - }); + } catch (e) { + // Ignore tree expand errors if element no longer present + } + if (this.selectionNeedsUpdate) { + this.selectionNeedsUpdate = false; + await this.updateTreeSelection(); + } }, 50); } @@ -195,7 +217,7 @@ export class CallStackView extends ViewPane { this.dataSource = new CallStackDataSource(this.debugService); const sessionsRenderer = this.instantiationService.createInstance(SessionsRenderer, this.menu); - this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'CallStackView', treeContainer, new CallStackDelegate(), [ + this.tree = >this.instantiationService.createInstance(WorkbenchCompressibleAsyncDataTree, 'CallStackView', treeContainer, new CallStackDelegate(), new CallStackCompressionDelegate(this.debugService), [ sessionsRenderer, new ThreadsRenderer(this.instantiationService), this.instantiationService.createInstance(StackFramesRenderer), @@ -204,6 +226,8 @@ export class CallStackView extends ViewPane { new ShowMoreRenderer(this.themeService) ], this.dataSource, { accessibilityProvider: new CallStackAccessibilityProvider(), + compressionEnabled: true, + autoExpandSingleChildren: true, identityProvider: { getId: (element: CallStackItem) => { if (typeof element === 'string') { @@ -232,6 +256,13 @@ export class CallStackView extends ViewPane { } return nls.localize('showMoreStackFrames2', "Show More Stack Frames"); + }, + getCompressedNodeKeyboardNavigationLabel: (e: CallStackItem[]) => { + const firstItem = e[0]; + if (isDebugSession(firstItem)) { + return firstItem.getLabel(); + } + return ''; } }, expandOnlyOnTwistieClick: true, @@ -242,9 +273,7 @@ export class CallStackView extends ViewPane { this.tree.setInput(this.debugService.getModel()); - const callstackNavigator = new TreeResourceNavigator(this.tree); - this._register(callstackNavigator); - this._register(callstackNavigator.onDidOpenResource(e => { + this._register(this.tree.onDidOpen(e => { if (this.ignoreSelectionChangedEvent) { return; } @@ -294,7 +323,7 @@ export class CallStackView extends ViewPane { } })); const onFocusChange = Event.any(this.debugService.getViewModel().onDidFocusStackFrame, this.debugService.getViewModel().onDidFocusSession); - this._register(onFocusChange(() => { + this._register(onFocusChange(async () => { if (this.ignoreFocusStackFrameEvent) { return; } @@ -307,7 +336,7 @@ export class CallStackView extends ViewPane { return; } - this.updateTreeSelection(); + await this.updateTreeSelection(); })); this._register(this.tree.onContextMenu(e => this.onContextMenu(e))); @@ -323,10 +352,12 @@ export class CallStackView extends ViewPane { })); this._register(this.debugService.onDidNewSession(s => { - this._register(s.onDidChangeName(() => this.tree.rerender(s))); + const sessionListeners: IDisposable[] = []; + sessionListeners.push(s.onDidChangeName(() => this.tree.rerender(s))); + sessionListeners.push(s.onDidEndAdapter(() => dispose(sessionListeners))); if (s.parentSession) { - // Auto expand sessions that have sub sessions - this.parentSessionToExpand.add(s.parentSession); + // A session we already expanded has a new child session, allow to expand it again. + this.autoExpandedSessions.delete(s.parentSession); } })); } @@ -340,7 +371,7 @@ export class CallStackView extends ViewPane { this.tree.domFocus(); } - private updateTreeSelection(): void { + private async updateTreeSelection(): Promise { if (!this.tree || !this.tree.getInput()) { // Tree not initialized yet return; @@ -373,20 +404,18 @@ export class CallStackView extends ViewPane { updateSelectionAndReveal(session); } } else { - const expandPromises = [() => ignoreErrors(this.tree.expand(thread))]; - let s: IDebugSession | undefined = thread.session; - while (s) { - const sessionToExpand = s; - expandPromises.push(() => ignoreErrors(this.tree.expand(sessionToExpand))); - s = s.parentSession; - } + // Ignore errors from this expansions because we are not aware if we rendered the threads and sessions or we hide them to declutter the view + try { + await expandTo(thread.session, this.tree); + } catch (e) { } + try { + await this.tree.expand(thread); + } catch (e) { } - sequence(expandPromises.reverse()).then(() => { - const toReveal = stackFrame || session; - if (toReveal) { - updateSelectionAndReveal(toReveal); - } - }); + const toReveal = stackFrame || session; + if (toReveal) { + updateSelectionAndReveal(toReveal); + } } } @@ -454,7 +483,7 @@ interface IStackFrameTemplateData { actionBar: ActionBar; } -class SessionsRenderer implements ITreeRenderer { +class SessionsRenderer implements ICompressibleTreeRenderer { static readonly ID = 'session'; constructor( @@ -492,13 +521,22 @@ class SessionsRenderer implements ITreeRenderer, _: number, data: ISessionTemplateData): void { - const session = element.element; + this.doRenderElement(element.element, createMatches(element.filterData), data); + } + + renderCompressedElements(node: ITreeNode, FuzzyScore>, index: number, templateData: ISessionTemplateData, height: number | undefined): void { + const lastElement = node.element.elements[node.element.elements.length - 1]; + const matches = createMatches(node.filterData); + this.doRenderElement(lastElement, matches, templateData); + } + + private doRenderElement(session: IDebugSession, matches: IMatch[], data: ISessionTemplateData): void { data.session.title = nls.localize({ key: 'session', comment: ['Session is a noun'] }, "Session"); - data.label.set(session.getLabel(), createMatches(element.filterData)); + data.label.set(session.getLabel(), matches); const thread = session.getAllThreads().find(t => t.stopped); const setActionBar = () => { - const actions = getActions(this.instantiationService, element.element); + const actions = getActions(this.instantiationService, session); const primary: IAction[] = actions; const secondary: IAction[] = []; @@ -533,7 +571,7 @@ class SessionsRenderer implements ITreeRenderer { +class ThreadsRenderer implements ICompressibleTreeRenderer { static readonly ID = 'thread'; constructor(private readonly instantiationService: IInstantiationService) { } @@ -564,12 +602,16 @@ class ThreadsRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: IThreadTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: IThreadTemplateData): void { templateData.actionBar.dispose(); } } -class StackFramesRenderer implements ITreeRenderer { +class StackFramesRenderer implements ICompressibleTreeRenderer { static readonly ID = 'stackFrame'; constructor( @@ -631,12 +673,16 @@ class StackFramesRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: IStackFrameTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: IStackFrameTemplateData): void { templateData.actionBar.dispose(); } } -class ErrorsRenderer implements ITreeRenderer { +class ErrorsRenderer implements ICompressibleTreeRenderer { static readonly ID = 'error'; get templateId(): string { @@ -655,12 +701,16 @@ class ErrorsRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: IErrorTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: IErrorTemplateData): void { // noop } } -class LoadMoreRenderer implements ITreeRenderer { +class LoadMoreRenderer implements ICompressibleTreeRenderer { static readonly ID = 'loadMore'; static readonly LABEL = nls.localize('loadMoreStackFrames', "Load More Stack Frames"); @@ -685,12 +735,16 @@ class LoadMoreRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: ILabelTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: ILabelTemplateData): void { templateData.toDispose.dispose(); } } -class ShowMoreRenderer implements ITreeRenderer { +class ShowMoreRenderer implements ICompressibleTreeRenderer { static readonly ID = 'showMore'; constructor(private readonly themeService: IThemeService) { } @@ -720,6 +774,10 @@ class ShowMoreRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: ILabelTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: ILabelTemplateData): void { templateData.toDispose.dispose(); } @@ -1044,3 +1102,24 @@ class ContinueAction extends Action { return this.commandService.executeCommand(CONTINUE_ID, undefined, getContext(this.thread)); } } + +class CallStackCompressionDelegate implements ITreeCompressionDelegate { + + constructor(private readonly debugService: IDebugService) { } + + isIncompressible(stat: CallStackItem): boolean { + if (isDebugSession(stat)) { + if (stat.compact) { + return false; + } + const sessions = this.debugService.getModel().getSessions(); + if (sessions.some(s => s.parentSession === stat && s.compact)) { + return false; + } + + return true; + } + + return true; + } +} diff --git a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts index f74aee1f758..20150caa071 100644 --- a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -185,7 +185,7 @@ Registry.as(QuickAccessExtensions.Quickaccess).registerQui }); // register service -registerSingleton(IDebugService, service.DebugService); +registerSingleton(IDebugService, service.DebugService, true); // Register configuration const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); diff --git a/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts b/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts index 3a58d54b58c..4e0766cb2a5 100644 --- a/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts @@ -252,7 +252,9 @@ export class FocusSessionActionViewItem extends SelectActionViewItem { })); this._register(this.debugService.onDidNewSession(session => { - this._register(session.onDidChangeName(() => this.update())); + const sessionListeners: IDisposable[] = []; + sessionListeners.push(session.onDidChangeName(() => this.update())); + sessionListeners.push(session.onDidEndAdapter(() => dispose(sessionListeners))); this.update(); })); this.getSessions().forEach(session => { diff --git a/src/vs/workbench/contrib/debug/browser/debugActions.ts b/src/vs/workbench/contrib/debug/browser/debugActions.ts index 594b0a8ce1c..afcae8afe40 100644 --- a/src/vs/workbench/contrib/debug/browser/debugActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActions.ts @@ -98,7 +98,10 @@ export class ConfigureAction extends AbstractDebugAction { launch = launches[0]; } else { const picks = launches.map(l => ({ label: l.name, launch: l })); - const picked = await this.quickInputService.pick<{ label: string, launch: ILaunch }>(picks, { activeItem: picks[0], placeHolder: nls.localize('selectWorkspaceFolder', "Select a workspace folder to create a launch.json file in or add it to the workspace config file") }); + const picked = await this.quickInputService.pick<{ label: string, launch: ILaunch }>(picks, { + activeItem: picks[0], + placeHolder: nls.localize({ key: 'selectWorkspaceFolder', comment: ['User picks a workspace folder or a workspace configuration file here. Workspace configuration files can contain settings and thus a launch.json configuration can be written into one.'] }, "Select a workspace folder to create a launch.json file in or add it to the workspace config file") + }); if (picked) { launch = picked.launch; } diff --git a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts index 275bbcc3300..e0ab9d8b528 100644 --- a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; import * as strings from 'vs/base/common/strings'; import * as objects from 'vs/base/common/objects'; @@ -37,7 +37,7 @@ import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cance import { withUndefinedAsNull } from 'vs/base/common/types'; import { sequence } from 'vs/base/common/async'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; -import { first } from 'vs/base/common/arrays'; +import { first, flatten } from 'vs/base/common/arrays'; import { getVisibleAndSorted } from 'vs/workbench/contrib/debug/common/debugUtils'; import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/api/common/extHostTypes'; @@ -46,7 +46,8 @@ jsonRegistry.registerSchema(launchSchemaId, launchSchema); const DEBUG_SELECTED_CONFIG_NAME_KEY = 'debug.selectedconfigname'; const DEBUG_SELECTED_ROOT = 'debug.selectedroot'; -const DEBUG_SELECTED_CONFIG = 'debug.selectedconfig'; + +interface IDynamicPickItem { label: string, launch: ILaunch, config: IConfig } export class ConfigurationManager implements IConfigurationManager { private debuggers: Debugger[]; @@ -84,12 +85,10 @@ export class ConfigurationManager implements IConfigurationManager { const previousSelectedRoot = this.storageService.get(DEBUG_SELECTED_ROOT, StorageScope.WORKSPACE); const previousSelectedLaunch = this.launches.find(l => l.uri.toString() === previousSelectedRoot); this.debugConfigurationTypeContext = CONTEXT_DEBUG_CONFIGURATION_TYPE.bindTo(contextKeyService); - const storedConfig = this.storageService.get(DEBUG_SELECTED_CONFIG, StorageScope.WORKSPACE); - const selectedConfig = typeof storedConfig === 'string' ? JSON.parse(storedConfig) : undefined; if (previousSelectedLaunch && previousSelectedLaunch.getConfigurationNames().length) { - this.selectConfiguration(previousSelectedLaunch, this.storageService.get(DEBUG_SELECTED_CONFIG_NAME_KEY, StorageScope.WORKSPACE), selectedConfig); + this.selectConfiguration(previousSelectedLaunch, this.storageService.get(DEBUG_SELECTED_CONFIG_NAME_KEY, StorageScope.WORKSPACE)); } else if (this.launches.length > 0) { - this.selectConfiguration(undefined, selectedConfig ? selectedConfig.name : undefined, selectedConfig); + this.selectConfiguration(undefined); } } @@ -254,23 +253,60 @@ export class ConfigurationManager implements IConfigurationManager { async getDynamicProviders(): Promise<{ label: string, pick: () => Promise<{ launch: ILaunch, config: IConfig } | undefined> }[]> { const extensions = await this.extensionService.getExtensions(); const onDebugDynamicConfigurationsName = 'onDebugDynamicConfigurations'; - const debugDynamicExtensionsTypes = extensions.map(e => { - const activationEvent = e.activationEvents && e.activationEvents.find(e => e.includes(onDebugDynamicConfigurationsName)); - if (activationEvent) { - const type = activationEvent.substr(onDebugDynamicConfigurationsName.length + 1); - return type || (e.contributes && e.contributes.debuggers && e.contributes.debuggers.length ? e.contributes.debuggers[0].type : undefined); + const debugDynamicExtensionsTypes = extensions.reduce((acc, e) => { + if (!e.activationEvents) { + return acc; } - return undefined; - }).filter(type => typeof type === 'string' && !!this.getDebuggerLabel(type)) as string[]; + const explicitTypes: string[] = []; + let hasGenericEvent = false; + for (const event of e.activationEvents) { + if (event === onDebugDynamicConfigurationsName) { + hasGenericEvent = true; + } else if (event.startsWith(`${onDebugDynamicConfigurationsName}:`)) { + explicitTypes.push(event.slice(onDebugDynamicConfigurationsName.length + 1)); + } + } + + if (explicitTypes.length) { + return acc.concat(explicitTypes); + } + + if (hasGenericEvent) { + const debuggerType = e.contributes?.debuggers?.[0].type; + return debuggerType ? acc.concat(debuggerType) : acc; + } + + return acc; + }, [] as string[]); return debugDynamicExtensionsTypes.map(type => { return { label: this.getDebuggerLabel(type)!, pick: async () => { + const disposables = new DisposableStore(); + const input = disposables.add(this.quickInputService.createQuickPick()); + input.busy = true; + input.placeholder = nls.localize('selectConfiguration', "Select Launch Configuration"); + input.show(); + + let chosenDidCancel = false; + const chosenPromise = new Promise(resolve => { + disposables.add(input.onDidAccept(() => resolve(input.activeItems[0]))); + disposables.add(input.onDidTriggerItemButton(async (context) => { + resolve(undefined); + const { launch, config } = context.item; + await launch.openConfigFile(false, config.type); + // Only Launch have a pin trigger button + await (launch as Launch).writeConfiguration(config); + this.selectConfiguration(launch, config.name); + })); + disposables.add(input.onDidHide(() => { chosenDidCancel = true; resolve(); })); + }); + await this.activateDebuggers(onDebugDynamicConfigurationsName, type); const token = new CancellationTokenSource(); - const picks: Promise<{ label: string, launch: ILaunch, config: IConfig }[]>[] = []; + const picks: Promise[] = []; const provider = this.configProviders.filter(p => p.type === type && p.triggerKind === DebugConfigurationProviderTriggerKind.Dynamic && p.provideDebugConfigurations)[0]; this.getLaunches().forEach(launch => { if (launch.workspace && provider) { @@ -285,25 +321,30 @@ export class ConfigurationManager implements IConfigurationManager { })))); } }); - const promiseOfPicks = Promise.all(picks).then(result => result.reduce((first, second) => first.concat(second), [])); - const result = await this.quickInputService.pick<{ label: string, launch: ILaunch, config: IConfig }>(promiseOfPicks, { - placeHolder: nls.localize('selectConfiguration', "Select Launch Configuration"), - onDidTriggerItemButton: async (context) => { - await this.quickInputService.cancel(); - const { launch, config } = context.item; - await launch.openConfigFile(false, config.type); - // Only Launch have a pin trigger button - await (launch as Launch).writeConfiguration(config); - this.selectConfiguration(launch, config.name); - } - }); - if (!result) { - // User canceled quick input we should notify the provider to cancel computing configurations - token.cancel(); + const nestedPicks = await Promise.all(picks); + const items = flatten(nestedPicks); + + let chosen: IDynamicPickItem | undefined; + + // If there's exactly one item to choose from, pick it automatically + if (items.length === 1 && !chosenDidCancel) { + chosen = items[0]; + } else { + input.items = items; + input.busy = false; + chosen = await chosenPromise; } - return result; + disposables.dispose(); + + if (!chosen) { + // User canceled quick input we should notify the provider to cancel computing configurations + token.cancel(); + return; + } + + return chosen; } }; }); @@ -483,13 +524,12 @@ export class ConfigurationManager implements IConfigurationManager { this.setSelectedLaunchName(names.length ? names[0] : undefined); } - this.selectedConfig = config || (this.selectedLaunch && this.selectedName ? this.selectedLaunch.getConfiguration(this.selectedName) : undefined); - if (this.selectedConfig) { - this.debugConfigurationTypeContext.set(this.selectedConfig.type); - this.storageService.store(DEBUG_SELECTED_CONFIG, JSON.stringify(this.selectedConfig), StorageScope.WORKSPACE); + this.selectedConfig = config; + const configForType = this.selectedConfig || (this.selectedLaunch && this.selectedName ? this.selectedLaunch.getConfiguration(this.selectedName) : undefined); + if (configForType) { + this.debugConfigurationTypeContext.set(configForType.type); } else { this.debugConfigurationTypeContext.reset(); - this.storageService.remove(DEBUG_SELECTED_CONFIG, StorageScope.WORKSPACE); } if (this.selectedLaunch !== previousLaunch || this.selectedName !== previousName) { @@ -720,6 +760,9 @@ class Launch extends AbstractLaunch implements ILaunch { async writeConfiguration(configuration: IConfig): Promise { const fullConfig = objects.deepClone(this.getConfig()!); + if (!fullConfig.configurations) { + fullConfig.configurations = []; + } fullConfig.configurations.push(configuration); await this.configurationService.updateValue('launch', fullConfig, { resource: this.workspace.uri }, ConfigurationTarget.WORKSPACE_FOLDER); } diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts index cc83424ab1c..c7249d02612 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts @@ -247,7 +247,7 @@ class ShowDebugHoverAction extends EditorAction { class StepIntoTargetsAction extends EditorAction { public static readonly ID = 'editor.debug.action.stepIntoTargets'; - public static readonly LABEL = nls.localize('stepIntoTargets', "Step Into Targets..."); + public static readonly LABEL = nls.localize({ key: 'stepIntoTargets', comment: ['Step Into Targets lets the user step into an exact function he or she is interested in.'] }, "Step Into Targets..."); constructor() { super({ diff --git a/src/vs/workbench/contrib/debug/browser/debugProgress.ts b/src/vs/workbench/contrib/debug/browser/debugProgress.ts index 9b7d893b385..6a8ef0397c2 100644 --- a/src/vs/workbench/contrib/debug/browser/debugProgress.ts +++ b/src/vs/workbench/contrib/debug/browser/debugProgress.ts @@ -8,14 +8,16 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IDebugService, VIEWLET_ID, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { IViewsService } from 'vs/workbench/common/views'; export class DebugProgressContribution implements IWorkbenchContribution { private toDispose: IDisposable[] = []; constructor( - @IDebugService private readonly debugService: IDebugService, - @IProgressService private readonly progressService: IProgressService + @IDebugService debugService: IDebugService, + @IProgressService progressService: IProgressService, + @IViewsService viewsService: IViewsService ) { let progressListener: IDisposable | undefined; const listenOnProgress = (session: IDebugSession | undefined) => { @@ -34,9 +36,11 @@ export class DebugProgressContribution implements IWorkbenchContribution { }); }); - this.progressService.withProgress({ location: VIEWLET_ID }, () => promise); - const source = this.debugService.getConfigurationManager().getDebuggerLabel(session.configuration.type); - this.progressService.withProgress({ + if (viewsService.isViewContainerVisible(VIEWLET_ID)) { + progressService.withProgress({ location: VIEWLET_ID }, () => promise); + } + const source = debugService.getConfigurationManager().getDebuggerLabel(session.configuration.type); + progressService.withProgress({ location: ProgressLocation.Notification, title: progressStartEvent.body.title, cancellable: progressStartEvent.body.cancellable, @@ -72,9 +76,9 @@ export class DebugProgressContribution implements IWorkbenchContribution { }); } }; - this.toDispose.push(this.debugService.getViewModel().onDidFocusSession(listenOnProgress)); - listenOnProgress(this.debugService.getViewModel().focusedSession); - this.toDispose.push(this.debugService.onWillNewSession(session => { + this.toDispose.push(debugService.getViewModel().onDidFocusSession(listenOnProgress)); + listenOnProgress(debugService.getViewModel().focusedSession); + this.toDispose.push(debugService.onWillNewSession(session => { if (!progressListener) { listenOnProgress(session); } diff --git a/src/vs/workbench/contrib/debug/browser/debugService.ts b/src/vs/workbench/contrib/debug/browser/debugService.ts index f884a36d4bb..71cab8c94c1 100644 --- a/src/vs/workbench/contrib/debug/browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugService.ts @@ -61,11 +61,11 @@ export class DebugService implements IDebugService { private taskRunner: DebugTaskRunner; private configurationManager: ConfigurationManager; private toDispose: IDisposable[]; - private debugType: IContextKey; - private debugState: IContextKey; - private inDebugMode: IContextKey; - private debugUx: IContextKey; - private breakpointsExist: IContextKey; + private debugType!: IContextKey; + private debugState!: IContextKey; + private inDebugMode!: IContextKey; + private debugUx!: IContextKey; + private breakpointsExist!: IContextKey; private breakpointsToSendOnResourceSaved: Set; private initializing = false; private previousState: State | undefined; @@ -80,7 +80,7 @@ export class DebugService implements IDebugService { @IDialogService private readonly dialogService: IDialogService, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @IContextKeyService contextKeyService: IContextKeyService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, @ILifecycleService private readonly lifecycleService: ILifecycleService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IExtensionService private readonly extensionService: IExtensionService, @@ -101,17 +101,19 @@ export class DebugService implements IDebugService { this.configurationManager = this.instantiationService.createInstance(ConfigurationManager); this.toDispose.push(this.configurationManager); - this.debugType = CONTEXT_DEBUG_TYPE.bindTo(contextKeyService); - this.debugState = CONTEXT_DEBUG_STATE.bindTo(contextKeyService); - this.inDebugMode = CONTEXT_IN_DEBUG_MODE.bindTo(contextKeyService); - this.debugUx = CONTEXT_DEBUG_UX.bindTo(contextKeyService); - this.debugUx.set(!!this.configurationManager.selectedConfiguration.name ? 'default' : 'simple'); + contextKeyService.bufferChangeEvents(() => { + this.debugType = CONTEXT_DEBUG_TYPE.bindTo(contextKeyService); + this.debugState = CONTEXT_DEBUG_STATE.bindTo(contextKeyService); + this.inDebugMode = CONTEXT_IN_DEBUG_MODE.bindTo(contextKeyService); + this.debugUx = CONTEXT_DEBUG_UX.bindTo(contextKeyService); + this.debugUx.set(!!this.configurationManager.selectedConfiguration.name ? 'default' : 'simple'); + this.breakpointsExist = CONTEXT_BREAKPOINTS_EXIST.bindTo(contextKeyService); + }); this.debugStorage = this.instantiationService.createInstance(DebugStorage); this.model = this.instantiationService.createInstance(DebugModel, this.debugStorage); this.telemetry = this.instantiationService.createInstance(DebugTelemetry, this.model); const setBreakpointsExistContext = () => this.breakpointsExist.set(!!(this.model.getBreakpoints().length || this.model.getDataBreakpoints().length || this.model.getFunctionBreakpoints().length)); - this.breakpointsExist = CONTEXT_BREAKPOINTS_EXIST.bindTo(contextKeyService); setBreakpointsExistContext(); this.viewModel = new ViewModel(contextKeyService); @@ -229,10 +231,12 @@ export class DebugService implements IDebugService { private onStateChange(): void { const state = this.state; if (this.previousState !== state) { - this.debugState.set(getStateLabel(state)); - this.inDebugMode.set(state !== State.Inactive); - // Only show the simple ux if debug is not yet started and if no launch.json exists - this.debugUx.set(((state !== State.Inactive && state !== State.Initializing) || this.configurationManager.selectedConfiguration.name) ? 'default' : 'simple'); + this.contextKeyService.bufferChangeEvents(() => { + this.debugState.set(getStateLabel(state)); + this.inDebugMode.set(state !== State.Inactive); + // Only show the simple ux if debug is not yet started and if no launch.json exists + this.debugUx.set(((state !== State.Inactive && state !== State.Initializing) || this.configurationManager.selectedConfiguration.name) ? 'default' : 'simple'); + }); this.previousState = state; this._onDidChangeState.fire(state); } @@ -344,8 +348,8 @@ export class DebugService implements IDebugService { } if (configOrName && !config) { - const message = !!launch ? nls.localize('configMissing', "Configuration '{0}' is missing in 'launch.json'.", typeof configOrName === 'string' ? configOrName : JSON.stringify(configOrName)) : - nls.localize('launchJsonDoesNotExist', "'launch.json' does not exist."); + const message = !!launch ? nls.localize('configMissing', "Configuration '{0}' is missing in 'launch.json'.", typeof configOrName === 'string' ? configOrName : configOrName.name) : + nls.localize('launchJsonDoesNotExist', "'launch.json' does not exist for passed workspace folder."); throw new Error(message); } @@ -354,6 +358,7 @@ export class DebugService implements IDebugService { return result; } catch (err) { // make sure to get out of initializing state, and propagate the result + this.notificationService.error(err); this.endInitializingState(); return Promise.reject(err); } @@ -376,8 +381,6 @@ export class DebugService implements IDebugService { config!.noDebug = true; } else if (options && typeof options.noDebug === 'undefined' && options.parentSession && options.parentSession.configuration.noDebug) { config!.noDebug = true; - } else { - delete config!.noDebug; } const unresolvedConfig = deepClone(config); diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index 8794d1eb7d4..f6d4e37cbb8 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -129,6 +129,10 @@ export class DebugSession implements IDebugSession { return this._options.parentSession; } + get compact(): boolean { + return !!this._options.compact; + } + setConfiguration(configuration: { resolved: IConfig, unresolved: IConfig | undefined }) { this._configuration = configuration; } diff --git a/src/vs/workbench/contrib/debug/browser/debugTaskRunner.ts b/src/vs/workbench/contrib/debug/browser/debugTaskRunner.ts index 7ea7a2c36fc..689328eb3f1 100644 --- a/src/vs/workbench/contrib/debug/browser/debugTaskRunner.ts +++ b/src/vs/workbench/contrib/debug/browser/debugTaskRunner.ts @@ -69,7 +69,7 @@ export class DebugTaskRunner { return TaskRunResult.Success; } if (onTaskErrors === 'showErrors') { - await this.viewsService.openView(Constants.MARKERS_VIEW_ID); + await this.viewsService.openView(Constants.MARKERS_VIEW_ID, true); return Promise.resolve(TaskRunResult.Failure); } if (onTaskErrors === 'abort') { @@ -106,7 +106,7 @@ export class DebugTaskRunner { return TaskRunResult.Success; } - await this.viewsService.openView(Constants.MARKERS_VIEW_ID); + await this.viewsService.openView(Constants.MARKERS_VIEW_ID, true); return Promise.resolve(TaskRunResult.Failure); } catch (err) { await onError(err.message, [this.taskService.configureAction()]); diff --git a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts index f3577d18bd0..0b082ed02bf 100644 --- a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts @@ -364,7 +364,7 @@ registerThemingParticipant((theme, collector) => { const debugIconStopColor = theme.getColor(debugIconStopForeground); if (debugIconStopColor) { - collector.addRule(`.monaco-workbench .codicon-debug-stop { color: ${debugIconStopColor} !important; }`); + collector.addRule(`.monaco-workbench .codicon-debug-stop, .monaco-workbench .debug-view-content .codicon-record { color: ${debugIconStopColor} !important; }`); } const debugIconDisconnectColor = theme.getColor(debugIconDisconnectForeground); diff --git a/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts b/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts index 3d297be710d..ee999b258b5 100644 --- a/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts +++ b/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts @@ -6,7 +6,7 @@ import { ExtensionHostDebugChannelClient, ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; +import { IExtensionHostDebugService, IOpenExtensionWindowResult } from 'vs/platform/debug/common/extensionHostDebug'; import { IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; @@ -62,7 +62,7 @@ class BrowserExtensionHostDebugService extends ExtensionHostDebugChannelClient i })); } - openExtensionDevelopmentHostWindow(args: string[], env: IProcessEnvironment): Promise { + async openExtensionDevelopmentHostWindow(args: string[], env: IProcessEnvironment): Promise { // Find out which workspace to open debug window on let debugWorkspace: IWorkspace = undefined; @@ -110,10 +110,12 @@ class BrowserExtensionHostDebugService extends ExtensionHostDebugChannelClient i } // Open debug window as new window. Pass ParsedArgs over. - return this.workspaceProvider.open(debugWorkspace, { + await this.workspaceProvider.open(debugWorkspace, { reuse: false, // debugging always requires a new window payload: Array.from(environment.entries()) // mandatory properties to enable debugging }); + + return {}; } private findArgument(key: string, args: string[]): string | undefined { @@ -128,7 +130,7 @@ class BrowserExtensionHostDebugService extends ExtensionHostDebugChannelClient i } } -registerSingleton(IExtensionHostDebugService, BrowserExtensionHostDebugService); +registerSingleton(IExtensionHostDebugService, BrowserExtensionHostDebugService, true); class BrowserDebugHelperService implements IDebugHelperService { @@ -139,4 +141,4 @@ class BrowserDebugHelperService implements IDebugHelperService { } } -registerSingleton(IDebugHelperService, BrowserDebugHelperService); +registerSingleton(IDebugHelperService, BrowserDebugHelperService, true); diff --git a/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts b/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts index 3a160385f6d..96bab8f09ee 100644 --- a/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts +++ b/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts @@ -28,7 +28,7 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ITreeNode, ITreeFilter, TreeVisibility, TreeFilterResult, ITreeElement } from 'vs/base/browser/ui/tree/tree'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { TreeResourceNavigator, WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService'; +import { WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService'; import { dispose } from 'vs/base/common/lifecycle'; import { createMatches, FuzzyScore } from 'vs/base/common/filters'; import { DebugContentProvider } from 'vs/workbench/contrib/debug/common/debugContentProvider'; @@ -310,7 +310,7 @@ class SessionTreeItem extends BaseTreeItem { return 999; } - addPath(source: Source): void { + async addPath(source: Source): Promise { let folder: IWorkspaceFolder | null; let url: string; @@ -347,9 +347,8 @@ class SessionTreeItem extends BaseTreeItem { } else { // on unix try to tildify absolute paths path = normalize(path); - const userHome = this._pathService.resolvedUserHome; - if (userHome && !isWindows) { - path = tildify(path, userHome.fsPath); + if (!isWindows) { + path = tildify(path, (await this._pathService.userHome()).fsPath); } } } @@ -491,9 +490,7 @@ export class LoadedScriptsView extends ViewPane { }, 300); this._register(this.changeScheduler); - const loadedScriptsNavigator = new TreeResourceNavigator(this.tree); - this._register(loadedScriptsNavigator); - this._register(loadedScriptsNavigator.onDidOpenResource(e => { + this._register(this.tree.onDidOpen(e => { if (e.element instanceof BaseTreeItem) { const source = e.element.getSource(); if (source && source.available) { @@ -520,27 +517,28 @@ export class LoadedScriptsView extends ViewPane { } }; - const addSourcePathsToSession = (session: IDebugSession) => { + const addSourcePathsToSession = async (session: IDebugSession) => { const sessionNode = root.add(session); - return session.getLoadedSources().then(paths => { - paths.forEach(path => sessionNode.addPath(path)); - scheduleRefreshOnVisible(); - }); + const paths = await session.getLoadedSources(); + for (const path of paths) { + await sessionNode.addPath(path); + } + scheduleRefreshOnVisible(); }; const registerSessionListeners = (session: IDebugSession) => { - this._register(session.onDidChangeName(() => { + this._register(session.onDidChangeName(async () => { // Re-add session, this will trigger proper sorting and id recalculation. root.remove(session.getId()); - addSourcePathsToSession(session); + await addSourcePathsToSession(session); })); - this._register(session.onDidLoadedSource(event => { + this._register(session.onDidLoadedSource(async event => { let sessionRoot: SessionTreeItem; switch (event.reason) { case 'new': case 'changed': sessionRoot = root.add(session); - sessionRoot.addPath(event.source); + await sessionRoot.addPath(event.source); scheduleRefreshOnVisible(); if (event.reason === 'changed') { DebugContentProvider.refreshDebugContent(event.source.uri); diff --git a/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css index d3a0bcd5377..3ab3a5c63ef 100644 --- a/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css +++ b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css @@ -51,6 +51,8 @@ margin-top: 0px; cursor: pointer; line-height: inherit; + padding-top: 0; + padding-bottom: 0; } .monaco-workbench .monaco-action-bar .start-debug-action-item .configuration.disabled .monaco-select-box { @@ -75,7 +77,10 @@ cursor: initial; } -/* Make icons the same color as the list foreground on focus selection */ +/* Make icons and text the same color as the list foreground on focus selection */ +.debug-pane .monaco-list:focus .monaco-list-row.selected .state > .label, +.debug-pane .monaco-list:focus .monaco-list-row.selected.focused .state > .label, +.debug-pane .monaco-list:focus .monaco-list-row.selected .codicon, .debug-pane .monaco-list:focus .monaco-list-row.selected.focused .codicon { color: inherit !important; } @@ -137,6 +142,7 @@ .debug-pane .debug-call-stack .monaco-list-row .monaco-action-bar { display: none; flex-shrink: 0; + margin-right: 1px; } .debug-pane .debug-call-stack .monaco-list-row:hover .monaco-action-bar { diff --git a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index 5fa487c2a76..a400dde3bd5 100644 --- a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -12,7 +12,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { formatPII, isUri } from 'vs/workbench/contrib/debug/common/debugUtils'; import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger } from 'vs/workbench/contrib/debug/common/debug'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; -import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; +import { IExtensionHostDebugService, IOpenExtensionWindowResult } from 'vs/platform/debug/common/extensionHostDebug'; import { URI } from 'vs/base/common/uri'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { env as processEnv } from 'vs/base/common/process'; @@ -33,6 +33,7 @@ interface ILaunchVSCodeArgument { interface ILaunchVSCodeArguments { args: ILaunchVSCodeArgument[]; + debugRenderer?: boolean; env?: { [key: string]: string | null; }; } @@ -550,8 +551,9 @@ export class RawDebugSession implements IDisposable { switch (request.command) { case 'launchVSCode': - this.launchVsCode(request.arguments).then(_ => { + this.launchVsCode(request.arguments).then(result => { response.body = { + rendererDebugPort: result.rendererDebugPort, //processId: pid }; safeSendResponse(response); @@ -584,7 +586,7 @@ export class RawDebugSession implements IDisposable { } } - private launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise { + private launchVsCode(vscodeArgs: ILaunchVSCodeArguments): Promise { const args: string[] = []; @@ -612,7 +614,7 @@ export class RawDebugSession implements IDisposable { Object.keys(env).filter(k => env[k] === null).forEach(key => delete env[key]); } - return this.extensionHostDebugService.openExtensionDevelopmentHostWindow(args, env); + return this.extensionHostDebugService.openExtensionDevelopmentHostWindow(args, env, !!vscodeArgs.debugRenderer); } private send(command: string, args: any, token?: CancellationToken, timeout?: number): Promise { diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index fc829036362..326bfb8c80c 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -606,6 +606,20 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget { await this.clipboardService.writeText(this.getVisibleContent()); return Promise.resolve(); })); + actions.push(new Action('debug.replPaste', localize('paste', "Paste"), undefined, this.debugService.state !== State.Inactive, async () => { + const clipboardText = await this.clipboardService.readText(); + if (clipboardText) { + this.replInput.setValue(this.replInput.getValue().concat(clipboardText)); + this.replInput.focus(); + const model = this.replInput.getModel(); + const lineNumber = model ? model.getLineCount() : 0; + const column = model?.getLineMaxColumn(lineNumber); + if (typeof lineNumber === 'number' && typeof column === 'number') { + this.replInput.setPosition({ lineNumber, column }); + } + } + })); + actions.push(new Separator()); actions.push(new Action('debug.collapseRepl', localize('collapse', "Collapse All"), undefined, true, () => { this.tree.collapseAll(); this.replInput.focus(); diff --git a/src/vs/workbench/contrib/debug/browser/replViewer.ts b/src/vs/workbench/contrib/debug/browser/replViewer.ts index 3284b8caa70..ea99871de6d 100644 --- a/src/vs/workbench/contrib/debug/browser/replViewer.ts +++ b/src/vs/workbench/contrib/debug/browser/replViewer.ts @@ -362,10 +362,10 @@ export class ReplAccessibilityProvider implements IListAccessibilityProvider(); private readonly _onDidSelectExpression = new Emitter(); private multiSessionView: boolean; - private expressionSelectedContextKey: IContextKey; - private breakpointSelectedContextKey: IContextKey; - private loadedScriptsSupportedContextKey: IContextKey; - private stepBackSupportedContextKey: IContextKey; - private focusedSessionIsAttach: IContextKey; - private restartFrameSupportedContextKey: IContextKey; - private stepIntoTargetsSupported: IContextKey; - private jumpToCursorSupported: IContextKey; + private expressionSelectedContextKey!: IContextKey; + private breakpointSelectedContextKey!: IContextKey; + private loadedScriptsSupportedContextKey!: IContextKey; + private stepBackSupportedContextKey!: IContextKey; + private focusedSessionIsAttach!: IContextKey; + private restartFrameSupportedContextKey!: IContextKey; + private stepIntoTargetsSupported!: IContextKey; + private jumpToCursorSupported!: IContextKey; - constructor(contextKeyService: IContextKeyService) { + constructor(private contextKeyService: IContextKeyService) { this.multiSessionView = false; - this.expressionSelectedContextKey = CONTEXT_EXPRESSION_SELECTED.bindTo(contextKeyService); - this.breakpointSelectedContextKey = CONTEXT_BREAKPOINT_SELECTED.bindTo(contextKeyService); - this.loadedScriptsSupportedContextKey = CONTEXT_LOADED_SCRIPTS_SUPPORTED.bindTo(contextKeyService); - this.stepBackSupportedContextKey = CONTEXT_STEP_BACK_SUPPORTED.bindTo(contextKeyService); - this.focusedSessionIsAttach = CONTEXT_FOCUSED_SESSION_IS_ATTACH.bindTo(contextKeyService); - this.restartFrameSupportedContextKey = CONTEXT_RESTART_FRAME_SUPPORTED.bindTo(contextKeyService); - this.stepIntoTargetsSupported = CONTEXT_STEP_INTO_TARGETS_SUPPORTED.bindTo(contextKeyService); - this.jumpToCursorSupported = CONTEXT_JUMP_TO_CURSOR_SUPPORTED.bindTo(contextKeyService); + contextKeyService.bufferChangeEvents(() => { + this.expressionSelectedContextKey = CONTEXT_EXPRESSION_SELECTED.bindTo(contextKeyService); + this.breakpointSelectedContextKey = CONTEXT_BREAKPOINT_SELECTED.bindTo(contextKeyService); + this.loadedScriptsSupportedContextKey = CONTEXT_LOADED_SCRIPTS_SUPPORTED.bindTo(contextKeyService); + this.stepBackSupportedContextKey = CONTEXT_STEP_BACK_SUPPORTED.bindTo(contextKeyService); + this.focusedSessionIsAttach = CONTEXT_FOCUSED_SESSION_IS_ATTACH.bindTo(contextKeyService); + this.restartFrameSupportedContextKey = CONTEXT_RESTART_FRAME_SUPPORTED.bindTo(contextKeyService); + this.stepIntoTargetsSupported = CONTEXT_STEP_INTO_TARGETS_SUPPORTED.bindTo(contextKeyService); + this.jumpToCursorSupported = CONTEXT_JUMP_TO_CURSOR_SUPPORTED.bindTo(contextKeyService); + }); } getId(): string { @@ -66,13 +68,15 @@ export class ViewModel implements IViewModel { this._focusedThread = thread; this._focusedSession = session; - this.loadedScriptsSupportedContextKey.set(session ? !!session.capabilities.supportsLoadedSourcesRequest : false); - this.stepBackSupportedContextKey.set(session ? !!session.capabilities.supportsStepBack : false); - this.restartFrameSupportedContextKey.set(session ? !!session.capabilities.supportsRestartFrame : false); - this.stepIntoTargetsSupported.set(session ? !!session.capabilities.supportsStepInTargetsRequest : false); - this.jumpToCursorSupported.set(session ? !!session.capabilities.supportsGotoTargetsRequest : false); - const attach = !!session && isSessionAttach(session); - this.focusedSessionIsAttach.set(attach); + this.contextKeyService.bufferChangeEvents(() => { + this.loadedScriptsSupportedContextKey.set(session ? !!session.capabilities.supportsLoadedSourcesRequest : false); + this.stepBackSupportedContextKey.set(session ? !!session.capabilities.supportsStepBack : false); + this.restartFrameSupportedContextKey.set(session ? !!session.capabilities.supportsRestartFrame : false); + this.stepIntoTargetsSupported.set(session ? !!session.capabilities.supportsStepInTargetsRequest : false); + this.jumpToCursorSupported.set(session ? !!session.capabilities.supportsGotoTargetsRequest : false); + const attach = !!session && isSessionAttach(session); + this.focusedSessionIsAttach.set(attach); + }); if (shouldEmitForSession) { this._onDidFocusSession.fire(session); diff --git a/src/vs/workbench/contrib/debug/node/debugHelperService.ts b/src/vs/workbench/contrib/debug/node/debugHelperService.ts index 572aa40489c..4089f00771a 100644 --- a/src/vs/workbench/contrib/debug/node/debugHelperService.ts +++ b/src/vs/workbench/contrib/debug/node/debugHelperService.ts @@ -47,4 +47,4 @@ export class NodeDebugHelperService implements IDebugHelperService { } } -registerSingleton(IDebugHelperService, NodeDebugHelperService); +registerSingleton(IDebugHelperService, NodeDebugHelperService, true); diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index 719360dd924..3c5fcd77c9a 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import * as env from 'vs/base/common/platform'; +import * as platform from 'vs/base/common/platform'; import { WindowsExternalTerminalService, MacExternalTerminalService, LinuxExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; @@ -14,11 +14,11 @@ let externalTerminalService: IExternalTerminalService | undefined = undefined; export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, configProvider: ExtHostConfigProvider): Promise { if (!externalTerminalService) { - if (env.isWindows) { + if (platform.isWindows) { externalTerminalService = new WindowsExternalTerminalService(undefined); - } else if (env.isMacintosh) { + } else if (platform.isMacintosh) { externalTerminalService = new MacExternalTerminalService(undefined); - } else if (env.isLinux) { + } else if (platform.isLinux) { externalTerminalService = new LinuxExternalTerminalService(undefined); } else { throw new Error('external terminals not supported on this platform'); @@ -49,7 +49,7 @@ function spawnAsPromised(command: string, args: string[]): Promise { export function hasChildProcesses(processId: number | undefined): Promise { if (processId) { // if shell has at least one child process, assume that shell is busy - if (env.isWindows) { + if (platform.isWindows) { return spawnAsPromised('wmic', ['process', 'get', 'ParentProcessId']).then(stdout => { const pids = stdout.split('\r\n'); return pids.some(p => parseInt(p) === processId); @@ -75,7 +75,8 @@ export function hasChildProcesses(processId: number | undefined): Promise= 0) { shellType = ShellType.bash; - } else if (env.isWindows) { + } else if (platform.isWindows) { shellType = ShellType.cmd; // pick a good default for Windows } else { shellType = ShellType.bash; // pick a good default for anything else @@ -109,12 +110,12 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments return `'${s}'`; }; - if (args.cwd) { - command += `cd '${args.cwd}'; `; + if (cwd) { + command += `cd '${cwd}'; `; } - if (args.env) { - for (let key in args.env) { - const value = args.env[key]; + if (env) { + for (let key in env) { + const value = env[key]; if (value === null) { command += `Remove-Item env:${key}; `; } else { @@ -122,10 +123,10 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments } } } - if (args.args && args.args.length > 0) { - const cmd = quote(args.args.shift()!); + if (args.length > 0) { + const cmd = quote(args.shift()!); command += (cmd[0] === '\'') ? `& ${cmd} ` : `${cmd} `; - for (let a of args.args) { + for (let a of args) { command += `${quote(a)} `; } } @@ -138,13 +139,13 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments return (s.indexOf(' ') >= 0 || s.indexOf('"') >= 0 || s.length === 0) ? `"${s}"` : s; }; - if (args.cwd) { - command += `cd ${quote(args.cwd)} && `; + if (cwd) { + command += `cd ${quote(cwd)} && `; } - if (args.env) { + if (env) { command += 'cmd /C "'; - for (let key in args.env) { - let value = args.env[key]; + for (let key in env) { + let value = env[key]; if (value === null) { command += `set "${key}=" && `; } else { @@ -153,10 +154,10 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments } } } - for (let a of args.args) { + for (let a of args) { command += `${quote(a)} `; } - if (args.env) { + if (env) { command += '"'; } break; @@ -172,13 +173,13 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments return /[^\w@%\/+=,.:^-]/.test(s) ? `'${s.replace(/'/g, '\'\\\'\'')}'` : s; }; - if (args.cwd) { - command += `cd ${quote(args.cwd)} ; `; + if (cwd) { + command += `cd ${quote(cwd)} ; `; } - if (args.env) { + if (env) { command += 'env'; - for (let key in args.env) { - const value = args.env[key]; + for (let key in env) { + const value = env[key]; if (value === null) { command += ` -u ${hardQuote(key)}`; } else { @@ -187,7 +188,7 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments } command += ' '; } - for (let a of args.args) { + for (let a of args) { command += `${quote(a)} `; } break; diff --git a/src/vs/workbench/contrib/debug/test/common/mockDebug.ts b/src/vs/workbench/contrib/debug/test/common/mockDebug.ts index 966bf04b466..1b3b1f2beba 100644 --- a/src/vs/workbench/contrib/debug/test/common/mockDebug.ts +++ b/src/vs/workbench/contrib/debug/test/common/mockDebug.ts @@ -135,7 +135,6 @@ export class MockDebugService implements IDebugService { } export class MockSession implements IDebugSession { - stepInTargets(frameId: number): Promise<{ id: number; label: string; }[]> { throw new Error('Method not implemented.'); } @@ -158,6 +157,10 @@ export class MockSession implements IDebugSession { subId: string | undefined; + get compact(): boolean { + return false; + } + setSubId(subId: string | undefined): void { throw new Error('Method not implemented.'); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index 4a4090f4c94..1e72361f58f 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -224,23 +224,23 @@ export class ExtensionEditor extends BaseEditor { builtin.textContent = localize('builtin', "Built-in"); const subtitle = append(details, $('.subtitle')); - const publisher = append(subtitle, $('span.publisher.clickable', { title: localize('publisher', "Publisher name"), tabIndex: 0 })); + const publisher = append(append(subtitle, $('.subtitle-entry')), $('span.publisher.clickable', { title: localize('publisher', "Publisher name"), tabIndex: 0 })); - const installCount = append(subtitle, $('span.install', { title: localize('install count', "Install count"), tabIndex: 0 })); + const installCount = append(append(subtitle, $('.subtitle-entry')), $('span.install', { title: localize('install count', "Install count"), tabIndex: 0 })); - const rating = append(subtitle, $('span.rating.clickable', { title: localize('rating', "Rating"), tabIndex: 0 })); + const rating = append(append(subtitle, $('.subtitle-entry')), $('span.rating.clickable', { title: localize('rating', "Rating"), tabIndex: 0 })); - const repository = append(subtitle, $('span.repository.clickable')); + const repository = append(append(subtitle, $('.subtitle-entry')), $('span.repository.clickable')); repository.textContent = localize('repository', 'Repository'); repository.style.display = 'none'; repository.tabIndex = 0; - const license = append(subtitle, $('span.license.clickable')); + const license = append(append(subtitle, $('.subtitle-entry')), $('span.license.clickable')); license.textContent = localize('license', 'License'); license.style.display = 'none'; license.tabIndex = 0; - const version = append(subtitle, $('span.version')); + const version = append(append(subtitle, $('.subtitle-entry')), $('span.version')); version.textContent = localize('version', 'Version'); const description = append(details, $('.description')); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.ts index eba729c554b..1001b15bfd4 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.ts @@ -8,12 +8,13 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { localize } from 'vs/nls'; -import { InstallRecommendedExtensionAction, ShowRecommendedExtensionsAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { InstallRecommendedExtensionAction, ShowRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { ExtensionRecommendationSource, IExtensionRecommendationReson } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IExtensionsConfiguration, ConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; +import { IAction } from 'vs/base/common/actions'; type ExtensionRecommendationsNotificationClassification = { userReaction: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; @@ -56,22 +57,27 @@ export abstract class ExtensionRecommendations extends Disposable { return this._activationPromise; } + private runAction(action: IAction) { + try { + action.run(); + } finally { + action.dispose(); + } + } + protected promptImportantExtensionInstallNotification(extensionId: string, message: string): void { this.notificationService.prompt(Severity.Info, message, [{ label: localize('install', 'Install'), run: () => { this.telemetryService.publicLog2<{ userReaction: string, extensionId: string }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'install', extensionId }); - this.instantiationService.createInstance(InstallRecommendedExtensionAction, extensionId).run(); + this.runAction(this.instantiationService.createInstance(InstallRecommendedExtensionAction, extensionId)); } }, { - label: localize('showRecommendations', "Show Recommendations"), + label: localize('moreInformation', "More Information"), run: () => { this.telemetryService.publicLog2<{ userReaction: string, extensionId: string }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'show', extensionId }); - - const recommendationsAction = this.instantiationService.createInstance(ShowRecommendedExtensionsAction, ShowRecommendedExtensionsAction.ID, localize('showRecommendations', "Show Recommendations")); - recommendationsAction.run(); - recommendationsAction.dispose(); + this.runAction(this.instantiationService.createInstance(ShowRecommendedExtensionAction, extensionId)); } }, { label: choiceNever, diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index e152bd1bc9c..e88cccc9081 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -19,7 +19,7 @@ import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/brow import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, ShowBuiltInExtensionsAction, UpdateAllAction, - EnableAllAction, EnableAllWorkspaceAction, DisableAllAction, DisableAllWorkspaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ConfigureRecommendedExtensionsCommandsContributor, InstallVSIXAction, ReinstallAction, InstallSpecificVersionOfExtensionAction + EnableAllAction, EnableAllWorkspaceAction, DisableAllAction, DisableAllWorkspaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ConfigureRecommendedExtensionsCommandsContributor, InstallVSIXAction, ReinstallAction, InstallSpecificVersionOfExtensionAction, ClearExtensionsSearchResultsAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensionEditor'; @@ -148,10 +148,11 @@ actionRegistry.registerWorkbenchAction(enableAllWorkspaceAction, 'Extensions: En const checkForUpdatesAction = SyncActionDescriptor.from(CheckForUpdatesAction); actionRegistry.registerWorkbenchAction(checkForUpdatesAction, `Extensions: Check for Extension Updates`, ExtensionsLabel); +actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(ClearExtensionsSearchResultsAction), 'Extensions: Clear Extensions Search Results', ExtensionsLabel); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(EnableAutoUpdateAction), `Extensions: Enable Auto Updating Extensions`, ExtensionsLabel); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(DisableAutoUpdateAction), `Extensions: Disable Auto Updating Extensions`, ExtensionsLabel); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(InstallSpecificVersionOfExtensionAction), 'Install Specific Version of Extension...', ExtensionsLabel); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(ReinstallAction), 'Reinstall Extension...', localize('developer', "Developer")); +actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(ReinstallAction), 'Reinstall Extension...', localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer")); Registry.as(ConfigurationExtensions.Configuration) .registerConfiguration({ @@ -194,6 +195,11 @@ Registry.as(ConfigurationExtensions.Configuration) type: 'array', description: localize('handleUriConfirmedExtensions', "When an extension is listed here, a confirmation prompt will not be shown when that extension handles a URI."), default: [] + }, + 'extensions.webWorker': { + type: 'boolean', + description: localize('extensionsWebWorker', "Enable web worker extension host."), + default: false } } }); @@ -465,9 +471,10 @@ class ExtensionsContributions implements IWorkbenchContribution { @IExtensionManagementServerService extensionManagementServerService: IExtensionManagementServerService ) { - const canManageExtensions = extensionManagementServerService.localExtensionManagementServer || extensionManagementServerService.remoteExtensionManagementServer; - - if (canManageExtensions) { + if (extensionManagementServerService.localExtensionManagementServer + || extensionManagementServerService.remoteExtensionManagementServer + || extensionManagementServerService.webExtensionManagementServer + ) { Registry.as(Extensions.Quickaccess).registerQuickAccessProvider({ ctor: InstallExtensionQuickAccessProvider, prefix: InstallExtensionQuickAccessProvider.PREFIX, diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index c36117e30e3..06d067ad561 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -26,7 +26,7 @@ import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; import { IFileService, IFileContent } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -60,6 +60,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { IFileDialogService, IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { Codicon } from 'vs/base/common/codicons'; +import { IViewsService } from 'vs/workbench/common/views'; export function toExtensionDescription(local: ILocalExtension): IExtensionDescription { return { @@ -1261,7 +1262,7 @@ export class ReloadAction extends ExtensionAction { const isUninstalled = this.extension.state === ExtensionState.Uninstalled; const runningExtension = this._runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension!.identifier))[0]; - const isSameExtensionRunning = runningExtension && this.extension.server === this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation); + const isSameExtensionRunning = runningExtension && this.extension.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension)); if (isUninstalled) { if (isSameExtensionRunning && !this.extensionService.canRemoveExtension(runningExtension)) { @@ -1282,7 +1283,7 @@ export class ReloadAction extends ExtensionAction { if (this.extensionService.canAddExtension(toExtensionDescription(this.extension.local))) { return; } - const runningExtensionServer = this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation); + const runningExtensionServer = this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension)); if (isSameExtensionRunning) { // Different version of same extension is running. Requires reload to run the current version @@ -1641,19 +1642,39 @@ export class ShowDisabledExtensionsAction extends Action { } } -export class ClearExtensionsInputAction extends Action { +export class ClearExtensionsSearchResultsAction extends Action { - static readonly ID = 'workbench.extensions.action.clearExtensionsInput'; - static readonly LABEL = localize('clearExtensionsInput', "Clear Extensions Input"); + static readonly ID = 'workbench.extensions.action.clearExtensionsSearchResults'; + static readonly LABEL = localize('clearExtensionsSearchResults', "Clear Extensions Search Results"); + + constructor( + id: string, + label: string, + @IViewsService private readonly viewsService: IViewsService + ) { + super(id, label, 'codicon-clear-all', true); + } + + async run(): Promise { + const viewPaneContainer = this.viewsService.getActiveViewPaneContainerWithId(VIEWLET_ID); + if (viewPaneContainer) { + const extensionsViewPaneContainer = viewPaneContainer as IExtensionsViewPaneContainer; + extensionsViewPaneContainer.search(''); + extensionsViewPaneContainer.focus(); + } + } +} + +export class ClearExtensionsInputAction extends ClearExtensionsSearchResultsAction { constructor( id: string, label: string, onSearchChange: Event, value: string, - @IViewletService private readonly viewletService: IViewletService + @IViewsService viewsService: IViewsService ) { - super(id, label, 'codicon-clear-all', true); + super(id, label, viewsService); this.onSearchChange(value); this._register(onSearchChange(this.onSearchChange, this)); } @@ -1662,14 +1683,6 @@ export class ClearExtensionsInputAction extends Action { this.enabled = !!value; } - run(): Promise { - return this.viewletService.openViewlet(VIEWLET_ID, true) - .then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer) - .then(viewlet => { - viewlet.search(''); - viewlet.focus(); - }); - } } export class ShowBuiltInExtensionsAction extends Action { @@ -1827,6 +1840,40 @@ export class InstallWorkspaceRecommendedExtensionsAction extends Action { } } +export class ShowRecommendedExtensionAction extends Action { + + static readonly ID = 'workbench.extensions.action.showRecommendedExtension'; + static readonly LABEL = localize('showRecommendedExtension', "Show Recommended Extension"); + + private extensionId: string; + + constructor( + extensionId: string, + @IViewletService private readonly viewletService: IViewletService, + @IExtensionsWorkbenchService private readonly extensionWorkbenchService: IExtensionsWorkbenchService, + ) { + super(InstallRecommendedExtensionAction.ID, InstallRecommendedExtensionAction.LABEL, undefined, false); + this.extensionId = extensionId; + } + + run(): Promise { + return this.viewletService.openViewlet(VIEWLET_ID, true) + .then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer) + .then(viewlet => { + viewlet.search(`@id:${this.extensionId}`); + viewlet.focus(); + return this.extensionWorkbenchService.queryGallery({ names: [this.extensionId], source: 'install-recommendation', pageSize: 1 }, CancellationToken.None) + .then(pager => { + if (pager && pager.firstPage && pager.firstPage.length) { + const extension = pager.firstPage[0]; + return this.extensionWorkbenchService.open(extension); + } + return null; + }); + }); + } +} + export class InstallRecommendedExtensionAction extends Action { static readonly ID = 'workbench.extensions.action.installRecommendedExtension'; @@ -1855,6 +1902,7 @@ export class InstallRecommendedExtensionAction extends Action { if (pager && pager.firstPage && pager.firstPage.length) { const extension = pager.firstPage[0]; return this.extensionWorkbenchService.install(extension) + .then(() => this.extensionWorkbenchService.open(extension)) .then(() => null, err => { console.error(err); return promptDownloadManually(extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", extension.identifier.id), err, this.instantiationService); @@ -2591,7 +2639,7 @@ export class StatusLabelAction extends Action implements IExtensionContainer { }; const canRemoveExtension = () => { if (this.extension!.local) { - if (runningExtensions.every(e => !(areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension!.identifier) && this.extension!.server === this.extensionManagementServerService.getExtensionManagementServer(e.extensionLocation)))) { + if (runningExtensions.every(e => !(areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension!.identifier) && this.extension!.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(e))))) { return true; } return this.extensionService.canRemoveExtension(toExtensionDescription(this.extension!.local)); @@ -2636,7 +2684,7 @@ export class MaliciousStatusLabelAction extends ExtensionAction { constructor(long: boolean) { const tooltip = localize('malicious tooltip', "This extension was reported to be problematic."); - const label = long ? tooltip : localize('malicious', "Malicious"); + const label = long ? tooltip : localize({ key: 'malicious', comment: ['Refers to a malicious extension'] }, "Malicious"); super('extensions.install', label, '', false); this.tooltip = localize('malicious tooltip', "This extension was reported to be problematic."); } @@ -2823,7 +2871,7 @@ export class SystemDisabledWarningAction extends ExtensionAction { } if (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer) { const runningExtension = this._runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension!.identifier))[0]; - const runningExtensionServer = runningExtension ? this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation) : null; + const runningExtensionServer = runningExtension ? this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension)) : null; if (this.extension.server === this.extensionManagementServerService.localExtensionManagementServer && runningExtensionServer === this.extensionManagementServerService.remoteExtensionManagementServer) { if (prefersExecuteOnWorkspace(this.extension.local!.manifest, this.productService, this.configurationService)) { this.class = `${SystemDisabledWarningAction.INFO_CLASS}`; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index ea40f7f40f1..4c8e6373219 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -17,7 +17,7 @@ import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchSe import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionViewItem, StatusLabelAction, RemoteInstallAction, SystemDisabledWarningAction, ExtensionToolTipAction, LocalInstallAction, SyncIgnoredIconAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { Label, RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, TooltipWidget, ExtensionPackCountWidget as ExtensionPackBadgeWidget } from 'vs/workbench/contrib/extensions/browser/extensionsWidgets'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; @@ -164,7 +164,7 @@ export class Renderer implements IPagedRenderer { isDisabled = false; if (extension.local && !isLanguagePackExtension(extension.local.manifest)) { const runningExtension = runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, extension.identifier))[0]; - isDisabled = !(runningExtension && extension.server === this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation)); + isDisabled = !(runningExtension && extension.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension))); } toggleClass(data.root, 'disabled', isDisabled); }; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index 6a35d128812..ccd37e31f32 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -195,19 +195,19 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio const getOutdatedViewName = (): string => getViewName(localize('outdated', "Outdated"), server); const onDidChangeServerLabel: EventOf = EventOf.map(this.labelService.onDidChangeFormatters, () => undefined); return [{ - id: `extensions.${server.authority}.installed`, + id: `extensions.${server.id}.installed`, get name() { return getInstalledViewName(); }, ctorDescriptor: new SyncDescriptor(ServerExtensionsView, [server, EventOf.map(onDidChangeServerLabel, () => getInstalledViewName())]), when: ContextKeyExpr.and(ContextKeyExpr.has('searchInstalledExtensions')), weight: 100 }, { - id: `extensions.${server.authority}.outdated`, + id: `extensions.${server.id}.outdated`, get name() { return getOutdatedViewName(); }, ctorDescriptor: new SyncDescriptor(ServerExtensionsView, [server, EventOf.map(onDidChangeServerLabel, () => getOutdatedViewName())]), when: ContextKeyExpr.and(ContextKeyExpr.has('searchOutdatedExtensions')), weight: 100 }, { - id: `extensions.${server.authority}.default`, + id: `extensions.${server.id}.default`, get name() { return getInstalledViewName(); }, ctorDescriptor: new SyncDescriptor(ServerExtensionsView, [server, EventOf.map(onDidChangeServerLabel, () => getInstalledViewName())]), when: ContextKeyExpr.and(ContextKeyExpr.has('defaultExtensionViews'), ContextKeyExpr.has('hasInstalledExtensions'), RemoteNameContext.notEqualsTo('')), diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts index 0cb220e341c..3066e76a210 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts @@ -19,11 +19,10 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { Delegate, Renderer, IExtensionsViewState } from 'vs/workbench/contrib/extensions/browser/extensionsList'; import { IExtension, IExtensionsWorkbenchService, ExtensionState } from 'vs/workbench/contrib/extensions/common/extensions'; import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -100,7 +99,6 @@ export class ExtensionsListView extends ViewPane { @IThemeService themeService: IThemeService, @IExtensionService private readonly extensionService: IExtensionService, @IExtensionsWorkbenchService protected extensionsWorkbenchService: IExtensionsWorkbenchService, - @IEditorService private readonly editorService: IEditorService, @IExtensionRecommendationsService protected tipsService: IExtensionRecommendationsService, @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @@ -157,16 +155,11 @@ export class ExtensionsListView extends ViewPane { this._register(this.list); this._register(extensionsViewState); - const resourceNavigator = this._register(new ListResourceNavigator(this.list, { openOnFocus: false, openOnSelection: true, openOnSingleClick: true })); - this._register(Event.debounce(Event.filter(resourceNavigator.onDidOpenResource, e => e.element !== null), (last, event) => event, 75, true)(options => { + const resourceNavigator = this._register(new ListResourceNavigator(this.list, { openOnSingleClick: true })); + this._register(Event.debounce(Event.filter(resourceNavigator.onDidOpen, e => e.element !== null), (_, event) => event, 75, true)(options => { this.openExtension(this.list!.model.get(options.element!), { sideByside: options.sideBySide, ...options.editorOptions }); })); - this._register(Event.chain(this.list.onPin) - .map(e => e.elements[0]) - .filter(e => !!e) - .on(this.pin, this)); - this.bodyTemplate = { extensionsList, messageBox, @@ -323,33 +316,29 @@ export class ExtensionsListView extends ViewPane { result = result .filter(e => e.type === ExtensionType.System && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1)); + const isThemeExtension = (e: IExtension): boolean => { + return (Array.isArray(e.local?.manifest?.contributes?.themes) && e.local!.manifest!.contributes!.themes.length > 0) + || (Array.isArray(e.local?.manifest?.contributes?.iconThemes) && e.local!.manifest!.contributes!.iconThemes.length > 0); + }; if (showThemesOnly) { - const themesExtensions = result.filter(e => { - return e.local - && e.local.manifest - && e.local.manifest.contributes - && Array.isArray(e.local.manifest.contributes.themes) - && e.local.manifest.contributes.themes.length; - }); + const themesExtensions = result.filter(isThemeExtension); return this.getPagedModel(this.sortExtensions(themesExtensions, options)); } + + const isLangaugeBasicExtension = (e: IExtension): boolean => { + return FORCE_FEATURE_EXTENSIONS.indexOf(e.identifier.id) === -1 + && (Array.isArray(e.local?.manifest?.contributes?.grammars) && e.local!.manifest!.contributes!.grammars.length > 0); + }; if (showBasicsOnly) { - const basics = result.filter(e => { - return e.local && e.local.manifest - && e.local.manifest.contributes - && Array.isArray(e.local.manifest.contributes.grammars) - && e.local.manifest.contributes.grammars.length - && FORCE_FEATURE_EXTENSIONS.indexOf(e.local.identifier.id) === -1; - }); + const basics = result.filter(isLangaugeBasicExtension); return this.getPagedModel(this.sortExtensions(basics, options)); } if (showFeaturesOnly) { const others = result.filter(e => { return e.local && e.local.manifest - && e.local.manifest.contributes - && (!Array.isArray(e.local.manifest.contributes.grammars) || FORCE_FEATURE_EXTENSIONS.indexOf(e.local.identifier.id) !== -1) - && !Array.isArray(e.local.manifest.contributes.themes); + && !isThemeExtension(e) + && !isLangaugeBasicExtension(e); }); return this.getPagedModel(this.sortExtensions(others, options)); } @@ -384,9 +373,9 @@ export class ExtensionsListView extends ViewPane { const runningExtensionsById = runningExtensions.reduce((result, e) => { result.set(ExtensionIdentifier.toKey(e.identifier.value), e); return result; }, new Map()); result = result.sort((e1, e2) => { const running1 = runningExtensionsById.get(ExtensionIdentifier.toKey(e1.identifier.id)); - const isE1Running = running1 && this.extensionManagementServerService.getExtensionManagementServer(running1.extensionLocation) === e1.server; + const isE1Running = running1 && this.extensionManagementServerService.getExtensionManagementServer(toExtension(running1)) === e1.server; const running2 = runningExtensionsById.get(ExtensionIdentifier.toKey(e2.identifier.id)); - const isE2Running = running2 && this.extensionManagementServerService.getExtensionManagementServer(running2.extensionLocation) === e2.server; + const isE2Running = running2 && this.extensionManagementServerService.getExtensionManagementServer(toExtension(running2)) === e2.server; if ((isE1Running && isE2Running)) { return e1.displayName.localeCompare(e2.displayName); } @@ -772,14 +761,6 @@ export class ExtensionsListView extends ViewPane { this.extensionsWorkbenchService.open(extension, options).then(undefined, err => this.onError(err)); } - private pin(): void { - const activeEditorPane = this.editorService.activeEditorPane; - if (activeEditorPane) { - activeEditorPane.group.pinEditor(activeEditorPane.input); - activeEditorPane.focus(); - } - } - private onError(err: any): void { if (isPromiseCanceledError(err)) { return; @@ -892,7 +873,6 @@ export class ServerExtensionsView extends ExtensionsListView { @IViewDescriptorService viewDescriptorService: IViewDescriptorService, @IInstantiationService instantiationService: IInstantiationService, @IExtensionService extensionService: IExtensionService, - @IEditorService editorService: IEditorService, @IExtensionRecommendationsService tipsService: IExtensionRecommendationsService, @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @@ -908,7 +888,7 @@ export class ServerExtensionsView extends ExtensionsListView { @IPreferencesService preferencesService: IPreferencesService, ) { options.server = server; - super(options, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, extensionsWorkbenchService, editorService, tipsService, telemetryService, configurationService, contextService, experimentService, extensionManagementServerService, productService, contextKeyService, viewDescriptorService, menuService, openerService, preferencesService); + super(options, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, extensionsWorkbenchService, tipsService, telemetryService, configurationService, contextService, experimentService, extensionManagementServerService, productService, contextKeyService, viewDescriptorService, menuService, openerService, preferencesService); this._register(onDidChangeTitle(title => this.updateTitle(title))); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 567d8c28f0a..7f11c1ca54f 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -38,6 +38,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { IProductService } from 'vs/platform/product/common/productService'; import { asDomUri } from 'vs/base/browser/dom'; import { getIgnoredExtensions } from 'vs/platform/userDataSync/common/extensionsMerge'; +import { isWeb } from 'vs/base/common/platform'; interface IExtensionStateProvider { (extension: Extension): T; @@ -489,6 +490,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension private readonly localExtensions: Extensions | null = null; private readonly remoteExtensions: Extensions | null = null; + private readonly webExtensions: Extensions | null = null; private syncDelayer: ThrottledDelayer; private autoUpdateDelayer: ThrottledDelayer; @@ -523,6 +525,10 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension this.remoteExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.remoteExtensionManagementServer, ext => this.getExtensionState(ext))); this._register(this.remoteExtensions.onChange(e => this._onChange.fire(e ? e.extension : undefined))); } + if (extensionManagementServerService.webExtensionManagementServer) { + this.webExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.webExtensionManagementServer, ext => this.getExtensionState(ext))); + this._register(this.webExtensions.onChange(e => this._onChange.fire(e ? e.extension : undefined))); + } this.syncDelayer = new ThrottledDelayer(ExtensionsWorkbenchService.SyncPeriod); this.autoUpdateDelayer = new ThrottledDelayer(1000); @@ -563,6 +569,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (this.remoteExtensions) { result.push(...this.remoteExtensions.local); } + if (this.webExtensions) { + result.push(...this.webExtensions.local); + } return result; } @@ -574,6 +583,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (this.remoteExtensions) { allLocal.push(...this.remoteExtensions.local); } + if (this.webExtensions) { + allLocal.push(...this.webExtensions.local); + } return allLocal.filter(e => e.outdated && e.local && e.state === ExtensionState.Installed); } @@ -585,6 +597,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (this.remoteExtensions && this.extensionManagementServerService.remoteExtensionManagementServer === server) { return this.remoteExtensions.queryInstalled(); } + if (this.webExtensions && this.extensionManagementServerService.webExtensionManagementServer === server) { + return this.webExtensions.queryInstalled(); + } } if (this.localExtensions) { @@ -593,6 +608,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (this.remoteExtensions) { await this.remoteExtensions.queryInstalled(); } + if (this.webExtensions) { + await this.webExtensions.queryInstalled(); + } return this.local; } @@ -647,18 +665,21 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (extensions.length === 1) { return extensions[0]; } - const pickRemoteOrFirstExtension = (from: IExtension[]): IExtension => { - const remoteExtension = from.filter(e => e.server === this.extensionManagementServerService.remoteExtensionManagementServer)[0]; - return remoteExtension ? remoteExtension : from[0]; - }; const enabledExtensions = extensions.filter(e => e.local && this.extensionEnablementService.isEnabled(e.local)); - return enabledExtensions.length === 1 ? enabledExtensions[0] : pickRemoteOrFirstExtension(extensions); + if (enabledExtensions.length === 0) { + return extensions[0]; + } + if (enabledExtensions.length === 1) { + return enabledExtensions[0]; + } + return enabledExtensions.find(e => e.server === this.extensionManagementServerService.remoteExtensionManagementServer) || enabledExtensions[0]; } private fromGallery(gallery: IGalleryExtension, maliciousExtensionSet: Set): IExtension { Promise.all([ this.localExtensions ? this.localExtensions.syncLocalWithGalleryExtension(gallery, maliciousExtensionSet) : Promise.resolve(false), - this.remoteExtensions ? this.remoteExtensions.syncLocalWithGalleryExtension(gallery, maliciousExtensionSet) : Promise.resolve(false) + this.remoteExtensions ? this.remoteExtensions.syncLocalWithGalleryExtension(gallery, maliciousExtensionSet) : Promise.resolve(false), + this.webExtensions ? this.webExtensions.syncLocalWithGalleryExtension(gallery, maliciousExtensionSet) : Promise.resolve(false) ]) .then(result => { if (result[0] || result[1]) { @@ -695,7 +716,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension private getExtensionState(extension: Extension): ExtensionState { const isInstalling = this.installing.some(i => areSameExtensions(i.identifier, extension.identifier)); if (extension.server) { - const state = (extension.server === this.extensionManagementServerService.localExtensionManagementServer ? this.localExtensions! : this.remoteExtensions!).getExtensionState(extension); + const state = (extension.server === this.extensionManagementServerService.localExtensionManagementServer + ? this.localExtensions! : extension.server === this.extensionManagementServerService.remoteExtensionManagementServer ? this.remoteExtensions! : this.webExtensions!).getExtensionState(extension); return state === ExtensionState.Uninstalled && isInstalling ? ExtensionState.Installing : state; } else if (isInstalling) { return ExtensionState.Installing; @@ -706,6 +728,12 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return state; } } + if (this.webExtensions) { + const state = this.webExtensions.getExtensionState(extension); + if (state !== ExtensionState.Uninstalled) { + return state; + } + } if (this.localExtensions) { return this.localExtensions.getExtensionState(extension); } @@ -783,7 +811,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return false; } - if (this.extensionManagementServerService.localExtensionManagementServer || this.extensionManagementServerService.remoteExtensionManagementServer) { + if (this.extensionManagementServerService.localExtensionManagementServer + || this.extensionManagementServerService.remoteExtensionManagementServer + || this.extensionManagementServerService.webExtensionManagementServer) { return true; } @@ -867,9 +897,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } isExtensionIgnoredToSync(extension: IExtension): boolean { - const localExtensions = (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer - ? this.local.filter(i => i.server === this.extensionManagementServerService.localExtensionManagementServer) - : this.local) + const localExtensions = (!isWeb && this.localExtensions ? this.localExtensions.local : this.local) .filter(l => !!l.local) .map(l => l.local!); @@ -1059,7 +1087,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension private _activityCallBack: (() => void) | null = null; private updateActivity(): void { if ((this.localExtensions && this.localExtensions.local.some(e => e.state === ExtensionState.Installing || e.state === ExtensionState.Uninstalling)) - || (this.remoteExtensions && this.remoteExtensions.local.some(e => e.state === ExtensionState.Installing || e.state === ExtensionState.Uninstalling))) { + || (this.remoteExtensions && this.remoteExtensions.local.some(e => e.state === ExtensionState.Installing || e.state === ExtensionState.Uninstalling)) + || (this.webExtensions && this.webExtensions.local.some(e => e.state === ExtensionState.Installing || e.state === ExtensionState.Uninstalling))) { if (!this._activityCallBack) { this.progressService.withProgress({ location: ProgressLocation.Extensions }, () => new Promise(c => this._activityCallBack = c)); } diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css b/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css index a6293c6dda0..3270a34f18e 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css @@ -113,7 +113,7 @@ line-height: 20px; } -.extension-editor > .header > .details > .subtitle > .publisher { +.extension-editor > .header > .details > .subtitle .publisher { font-size: 18px; } @@ -124,12 +124,11 @@ align-items: center; } -.extension-editor > .header > .details > .subtitle > .install > .count { +.extension-editor > .header > .details > .subtitle .install > .count { margin-left: 6px; } -.extension-editor > .header > .details > .subtitle > span:not(:first-child):not(:empty), -.extension-editor > .header > .details > .subtitle > a:not(:first-child):not(:empty) { +.extension-editor > .header > .details > .subtitle > div:not(:first-child):not(:empty) { border-left: 1px solid rgba(128, 128, 128, 0.7); margin-left: 14px; padding-left: 14px; diff --git a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts index e46b0ee8260..e28e8348283 100644 --- a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts +++ b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { flatten } from 'vs/base/common/arrays'; +import { EXTENSION_CATEGORIES } from 'vs/platform/extensions/common/extensions'; export class Query { @@ -15,7 +16,7 @@ export class Query { const commands = ['installed', 'outdated', 'enabled', 'disabled', 'builtin', 'recommended', 'sort', 'category', 'tag', 'ext', 'id'] as const; const subcommands = { 'sort': ['installs', 'rating', 'name'], - 'category': ['"programming languages"', 'snippets', 'linters', 'themes', 'debuggers', 'formatters', 'keymaps', '"scm providers"', 'other', '"extension packs"', '"language packs"'], + 'category': EXTENSION_CATEGORIES.map(c => `"${c.toLowerCase()}"`), 'tag': [''], 'ext': [''], 'id': [''] diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index 5673e78f5e0..6d0222c798e 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -60,7 +60,7 @@ Registry.as(EditorInputExtensions.EditorInputFactor // Global actions const actionRegistry = Registry.as(WorkbenchActionExtensions.WorkbenchActions); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(ShowRuntimeExtensionsAction), 'Show Running Extensions', localize('developer', "Developer")); +actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(ShowRuntimeExtensionsAction), 'Show Running Extensions', localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer")); class ExtensionsContributions implements IWorkbenchContribution { diff --git a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts index 9a08146497a..219f14298f0 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -374,7 +374,12 @@ export class RuntimeExtensionsEditor extends BaseEditor { ] }, "Activated by {1} because searching for {0} took too long", glob, activationId); } else if (activationEvent === 'onStartupFinished') { - title = nls.localize('startupFinishedActivation', "Activated by {0} after start-up finished", activationId); + title = nls.localize({ + key: 'startupFinishedActivation', + comment: [ + 'This refers to an extension. {0} will be an activation event.' + ] + }, "Activated by {0} after start-up finished", activationId); } else if (/^onLanguage:/.test(activationEvent)) { let language = activationEvent.substr('onLanguage:'.length); title = nls.localize('languageActivation', "Activated by {1} because you opened a {0} file", language, activationId); diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts index 1865b94f402..7c83b8ea7b1 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts @@ -34,7 +34,7 @@ import { URI } from 'vs/base/common/uri'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; -import { ExtensionIdentifier, IExtensionContributions, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionContributions, ExtensionType, IExtensionDescription, IExtension } from 'vs/platform/extensions/common/extensions'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ILabelService, IFormatterChangeEvent } from 'vs/platform/label/common/label'; @@ -99,7 +99,7 @@ async function setupTest() { instantiationService.stub(IRemoteAgentService, RemoteAgentService); instantiationService.stub(IExtensionManagementServerService, new class extends ExtensionManagementServerService { - #localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', authority: 'vscode-local' }; + #localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', id: 'vscode-local' }; constructor() { super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(IConfigurationService), instantiationService.get(IProductService), instantiationService.get(ILogService), instantiationService.get(ILabelService)); } @@ -1122,7 +1122,7 @@ suite('ReloadAction', () => { test('Test ReloadAction when extension is newly installed', async () => { const onDidChangeExtensionsEmitter: Emitter = new Emitter(); - const runningExtensions = [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]; + const runningExtensions = [ExtensionsActions.toExtensionDescription(aLocalExtension('b'))]; instantiationService.stub(IExtensionService, >{ getExtensions: () => Promise.resolve(runningExtensions), onDidChangeExtensions: onDidChangeExtensionsEmitter.event, @@ -1145,7 +1145,7 @@ suite('ReloadAction', () => { test('Test ReloadAction when extension is newly installed and reload is not required', async () => { const onDidChangeExtensionsEmitter: Emitter = new Emitter(); - const runningExtensions = [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]; + const runningExtensions = [ExtensionsActions.toExtensionDescription(aLocalExtension('b'))]; instantiationService.stub(IExtensionService, >{ getExtensions: () => Promise.resolve(runningExtensions), onDidChangeExtensions: onDidChangeExtensionsEmitter.event, @@ -1166,7 +1166,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension is installed and uninstalled', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('b'))]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const gallery = aGalleryExtension('a'); @@ -1184,7 +1184,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension is uninstalled', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a'), version: '1.0.0' }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a'); @@ -1218,7 +1218,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension is uninstalled and installed', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), version: '1.0.0', extensionLocation: URI.file('pub.a') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a'); @@ -1238,7 +1238,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension is updated while running', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), version: '1.0.1', extensionLocation: URI.file('pub.a') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('a', { version: '1.0.1' }))]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a', { version: '1.0.1' }); @@ -1260,7 +1260,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension is updated when not running', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('b'))]); const local = aLocalExtension('a', { version: '1.0.1' }); await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); @@ -1278,7 +1278,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension is disabled when running', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('a'))]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a'); @@ -1294,7 +1294,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension enablement is toggled when running', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), version: '1.0.0', extensionLocation: URI.file('pub.a') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('a', { version: '1.0.0' }))]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a'); @@ -1308,7 +1308,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension is enabled when not running', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('b'))]); const local = aLocalExtension('a'); await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); @@ -1324,7 +1324,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension enablement is toggled when not running', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('b'))]); const local = aLocalExtension('a'); await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); @@ -1339,7 +1339,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when extension is updated when not running and enabled', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('b'))]); const local = aLocalExtension('a', { version: '1.0.1' }); await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([local], EnablementState.DisabledGlobally); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); @@ -1359,7 +1359,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when a localization extension is newly installed', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('b'))]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const gallery = aGalleryExtension('a'); @@ -1375,7 +1375,7 @@ suite('ReloadAction', () => { }); test('Test ReloadAction when a localization extension is updated while running', async () => { - instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), version: '1.0.1', extensionLocation: URI.file('pub.a') }]); + instantiationService.stubPromise(IExtensionService, 'getExtensions', [ExtensionsActions.toExtensionDescription(aLocalExtension('a', { version: '1.0.1' }))]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a', { version: '1.0.1', contributes: { localizations: [{ languageId: 'de', translations: [] }] } }); @@ -2518,7 +2518,7 @@ function aPage(...objects: T[]): IPager { function aSingleRemoteExtensionManagementServerService(instantiationService: TestInstantiationService, remoteExtensionManagementService?: IExtensionManagementService): IExtensionManagementServerService { const remoteExtensionManagementServer: IExtensionManagementServer = { - authority: 'vscode-remote', + id: 'vscode-remote', label: 'remote', extensionManagementService: remoteExtensionManagementService || createExtensionManagementService() }; @@ -2526,8 +2526,9 @@ function aSingleRemoteExtensionManagementServerService(instantiationService: Tes _serviceBrand: undefined, localExtensionManagementServer: null, remoteExtensionManagementServer, - getExtensionManagementServer: (location: URI) => { - if (location.scheme === REMOTE_HOST_SCHEME) { + webExtensionManagementServer: null, + getExtensionManagementServer: (extension: IExtension) => { + if (extension.location.scheme === REMOTE_HOST_SCHEME) { return remoteExtensionManagementServer; } return null; @@ -2537,12 +2538,12 @@ function aSingleRemoteExtensionManagementServerService(instantiationService: Tes function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService, localExtensionManagementService?: IExtensionManagementService, remoteExtensionManagementService?: IExtensionManagementService): IExtensionManagementServerService { const localExtensionManagementServer: IExtensionManagementServer = { - authority: 'vscode-local', + id: 'vscode-local', label: 'local', extensionManagementService: localExtensionManagementService || createExtensionManagementService() }; const remoteExtensionManagementServer: IExtensionManagementServer = { - authority: 'vscode-remote', + id: 'vscode-remote', label: 'remote', extensionManagementService: remoteExtensionManagementService || createExtensionManagementService() }; @@ -2550,14 +2551,15 @@ function aMultiExtensionManagementServerService(instantiationService: TestInstan _serviceBrand: undefined, localExtensionManagementServer, remoteExtensionManagementServer, - getExtensionManagementServer: (location: URI) => { - if (location.scheme === Schemas.file) { + webExtensionManagementServer: null, + getExtensionManagementServer: (extension: IExtension) => { + if (extension.location.scheme === Schemas.file) { return localExtensionManagementServer; } - if (location.scheme === REMOTE_HOST_SCHEME) { + if (extension.location.scheme === REMOTE_HOST_SCHEME) { return remoteExtensionManagementServer; } - return null; + throw new Error(''); } }; } diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts index 9f8519041bd..58c893753df 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts @@ -99,7 +99,7 @@ suite('ExtensionsListView Tests', () => { instantiationService.stub(IMenuService, new TestMenuService()); instantiationService.stub(IExtensionManagementServerService, new class extends ExtensionManagementServerService { - #localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', authority: 'vscode-local' }; + #localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', id: 'vscode-local' }; constructor() { super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(IConfigurationService), instantiationService.get(IProductService), instantiationService.get(ILogService), instantiationService.get(ILabelService)); } diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts index c4b310c504a..84e406323be 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts @@ -40,7 +40,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ terminalService.openTerminal(paths.dirname(activeFile.fsPath)); } else { const pathService = accessor.get(IPathService); - const userHome = await pathService.userHome; + const userHome = await pathService.userHome(); terminalService.openTerminal(userHome.fsPath); } } diff --git a/src/vs/workbench/contrib/feedback/browser/feedback.ts b/src/vs/workbench/contrib/feedback/browser/feedback.ts index 766154643a4..c251c876ccb 100644 --- a/src/vs/workbench/contrib/feedback/browser/feedback.ts +++ b/src/vs/workbench/contrib/feedback/browser/feedback.ts @@ -385,6 +385,8 @@ export class FeedbackDropdown extends Dropdown { if (this.options.onFeedbackVisibilityChange) { this.options.onFeedbackVisibilityChange(true); } + + this.updateCharCountText(); } protected onHide(): void { diff --git a/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts b/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts index 869a4900104..ab7a78c8b07 100644 --- a/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts +++ b/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { toErrorMessage } from 'vs/base/common/errorMessage'; -import { basename } from 'vs/base/common/resources'; +import { basename, extUri } from 'vs/base/common/resources'; import { Action, IAction } from 'vs/base/common/actions'; import { URI } from 'vs/base/common/uri'; import { FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; @@ -115,7 +115,7 @@ export class TextFileSaveErrorHandler extends Disposable implements ISaveErrorHa if (fileOperationError.fileOperationResult === FileOperationResult.FILE_MODIFIED_SINCE) { // If the user tried to save from the opened conflict editor, show its message again - if (this.activeConflictResolutionResource && this.activeConflictResolutionResource.toString() === model.resource.toString()) { + if (this.activeConflictResolutionResource && extUri.isEqual(this.activeConflictResolutionResource, model.resource)) { if (this.storageService.getBoolean(LEARN_MORE_DIRTY_WRITE_IGNORE_KEY, StorageScope.GLOBAL)) { return; // return if this message is ignored } @@ -175,7 +175,7 @@ export class TextFileSaveErrorHandler extends Disposable implements ISaveErrorHa } else if (canHandlePermissionOrReadonlyErrors && isPermissionDenied) { message = isWindows ? nls.localize('permissionDeniedSaveError', "Failed to save '{0}': Insufficient permissions. Select 'Retry as Admin' to retry as administrator.", basename(resource)) : nls.localize('permissionDeniedSaveErrorSudo', "Failed to save '{0}': Insufficient permissions. Select 'Retry as Sudo' to retry as superuser.", basename(resource)); } else { - message = nls.localize('genericSaveError', "Failed to save '{0}': {1}", basename(resource), toErrorMessage(error, false)); + message = nls.localize({ key: 'genericSaveError', comment: ['{0} is the resource that failed to save and {1} the error message'] }, "Failed to save '{0}': {1}", basename(resource), toErrorMessage(error, false)); } } diff --git a/src/vs/workbench/contrib/files/browser/explorerViewlet.ts b/src/vs/workbench/contrib/files/browser/explorerViewlet.ts index c72967384ae..560a311196e 100644 --- a/src/vs/workbench/contrib/files/browser/explorerViewlet.ts +++ b/src/vs/workbench/contrib/files/browser/explorerViewlet.ts @@ -114,6 +114,7 @@ export class ExplorerViewletViewsContribution extends Disposable implements IWor when: OpenEditorsVisibleContext, canToggleVisibility: true, canMoveView: true, + collapsed: true, focusCommand: { id: 'workbench.files.action.focusOpenEditorsView', keybindings: { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_E) } @@ -219,7 +220,6 @@ export class ExplorerViewPaneContainer extends ViewPaneContainer { } catch (error) { return null; // ignore } finally { - const openEditorsView = this.getOpenEditorsView(); if (openEditorsView) { openEditorsView.setStructuralRefreshDelay(0); } diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index b30f36916e5..89b4e9ee7bd 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -5,12 +5,12 @@ import * as nls from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ToggleAutoSaveAction, GlobalNewUntitledFileAction, FocusFilesExplorer, GlobalCompareResourcesAction, SaveAllAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView, CompareWithClipboardAction, NEW_FILE_COMMAND_ID, NEW_FILE_LABEL, NEW_FOLDER_COMMAND_ID, NEW_FOLDER_LABEL, TRIGGER_RENAME_LABEL, MOVE_FILE_TO_TRASH_LABEL, COPY_FILE_LABEL, PASTE_FILE_LABEL, FileCopiedContext, renameHandler, moveFileToTrashHandler, copyFileHandler, pasteFileHandler, deleteFileHandler, cutFileHandler, DOWNLOAD_COMMAND_ID, openFilePreserveFocusHandler, DOWNLOAD_LABEL, ShowOpenedFileInNewWindow, ReopenResourcesAction, ToggleEditorTypeCommand as ToggleEditorTypeAction } from 'vs/workbench/contrib/files/browser/fileActions'; +import { ToggleAutoSaveAction, FocusFilesExplorer, GlobalCompareResourcesAction, SaveAllAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView, CompareWithClipboardAction, NEW_FILE_COMMAND_ID, NEW_FILE_LABEL, NEW_FOLDER_COMMAND_ID, NEW_FOLDER_LABEL, TRIGGER_RENAME_LABEL, MOVE_FILE_TO_TRASH_LABEL, COPY_FILE_LABEL, PASTE_FILE_LABEL, FileCopiedContext, renameHandler, moveFileToTrashHandler, copyFileHandler, pasteFileHandler, deleteFileHandler, cutFileHandler, DOWNLOAD_COMMAND_ID, openFilePreserveFocusHandler, DOWNLOAD_LABEL, ShowOpenedFileInNewWindow } from 'vs/workbench/contrib/files/browser/fileActions'; import { revertLocalChangesCommand, acceptLocalChangesCommand, CONFLICT_RESOLUTION_CONTEXT } from 'vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler'; import { SyncActionDescriptor, MenuId, MenuRegistry, ILocalizedString } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; -import { openWindowCommand, COPY_PATH_COMMAND_ID, REVEAL_IN_EXPLORER_COMMAND_ID, OPEN_TO_SIDE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_COMMAND_ID, SAVE_FILE_LABEL, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID, OpenEditorsGroupContext, COMPARE_WITH_SAVED_COMMAND_ID, COMPARE_RESOURCE_COMMAND_ID, SELECT_FOR_COMPARE_COMMAND_ID, ResourceSelectedForCompareContext, DirtyEditorContext, COMPARE_SELECTED_COMMAND_ID, REMOVE_ROOT_FOLDER_COMMAND_ID, REMOVE_ROOT_FOLDER_LABEL, SAVE_FILES_COMMAND_ID, COPY_RELATIVE_PATH_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_LABEL, newWindowCommand, ReadonlyEditorContext, OPEN_WITH_EXPLORER_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileCommands'; +import { openWindowCommand, COPY_PATH_COMMAND_ID, REVEAL_IN_EXPLORER_COMMAND_ID, OPEN_TO_SIDE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_COMMAND_ID, SAVE_FILE_LABEL, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID, OpenEditorsGroupContext, COMPARE_WITH_SAVED_COMMAND_ID, COMPARE_RESOURCE_COMMAND_ID, SELECT_FOR_COMPARE_COMMAND_ID, ResourceSelectedForCompareContext, DirtyEditorContext, COMPARE_SELECTED_COMMAND_ID, REMOVE_ROOT_FOLDER_COMMAND_ID, REMOVE_ROOT_FOLDER_LABEL, SAVE_FILES_COMMAND_ID, COPY_RELATIVE_PATH_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_LABEL, newWindowCommand, ReadonlyEditorContext, OPEN_WITH_EXPLORER_COMMAND_ID, NEW_UNTITLED_FILE_COMMAND_ID, NEW_UNTITLED_FILE_LABEL } from 'vs/workbench/contrib/files/browser/fileCommands'; import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -26,7 +26,7 @@ import { WorkspaceFolderCountContext } from 'vs/workbench/browser/contextkeys'; import { IsWebContext } from 'vs/platform/contextkey/common/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { OpenFileFolderAction, OpenFileAction, OpenFolderAction, OpenWorkspaceAction } from 'vs/workbench/browser/actions/workspaceActions'; -import { ActiveEditorIsReadonlyContext, DirtyWorkingCopiesContext, ActiveEditorContext, ActiveEditorAvailableEditorIdsContext } from 'vs/workbench/common/editor'; +import { ActiveEditorIsReadonlyContext, DirtyWorkingCopiesContext, ActiveEditorContext } from 'vs/workbench/common/editor'; import { SidebarFocusContext } from 'vs/workbench/common/viewlet'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; @@ -36,13 +36,10 @@ const category = { value: nls.localize('filesCategory', "File"), original: 'File const registry = Registry.as(ActionExtensions.WorkbenchActions); registry.registerWorkbenchAction(SyncActionDescriptor.from(SaveAllAction, { primary: undefined, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_S }, win: { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_S) } }), 'File: Save All', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(GlobalCompareResourcesAction), 'File: Compare Active File With...', category.value); -registry.registerWorkbenchAction(SyncActionDescriptor.from(ReopenResourcesAction), 'File: Reopen With...', category.value, ActiveEditorAvailableEditorIdsContext); -registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleEditorTypeAction), 'File: Toggle Editor Type', category.value, ActiveEditorAvailableEditorIdsContext); registry.registerWorkbenchAction(SyncActionDescriptor.from(FocusFilesExplorer), 'File: Focus on Files Explorer', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(ShowActiveFileInExplorer), 'File: Reveal Active File in Side Bar', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(CollapseExplorerView), 'File: Collapse Folders in Explorer', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(RefreshExplorerView), 'File: Refresh Explorer', category.value); -registry.registerWorkbenchAction(SyncActionDescriptor.from(GlobalNewUntitledFileAction, { primary: KeyMod.CtrlCmd | KeyCode.KEY_N }), 'File: New Untitled File', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(CompareWithClipboardAction, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_C) }), 'File: Compare Active File with Clipboard', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleAutoSaveAction), 'File: Toggle Auto Save', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(ShowOpenedFileInNewWindow, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_O) }), 'File: Open Active File in New Window', category.value); @@ -183,19 +180,6 @@ export function appendEditorTitleContextMenuItem(id: string, title: string, when }); } -// Reopen with editor title - -MenuRegistry.appendMenuItem(MenuId.EditorTitle, { - command: { - id: ReopenResourcesAction.ID, - title: ReopenResourcesAction.LABEL, - category: fileCategory, - }, - group: '6_reopen', - order: 20, - when: ActiveEditorAvailableEditorIdsContext, -}); - // Editor Title Menu for Conflict Resolution appendSaveConflictEditorTitleAction('workbench.files.action.acceptLocalChanges', nls.localize('acceptLocalChanges', "Use your changes and overwrite file contents"), { id: 'codicon/check' }, -10, acceptLocalChangesCommand); appendSaveConflictEditorTitleAction('workbench.files.action.revertLocalChanges', nls.localize('revertLocalChanges', "Discard your changes and revert to file contents"), { id: 'codicon/discard' }, -9, revertLocalChangesCommand); @@ -240,6 +224,7 @@ appendToCommandPalette(CLOSE_EDITOR_COMMAND_ID, { value: nls.localize('closeEdit appendToCommandPalette(NEW_FILE_COMMAND_ID, { value: NEW_FILE_LABEL, original: 'New File' }, category, WorkspaceFolderCountContext.notEqualsTo('0')); appendToCommandPalette(NEW_FOLDER_COMMAND_ID, { value: NEW_FOLDER_LABEL, original: 'New Folder' }, category, WorkspaceFolderCountContext.notEqualsTo('0')); appendToCommandPalette(DOWNLOAD_COMMAND_ID, { value: DOWNLOAD_LABEL, original: 'Download' }, category, ContextKeyExpr.and(ResourceContextKey.Scheme.notEqualsTo(Schemas.file))); +appendToCommandPalette(NEW_UNTITLED_FILE_COMMAND_ID, { value: NEW_UNTITLED_FILE_LABEL, original: 'New Untitled File' }, category); // Menu registration - open editors @@ -581,7 +566,7 @@ MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { }); // Empty Editor Group Context Menu -MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: GlobalNewUntitledFileAction.ID, title: nls.localize('newFile', "New File") }, group: '1_file', order: 10 }); +MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: NEW_UNTITLED_FILE_COMMAND_ID, title: nls.localize('newFile', "New File") }, group: '1_file', order: 10 }); MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: 'workbench.action.quickOpen', title: nls.localize('openFile', "Open File...") }, group: '1_file', order: 20 }); // File menu @@ -589,7 +574,7 @@ MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: 'wo MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { group: '1_new', command: { - id: GlobalNewUntitledFileAction.ID, + id: NEW_UNTITLED_FILE_COMMAND_ID, title: nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New File") }, order: 1 diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index d9f3f24ab87..56f08c0e5e4 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -15,7 +15,7 @@ import { Action } from 'vs/base/common/actions'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { VIEWLET_ID, IExplorerService, IFilesConfiguration, VIEW_ID } from 'vs/workbench/contrib/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IFileService } from 'vs/platform/files/common/files'; +import { IFileService, IFileStatWithMetadata } from 'vs/platform/files/common/files'; import { toResource, SideBySideEditor } from 'vs/workbench/common/editor'; import { ExplorerViewPaneContainer } from 'vs/workbench/contrib/files/browser/explorerViewlet'; import { IQuickInputService, ItemActivation } from 'vs/platform/quickinput/common/quickInput'; @@ -47,11 +47,8 @@ import { IWorkingCopyService, IWorkingCopy } from 'vs/workbench/services/working import { sequence, timeout } from 'vs/base/common/async'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { once } from 'vs/base/common/functional'; -import { IEditorOptions } from 'vs/platform/editor/common/editor'; -import { IEditorGroup, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; import { Codicon } from 'vs/base/common/codicons'; import { IViewsService } from 'vs/workbench/common/views'; -import { openEditorWith, getAllAvailableEditors } from 'vs/workbench/contrib/files/common/openWith'; export const NEW_FILE_COMMAND_ID = 'explorer.newFile'; export const NEW_FILE_LABEL = nls.localize('newFile', "New File"); @@ -122,24 +119,6 @@ export class NewFolderAction extends Action { } } -/* Create new file from anywhere: Open untitled */ -export class GlobalNewUntitledFileAction extends Action { - static readonly ID = 'workbench.action.files.newUntitledFile'; - static readonly LABEL = nls.localize('newUntitledFile', "New Untitled File"); - - constructor( - id: string, - label: string, - @IEditorService private readonly editorService: IEditorService - ) { - super(id, label); - } - - async run(): Promise { - await this.editorService.openEditor({ options: { pinned: true } }); // untitled are always pinned - } -} - async function deleteFiles(workingCopyFileService: IWorkingCopyFileService, dialogService: IDialogService, configurationService: IConfigurationService, elements: ExplorerItem[], useTrash: boolean, skipConfirm = false): Promise { let primaryButton: string; if (useTrash) { @@ -243,7 +222,7 @@ async function deleteFiles(workingCopyFileService: IWorkingCopyFileService, dial // Call function try { - await Promise.all(distinctElements.map(e => workingCopyFileService.delete(e.resource, { useTrash: useTrash, recursive: true }))); + await workingCopyFileService.delete(distinctElements.map(e => e.resource), { useTrash, recursive: true }); } catch (error) { // Handle error to delete file(s) from a modal confirmation dialog @@ -465,6 +444,7 @@ export class GlobalCompareResourcesAction extends Action { @IQuickInputService private readonly quickInputService: IQuickInputService, @IEditorService private readonly editorService: IEditorService, @INotificationService private readonly notificationService: INotificationService, + @ITextModelService private readonly textModelService: ITextModelService ) { super(id, label); } @@ -472,29 +452,35 @@ export class GlobalCompareResourcesAction extends Action { async run(): Promise { const activeInput = this.editorService.activeEditor; const activeResource = activeInput ? activeInput.resource : undefined; - if (activeResource) { + if (activeResource && this.textModelService.canHandleResource(activeResource)) { // Compare with next editor that opens const toDispose = this.editorService.overrideOpenEditor({ - getEditorOverrides: (resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) => { - return []; - }, open: editor => { + // Only once! toDispose.dispose(); // Open editor as diff const resource = editor.resource; - if (resource) { + if (resource && this.textModelService.canHandleResource(resource)) { return { override: this.editorService.openEditor({ leftResource: activeResource, - rightResource: resource + rightResource: resource, + options: { override: false } }) }; } - return undefined; + // Otherwise stay on current resource + this.notificationService.info(nls.localize('fileToCompareNoFile', "Please select a file to compare with.")); + return { + override: this.editorService.openEditor({ + resource: activeResource, + options: { override: false } + }) + }; } }); @@ -511,75 +497,6 @@ export class GlobalCompareResourcesAction extends Action { } } -export class ReopenResourcesAction extends Action { - - static readonly ID = 'workbench.files.action.reopenWithEditor'; - static readonly LABEL = nls.localize('workbench.files.action.reopenWithEditor', "Reopen With..."); - - constructor( - id: string, - label: string, - @IQuickInputService private readonly quickInputService: IQuickInputService, - @IEditorService private readonly editorService: IEditorService, - @IConfigurationService private readonly configurationService: IConfigurationService - ) { - super(id, label); - } - - async run(): Promise { - const activeInput = this.editorService.activeEditor; - if (!activeInput) { - return; - } - - const activeEditorPane = this.editorService.activeEditorPane; - if (!activeEditorPane) { - return; - } - - const options = activeEditorPane.options; - const group = activeEditorPane.group; - await openEditorWith(activeInput, undefined, options, group, this.editorService, this.configurationService, this.quickInputService); - } -} - -export class ToggleEditorTypeCommand extends Action { - - static readonly ID = 'workbench.files.action.toggleEditorType'; - static readonly LABEL = nls.localize('workbench.files.action.toggleEditorType', "Toggle Editor Type"); - - constructor( - id: string, - label: string, - @IEditorService private readonly editorService: IEditorService, - ) { - super(id, label); - } - - async run(): Promise { - const activeEditorPane = this.editorService.activeEditorPane; - if (!activeEditorPane) { - return; - } - - const input = activeEditorPane.input; - if (!input.resource) { - return; - } - - const options = activeEditorPane.options; - const group = activeEditorPane.group; - - const overrides = getAllAvailableEditors(input.resource, options, group, this.editorService); - const firstNonActiveOverride = overrides.find(([_, entry]) => !entry.active); - if (!firstNonActiveOverride) { - return; - } - - await firstNonActiveOverride[0].open(input, options, group, OpenEditorContext.NEW_EDITOR, firstNonActiveOverride[1].id)?.override; - } -} - export class ToggleAutoSaveAction extends Action { static readonly ID = 'workbench.action.toggleAutoSave'; static readonly LABEL = nls.localize('toggleAutoSave', "Toggle Auto Save"); @@ -716,7 +633,7 @@ export class ShowActiveFileInExplorer extends Action { } async run(): Promise { - const resource = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }); if (resource) { this.commandService.executeCommand(REVEAL_IN_EXPLORER_COMMAND_ID, resource); } else { @@ -784,7 +701,7 @@ export class ShowOpenedFileInNewWindow extends Action { } async run(): Promise { - const fileResource = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER }); + const fileResource = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }); if (fileResource) { if (this.fileService.canHandleResource(fileResource)) { this.hostService.openWindow([{ fileUri: fileResource }], { forceNewWindow: true }); @@ -896,7 +813,7 @@ export class CompareWithClipboardAction extends Action { } async run(): Promise { - const resource = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }); const scheme = `clipboardCompare${CompareWithClipboardAction.SCHEME_COUNTER++}`; if (resource && (this.fileService.canHandleResource(resource) || resource.scheme === Schemas.untitled)) { if (!this.registrationDisposal) { @@ -1030,7 +947,7 @@ export const renameHandler = async (accessor: ServicesAccessor) => { const targetResource = resources.joinPath(parentResource, value); if (stat.resource.toString() !== targetResource.toString()) { try { - await workingCopyFileService.move(stat.resource, targetResource); + await workingCopyFileService.move([{ source: stat.resource, target: targetResource }]); await refreshIfSeparator(value, explorerService); } catch (e) { notificationService.error(e); @@ -1116,7 +1033,7 @@ const downloadFileHandler = (accessor: ServicesAccessor) => { defaultUri }); if (destination) { - await workingCopyFileService.copy(s.resource, destination, true); + await workingCopyFileService.copy([{ source: s.resource, target: destination }], { overwrite: true }); } else { // User canceled a download. In case there were multiple files selected we should cancel the remainder of the prompts #86100 canceled = true; @@ -1143,14 +1060,13 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { const toPaste = resources.distinctParents(await clipboardService.readResources(), r => r); const element = context.length ? context[0] : explorerService.roots[0]; - // Check if target is ancestor of pasted folder - const stats = await Promise.all(toPaste.map(async fileToPaste => { + try { + // Check if target is ancestor of pasted folder + const sourceTargetPairs = await Promise.all(toPaste.map(async fileToPaste => { - if (element.resource.toString() !== fileToPaste.toString() && resources.isEqualOrParent(element.resource, fileToPaste)) { - throw new Error(nls.localize('fileIsAncestor', "File to paste is an ancestor of the destination folder")); - } - - try { + if (element.resource.toString() !== fileToPaste.toString() && resources.isEqualOrParent(element.resource, fileToPaste)) { + throw new Error(nls.localize('fileIsAncestor', "File to paste is an ancestor of the destination folder")); + } const fileToPasteStat = await fileService.resolve(fileToPaste); // Find target @@ -1164,30 +1080,33 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { const incrementalNaming = configurationService.getValue().explorer.incrementalNaming; const targetFile = findValidPasteFileTarget(explorerService, target, { resource: fileToPaste, isDirectory: fileToPasteStat.isDirectory, allowOverwrite: pasteShouldMove }, incrementalNaming); - // Move/Copy File - if (pasteShouldMove) { - return await workingCopyFileService.move(fileToPaste, targetFile); - } else { - return await workingCopyFileService.copy(fileToPaste, targetFile); - } - } catch (e) { - onError(notificationService, new Error(nls.localize('fileDeleted', "The file to paste has been deleted or moved since you copied it. {0}", getErrorMessage(e)))); - return undefined; - } - })); + return { source: fileToPaste, target: targetFile }; + })); - if (pasteShouldMove) { - // Cut is done. Make sure to clear cut state. - await explorerService.setToCopy([], false); - pasteShouldMove = false; - } - if (stats.length >= 1) { - const stat = stats[0]; - if (stat && !stat.isDirectory && stats.length === 1) { - await editorService.openEditor({ resource: stat.resource, options: { pinned: true, preserveFocus: true } }); + // Move/Copy File + let stats: IFileStatWithMetadata[] = []; + if (pasteShouldMove) { + stats = await workingCopyFileService.move(sourceTargetPairs); + } else { + stats = await workingCopyFileService.copy(sourceTargetPairs); } - if (stat) { - await explorerService.select(stat.resource); + + if (stats.length >= 1) { + const stat = stats[0]; + if (stat && !stat.isDirectory && stats.length === 1) { + await editorService.openEditor({ resource: stat.resource, options: { pinned: true, preserveFocus: true } }); + } + if (stat) { + await explorerService.select(stat.resource); + } + } + } catch (e) { + onError(notificationService, new Error(nls.localize('fileDeleted', "The file(s) to paste have been deleted or moved since you copied them. {0}", getErrorMessage(e)))); + } finally { + if (pasteShouldMove) { + // Cut is done. Make sure to clear cut state. + await explorerService.setToCopy([], false); + pasteShouldMove = false; } } }; diff --git a/src/vs/workbench/contrib/files/browser/fileCommands.ts b/src/vs/workbench/contrib/files/browser/fileCommands.ts index 962889474c4..441537060af 100644 --- a/src/vs/workbench/contrib/files/browser/fileCommands.ts +++ b/src/vs/workbench/contrib/files/browser/fileCommands.ts @@ -40,10 +40,10 @@ import { coalesce } from 'vs/base/common/arrays'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/embeddedCodeEditorWidget'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { openEditorWith } from 'vs/workbench/contrib/files/common/openWith'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { openEditorWith } from 'vs/workbench/services/editor/common/editorOpenWith'; // Commands @@ -85,6 +85,8 @@ export const PREVIOUS_COMPRESSED_FOLDER = 'previousCompressedFolder'; export const NEXT_COMPRESSED_FOLDER = 'nextCompressedFolder'; export const FIRST_COMPRESSED_FOLDER = 'firstCompressedFolder'; export const LAST_COMPRESSED_FOLDER = 'lastCompressedFolder'; +export const NEW_UNTITLED_FILE_COMMAND_ID = 'workbench.action.files.newUntitledFile'; +export const NEW_UNTITLED_FILE_LABEL = nls.localize('newUntitledFile', "New Untitled File"); export const openWindowCommand = (accessor: ServicesAccessor, toOpen: IWindowOpenable[], options?: IOpenWindowOptions) => { if (Array.isArray(toOpen)) { @@ -176,7 +178,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ // Dispose once no more diff editor is opened with the scheme if (registerEditorListener) { providerDisposables.push(editorService.onDidVisibleEditorsChange(() => { - if (!editorService.editors.some(editor => !!toResource(editor, { supportSideBySide: SideBySideEditor.DETAILS, filterByScheme: COMPARE_WITH_SAVED_SCHEMA }))) { + if (!editorService.editors.some(editor => !!toResource(editor, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: COMPARE_WITH_SAVED_SCHEMA }))) { providerDisposables = dispose(providerDisposables); } })); @@ -354,8 +356,8 @@ async function saveSelectedEditors(accessor: ServicesAccessor, options?: ISaveEd // We only allow this when saving, not for "Save As". // See also https://github.com/microsoft/vscode/issues/4180 if (activeGroup.activeEditor instanceof SideBySideEditorInput && !options?.saveAs) { - editors.push({ groupId: activeGroup.id, editor: activeGroup.activeEditor.master }); - editors.push({ groupId: activeGroup.id, editor: activeGroup.activeEditor.details }); + editors.push({ groupId: activeGroup.id, editor: activeGroup.activeEditor.primary }); + editors.push({ groupId: activeGroup.id, editor: activeGroup.activeEditor.secondary }); } else { editors.push({ groupId: activeGroup.id, editor: activeGroup.activeEditor }); } @@ -378,7 +380,7 @@ async function saveSelectedEditors(accessor: ServicesAccessor, options?: ISaveEd const resource = focusedCodeEditor.getModel()?.uri; // Check that the resource of the model was not saved already - if (resource && !editors.some(({ editor }) => isEqual(toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }), resource))) { + if (resource && !editors.some(({ editor }) => isEqual(toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }), resource))) { const model = textFileService.files.get(resource); if (!model?.isReadonly()) { await textFileService.save(resource, options); @@ -407,7 +409,7 @@ async function doSaveEditors(accessor: ServicesAccessor, editors: IEditorIdentif try { await editorService.save(editors, options); } catch (error) { - notificationService.error(nls.localize('genericSaveError', "Failed to save '{0}': {1}", editors.map(({ editor }) => editor.getName()).join(', '), toErrorMessage(error, false))); + notificationService.error(nls.localize({ key: 'genericSaveError', comment: ['{0} is the resource that failed to save and {1} the error message'] }, "Failed to save '{0}': {1}", editors.map(({ editor }) => editor.getName()).join(', '), toErrorMessage(error, false))); } } @@ -597,3 +599,41 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ view.lastCompressedStat(); } }); + +KeybindingsRegistry.registerCommandAndKeybindingRule({ + weight: KeybindingWeight.WorkbenchContrib, + when: null, + primary: KeyMod.CtrlCmd | KeyCode.KEY_N, + id: NEW_UNTITLED_FILE_COMMAND_ID, + description: { + description: NEW_UNTITLED_FILE_LABEL, + args: [ + { + name: 'viewType', description: 'The editor view type', schema: { + 'type': 'object', + 'required': ['viewType'], + 'properties': { + 'viewType': { + 'type': 'string' + } + } + } + } + ] + }, + handler: async (accessor, args?: { viewType: string }) => { + const editorService = accessor.get(IEditorService); + + if (args) { + const editorGroupsService = accessor.get(IEditorGroupsService); + const configurationService = accessor.get(IConfigurationService); + const quickInputService = accessor.get(IQuickInputService); + + const textInput = editorService.createEditorInput({ options: { pinned: true } }); + const group = editorGroupsService.activeGroup; + await openEditorWith(textInput, args.viewType, { pinned: true }, group, editorService, configurationService, quickInputService); + } else { + await editorService.openEditor({ options: { pinned: true } }); // untitled are always pinned + } + } +}); diff --git a/src/vs/workbench/contrib/files/browser/files.ts b/src/vs/workbench/contrib/files/browser/files.ts index 1274f2b97d5..ac012e62fc4 100644 --- a/src/vs/workbench/contrib/files/browser/files.ts +++ b/src/vs/workbench/contrib/files/browser/files.ts @@ -50,7 +50,7 @@ export function getResourceForCommand(resource: URI | object | undefined, listSe return focus.getResource(); } - return editorService.activeEditor ? toResource(editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER }) : undefined; + return editorService.activeEditor ? toResource(editorService.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }) : undefined; } export function getMultiSelectedResources(resource: URI | object | undefined, listService: IListService, editorService: IEditorService, explorerService: IExplorerService): Array { diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index f09336ff973..66d94162794 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -24,7 +24,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ResourceContextKey } from 'vs/workbench/common/resources'; import { IDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; -import { TreeResourceNavigator, WorkbenchCompressibleAsyncDataTree } from 'vs/platform/list/browser/listService'; +import { WorkbenchCompressibleAsyncDataTree } from 'vs/platform/list/browser/listService'; import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer'; @@ -421,22 +421,23 @@ export class ExplorerView extends ViewPane { // Update resource context based on focused element this._register(this.tree.onDidChangeFocus(e => this.onFocusChanged(e.elements))); this.onFocusChanged([]); - const explorerNavigator = new TreeResourceNavigator(this.tree); - this._register(explorerNavigator); // Open when selecting via keyboard - this._register(explorerNavigator.onDidOpenResource(async e => { - const selection = this.tree.getSelection(); + this._register(this.tree.onDidOpen(async e => { + const element = e.element; + if (!element) { + return; + } // Do not react if the user is expanding selection via keyboard. // Check if the item was previously also selected, if yes the user is simply expanding / collapsing current selection #66589. const shiftDown = e.browserEvent instanceof KeyboardEvent && e.browserEvent.shiftKey; - if (selection.length === 1 && !shiftDown) { - if (selection[0].isDirectory || this.explorerService.isEditable(undefined)) { + if (!shiftDown) { + if (element.isDirectory || this.explorerService.isEditable(undefined)) { // Do not react if user is clicking on explorer items while some are being edited #70276 // Do not react if clicking on directories return; } this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'explorer' }); - await this.editorService.openEditor({ resource: selection[0].resource, options: { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned } }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP); + await this.editorService.openEditor({ resource: element.resource, options: { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned } }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP); } })); @@ -449,6 +450,16 @@ export class ExplorerView extends ViewPane { } })); + this._register(this.tree.onDidChangeCollapseState(e => { + const element = e.node.element?.element; + if (element) { + const navigationController = this.renderer.getCompressedNavigationController(element instanceof Array ? element[0] : element); + if (navigationController) { + navigationController.updateCollapsed(e.node.collapsed); + } + } + })); + // save view state this._register(this.storageService.onWillSaveState(() => { this.storageService.store(ExplorerView.TREE_VIEW_STATE_STORAGE_KEY, JSON.stringify(this.tree.getViewState()), StorageScope.WORKSPACE); @@ -657,7 +668,7 @@ export class ExplorerView extends ViewPane { } // check for files - return withNullAsUndefined(toResource(input, { supportSideBySide: SideBySideEditor.MASTER })); + return withNullAsUndefined(toResource(input, { supportSideBySide: SideBySideEditor.PRIMARY })); } public async selectResource(resource: URI | undefined, reveal = this.autoReveal, retry = 0): Promise { diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index dc82b457c13..0a9c981b13b 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -134,6 +134,7 @@ export interface ICompressedNavigationController { first(): void; last(): void; setIndex(index: number): void; + updateCollapsed(collapsed: boolean): void; } export class CompressedNavigationController implements ICompressedNavigationController, IDisposable { @@ -153,7 +154,7 @@ export class CompressedNavigationController implements ICompressedNavigationCont private _onDidChange = new Emitter(); readonly onDidChange = this._onDidChange.event; - constructor(private id: string, readonly items: ExplorerItem[], templateData: IFileTemplateData) { + constructor(private id: string, readonly items: ExplorerItem[], templateData: IFileTemplateData, private depth: number, private collapsed: boolean) { this._index = items.length - 1; this.updateLabels(templateData); @@ -165,7 +166,9 @@ export class CompressedNavigationController implements ICompressedNavigationCont for (let i = 0; i < this.labels.length; i++) { this.labels[i].setAttribute('aria-label', this.items[i].name); + this.labels[i].setAttribute('aria-level', `${this.depth + i}`); } + this.updateCollapsed(this.collapsed); if (this._index < this.labels.length) { DOM.addClass(this.labels[this._index], 'active'); @@ -216,6 +219,13 @@ export class CompressedNavigationController implements ICompressedNavigationCont this._onDidChange.fire(); } + updateCollapsed(collapsed: boolean): void { + this.collapsed = collapsed; + for (let i = 0; i < this.labels.length; i++) { + this.labels[i].setAttribute('aria-expanded', collapsed ? 'false' : 'true'); + } + } + dispose(): void { this._onDidChange.dispose(); this._updateLabelDisposable.dispose(); @@ -308,7 +318,7 @@ export class FilesRenderer implements ICompressibleTreeRenderer e.name); disposables.add(this.renderStat(stat, label, id, node.filterData, templateData)); - const compressedNavigationController = new CompressedNavigationController(id, node.element.elements, templateData); + const compressedNavigationController = new CompressedNavigationController(id, node.element.elements, templateData, node.depth, node.collapsed); disposables.add(compressedNavigationController); this.compressedNavigationControllers.set(stat, compressedNavigationController); @@ -704,14 +714,27 @@ export class FileSorter implements ITreeSorter { } } -const getFileOverwriteConfirm = (name: string) => { - return { +function getFileOverwriteConfirm(name: string): IConfirmation { + return { message: localize('confirmOverwrite', "A file or folder with the name '{0}' already exists in the destination folder. Do you want to replace it?", name), detail: localize('irreversible', "This action is irreversible!"), primaryButton: localize({ key: 'replaceButtonLabel', comment: ['&& denotes a mnemonic'] }, "&&Replace"), type: 'warning' }; -}; +} + +function getMultipleFilesOverwriteConfirm(files: URI[]): IConfirmation { + if (files.length > 1) { + return { + message: localize('confirmManyOverwrites', "The following {0} files and/or folders already exist in the destination folder. Do you want to replace them?", files.length), + detail: getFileNamesMessage(files) + '\n' + localize('irreversible', "This action is irreversible!"), + primaryButton: localize({ key: 'replaceButtonLabel', comment: ['&& denotes a mnemonic'] }, "&&Replace"), + type: 'warning' + }; + } + + return getFileOverwriteConfirm(basename(files[0])); +} interface IWebkitDataTransfer { items: IWebkitDataTransferItem[]; @@ -734,6 +757,14 @@ interface IWebkitDataTransferItemEntryReader { readEntries(resolve: (file: IWebkitDataTransferItemEntry[]) => void, reject: () => void): void } +interface IUploadOperation { + filesTotal: number; + filesUploaded: number; + + startTime: number; + bytesUploaded: number; +} + export class FileDragAndDrop implements ITreeDragAndDrop { private static readonly CONFIRM_DND_SETTING_KEY = 'explorer.confirmDragAndDrop'; @@ -974,7 +1005,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { const results: { isFile: boolean, resource: URI }[] = []; const cts = new CancellationTokenSource(); - const operation = { total: entries.length, worked: 0 }; + const operation: IUploadOperation = { filesTotal: entries.length, filesUploaded: 0, startTime: Date.now(), bytesUploaded: 0 }; // Start upload and report progress globally const uploadPromise = this.progressService.withProgress({ @@ -992,7 +1023,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { continue; } - await this.workingCopyFileService.delete(joinPath(target.resource, entry.name), { recursive: true }); + await this.workingCopyFileService.delete([joinPath(target.resource, entry.name)], { recursive: true }); } // Upload entry @@ -1015,30 +1046,33 @@ export class FileDragAndDrop implements ITreeDragAndDrop { } } - private async doUploadWebFileEntry(entry: IWebkitDataTransferItemEntry, parentResource: URI, target: ExplorerItem | undefined, progress: IProgress, operation: { total: number; worked: number; }, token: CancellationToken): Promise<{ isFile: boolean, resource: URI } | undefined> { + private async doUploadWebFileEntry(entry: IWebkitDataTransferItemEntry, parentResource: URI, target: ExplorerItem | undefined, progress: IProgress, operation: IUploadOperation, token: CancellationToken): Promise<{ isFile: boolean, resource: URI } | undefined> { if (token.isCancellationRequested || !entry.name || (!entry.isFile && !entry.isDirectory)) { return undefined; } // Report progress - let totalBytesUploaded = 0; + let fileBytesUploaded = 0; const reportProgress = (fileSize: number, bytesUploaded: number): void => { - totalBytesUploaded += bytesUploaded; + fileBytesUploaded += bytesUploaded; + operation.bytesUploaded += bytesUploaded; + + const bytesUploadedPerSecond = operation.bytesUploaded / ((Date.now() - operation.startTime) / 1000); let message: string; - if (operation.total === 1 && entry.name) { + if (operation.filesTotal === 1 && entry.name) { message = entry.name; } else { - message = localize('uploadProgress', "{0} of {1} files", operation.worked, operation.total); + message = localize('uploadProgress', "{0} of {1} files ({2}/s)", operation.filesUploaded, operation.filesTotal, BinarySize.formatSize(bytesUploadedPerSecond)); } if (fileSize > BinarySize.MB) { - message = localize('uploadProgressDetail', "{0} ({1} of {2})", message, BinarySize.formatSize(totalBytesUploaded), BinarySize.formatSize(fileSize)); + message = localize('uploadProgressDetail', "{0} ({1} of {2}, {3}/s)", message, BinarySize.formatSize(fileBytesUploaded), BinarySize.formatSize(fileSize), BinarySize.formatSize(bytesUploadedPerSecond)); } progress.report({ message }); }; - operation.worked++; + operation.filesUploaded++; reportProgress(0, 0); // Handle file upload @@ -1057,7 +1091,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { // Fallback to unbuffered upload for other browsers else { - await this.doUploadWebFileEntryUnbuffered(resource, file); + await this.doUploadWebFileEntryUnbuffered(resource, file, reportProgress); } return { isFile: true, resource }; @@ -1087,7 +1121,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { } while (!done); // Update operation total based on new counts - operation.total += childEntries.length; + operation.filesTotal += childEntries.length; // Upload all entries as files to target const folderTarget = target && target.getChild(entry.name) || undefined; @@ -1145,13 +1179,17 @@ export class FileDragAndDrop implements ITreeDragAndDrop { await writeFilePromise; } - private doUploadWebFileEntryUnbuffered(resource: URI, file: File): Promise { + private doUploadWebFileEntryUnbuffered(resource: URI, file: File, progressReporter: (fileSize: number, bytesUploaded: number) => void): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = async event => { try { if (event.target?.result instanceof ArrayBuffer) { - await this.fileService.writeFile(resource, VSBuffer.wrap(new Uint8Array(event.target.result))); + const buffer = VSBuffer.wrap(new Uint8Array(event.target.result)); + await this.fileService.writeFile(resource, buffer); + + // Report progress + progressReporter(file.size, buffer.byteLength); } else { throw new Error('Could not read from dropped file.'); } @@ -1238,7 +1276,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { const sourceFile = resource; const targetFile = joinPath(target.resource, basename(sourceFile)); - const stat = await this.workingCopyFileService.copy(sourceFile, targetFile, true); + const stat = (await this.workingCopyFileService.copy([{ source: sourceFile, target: targetFile }], { overwrite: true }))[0]; // if we only add one file, just open it directly if (resources.length === 1 && !stat.isDirectory) { this.editorService.openEditor({ resource: stat.resource, options: { pinned: true } }); @@ -1284,8 +1322,14 @@ export class FileDragAndDrop implements ITreeDragAndDrop { } } - const rootDropPromise = this.doHandleRootDrop(items.filter(s => s.isRoot), target); - await Promise.all(items.filter(s => !s.isRoot).map(source => this.doHandleExplorerDrop(source, target, isCopy)).concat(rootDropPromise)); + await this.doHandleRootDrop(items.filter(s => s.isRoot), target); + + const sources = items.filter(s => !s.isRoot); + if (isCopy) { + await this.doHandleExplorerDropOnCopy(sources, target); + } else { + return this.doHandleExplorerDropOnMove(sources, target); + } } private doHandleRootDrop(roots: ExplorerItem[], target: ExplorerItem): Promise { @@ -1321,36 +1365,40 @@ export class FileDragAndDrop implements ITreeDragAndDrop { return this.workspaceEditingService.updateFolders(0, workspaceCreationData.length, workspaceCreationData); } - private async doHandleExplorerDrop(source: ExplorerItem, target: ExplorerItem, isCopy: boolean): Promise { - // Reuse duplicate action if user copies - if (isCopy) { - const incrementalNaming = this.configurationService.getValue().explorer.incrementalNaming; - const stat = await this.workingCopyFileService.copy(source.resource, findValidPasteFileTarget(this.explorerService, target, { resource: source.resource, isDirectory: source.isDirectory, allowOverwrite: false }, incrementalNaming)); - if (!stat.isDirectory) { - await this.editorService.openEditor({ resource: stat.resource, options: { pinned: true } }); - } + private async doHandleExplorerDropOnCopy(sources: ExplorerItem[], target: ExplorerItem): Promise { + // Reuse duplicate action when user copies + const incrementalNaming = this.configurationService.getValue().explorer.incrementalNaming; + const sourceTargetPairs = sources.map(({ resource, isDirectory }) => ({ source: resource, target: findValidPasteFileTarget(this.explorerService, target, { resource, isDirectory, allowOverwrite: false }, incrementalNaming) })); + const stats = await this.workingCopyFileService.copy(sourceTargetPairs); + const editors = stats.filter(stat => !stat.isDirectory).map(({ resource }) => ({ resource, options: { pinned: true } })); - return; - } + await this.editorService.openEditors(editors); + } - // Otherwise move - const targetResource = joinPath(target.resource, source.name); - if (source.isReadonly) { - // Do not allow moving readonly items - return Promise.resolve(); - } + private async doHandleExplorerDropOnMove(sources: ExplorerItem[], target: ExplorerItem): Promise { + + // Do not allow moving readonly items + const sourceTargetPairs = sources.filter(source => !source.isReadonly).map(source => ({ source: source.resource, target: joinPath(target.resource, source.name) })); try { - await this.workingCopyFileService.move(source.resource, targetResource); + await this.workingCopyFileService.move(sourceTargetPairs); } catch (error) { // Conflict if ((error).fileOperationResult === FileOperationResult.FILE_MOVE_CONFLICT) { - const confirm = getFileOverwriteConfirm(source.name); + + const overwrites: URI[] = []; + for (const { target } of sourceTargetPairs) { + if (await this.fileService.exists(target)) { + overwrites.push(target); + } + } + + const confirm = getMultipleFilesOverwriteConfirm(overwrites); // Move with overwrite if the user confirms const { confirmed } = await this.dialogService.confirm(confirm); if (confirmed) { try { - await this.workingCopyFileService.move(source.resource, targetResource, true /* overwrite */); + await this.workingCopyFileService.move(sourceTargetPairs, { overwrite: true }); } catch (error) { this.notificationService.error(error); } diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index 9b71a03b912..485601fdb5d 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -22,7 +22,7 @@ import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/c import { attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { badgeBackground, badgeForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { WorkbenchList } from 'vs/platform/list/browser/listService'; +import { WorkbenchList, ListResourceNavigator } from 'vs/platform/list/browser/listService'; import { IListVirtualDelegate, IListRenderer, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction } from 'vs/base/browser/ui/list/list'; import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -269,29 +269,21 @@ export class OpenEditorsView extends ViewPane { e.element.group.closeEditor(e.element.editor, { preserveFocus: true }); } })); - this._register(this.list.onDidOpen(e => { - const browserEvent = e.browserEvent; - - let openToSide = false; - let isSingleClick = false; - let isDoubleClick = false; - let isMiddleClick = false; - if (browserEvent instanceof MouseEvent) { - isSingleClick = browserEvent.detail === 1; - isDoubleClick = browserEvent.detail === 2; - isMiddleClick = browserEvent.button === 1; - openToSide = this.list.useAltAsMultipleSelectionModifier ? (browserEvent.ctrlKey || browserEvent.metaKey) : browserEvent.altKey; + const resourceNavigator = this._register(new ListResourceNavigator(this.list, { configurationService: this.configurationService })); + this._register(resourceNavigator.onDidOpen(e => { + if (typeof e.element !== 'number') { + return; } - const focused = this.list.getFocusedElements(); - const element = focused.length ? focused[0] : undefined; + const element = this.list.element(e.element); + if (element instanceof OpenEditor) { - if (isMiddleClick) { - return; // already handled above: closes the editor + if (e.browserEvent instanceof MouseEvent && e.browserEvent.button === 1) { + return; // middle click already handled above: closes the editor } - this.openEditor(element, { preserveFocus: isSingleClick, pinned: isDoubleClick, sideBySide: openToSide }); - } else if (element) { + this.openEditor(element, { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned, sideBySide: e.sideBySide }); + } else { this.editorGroupService.activateGroup(element); } })); @@ -367,7 +359,7 @@ export class OpenEditorsView extends ViewPane { return -1; } - private openEditor(element: OpenEditor, options: { preserveFocus: boolean; pinned: boolean; sideBySide: boolean; }): void { + private openEditor(element: OpenEditor, options: { preserveFocus?: boolean; pinned?: boolean; sideBySide?: boolean; }): void { if (element) { this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); diff --git a/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts b/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts index d338237cde4..aaf749555d4 100644 --- a/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts +++ b/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts @@ -236,9 +236,10 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements } private async doResolveAsText(): Promise { - - // Resolve as text try { + + // Resolve resource via text file service and only allow + // to open binary files if we are instructed so await this.textFileService.files.resolve(this.resource, { mode: this.preferredMode, encoding: this.preferredEncoding, @@ -255,7 +256,16 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements this.cachedTextFileModelReference = await this.textModelResolverService.createModelReference(this.resource) as IReference; } - return this.cachedTextFileModelReference.object; + const model = this.cachedTextFileModelReference.object; + + // It is possible that this input was disposed before the model + // finished resolving. As such, we need to make sure to dispose + // the model reference to not leak it. + if (this.isDisposed()) { + this.disposeModelReference(); + } + + return model; } catch (error) { // In case of an error that indicates that the file is binary or too large, just return with the binary editor model @@ -279,7 +289,7 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements return !!this.model; } - move(group: GroupIdentifier, target: URI): IMoveResult { + rename(group: GroupIdentifier, target: URI): IMoveResult { return { editor: { resource: target, @@ -304,12 +314,12 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements } matches(otherInput: unknown): boolean { - if (super.matches(otherInput) === true) { + if (otherInput === this) { return true; } - if (otherInput) { - return otherInput instanceof FileEditorInput && otherInput.resource.toString() === this.resource.toString(); + if (otherInput instanceof FileEditorInput) { + return extUri.isEqual(otherInput.resource, this.resource); } return false; @@ -321,9 +331,13 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements this.model = undefined; // Model reference - dispose(this.cachedTextFileModelReference); - this.cachedTextFileModelReference = undefined; + this.disposeModelReference(); super.dispose(); } + + private disposeModelReference(): void { + dispose(this.cachedTextFileModelReference); + this.cachedTextFileModelReference = undefined; + } } diff --git a/src/vs/workbench/contrib/files/common/files.ts b/src/vs/workbench/contrib/files/common/files.ts index 9f1c4d9d1bc..3fe4953a5c6 100644 --- a/src/vs/workbench/contrib/files/common/files.ts +++ b/src/vs/workbench/contrib/files/common/files.ts @@ -33,11 +33,6 @@ export const VIEWLET_ID = 'workbench.view.explorer'; */ export const VIEW_ID = 'workbench.explorer.fileView'; -/** - * Id of the default editor for open with. - */ -export const DEFAULT_EDITOR_ID = 'default'; - export interface IExplorerService { readonly _serviceBrand: undefined; readonly roots: ExplorerItem[]; @@ -256,6 +251,6 @@ export class OpenEditor implements IEditorIdentifier { } getResource(): URI | undefined { - return toResource(this.editor, { supportSideBySide: SideBySideEditor.MASTER }); + return toResource(this.editor, { supportSideBySide: SideBySideEditor.PRIMARY }); } } diff --git a/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts b/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts index e8904d74e27..ae9dc54c9dc 100644 --- a/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts @@ -87,7 +87,7 @@ suite('Files - ExplorerView', () => { container: label, onDidRender: emitter.event } - }); + }, 1, false); assert.equal(navigationController.count, 3); assert.equal(navigationController.index, 2); diff --git a/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts b/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts index 8a206ec3501..439a4ba8eea 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts @@ -42,7 +42,7 @@ if (!!product.reportIssueUrl) { MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command }); } -const developerCategory = nls.localize('developer', "Developer"); +const developerCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); workbenchActionsRegistry.registerWorkbenchAction(SyncActionDescriptor.from(OpenProcessExplorer), 'Developer: Open Process Explorer', developerCategory); registerSingleton(IWorkbenchIssueService, WorkbenchIssueService, true); diff --git a/src/vs/workbench/contrib/logs/common/logs.contribution.ts b/src/vs/workbench/contrib/logs/common/logs.contribution.ts index 0075652ceaa..4204efe372d 100644 --- a/src/vs/workbench/contrib/logs/common/logs.contribution.ts +++ b/src/vs/workbench/contrib/logs/common/logs.contribution.ts @@ -24,7 +24,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { LogsDataCleaner } from 'vs/workbench/contrib/logs/common/logsDataCleaner'; const workbenchActionsRegistry = Registry.as(WorkbenchActionExtensions.WorkbenchActions); -const devCategory = nls.localize('developer', "Developer"); +const devCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); workbenchActionsRegistry.registerWorkbenchAction(SyncActionDescriptor.from(SetLogLevelAction), 'Developer: Set Log Level...', devCategory); class LogOutputChannels extends Disposable implements IWorkbenchContribution { @@ -53,7 +53,7 @@ class LogOutputChannels extends Disposable implements IWorkbenchContribution { this.instantiationService.createInstance(LogsDataCleaner); const workbenchActionsRegistry = Registry.as(WorkbenchActionExtensions.WorkbenchActions); - const devCategory = nls.localize('developer', "Developer"); + const devCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); workbenchActionsRegistry.registerWorkbenchAction(SyncActionDescriptor.from(OpenWindowSessionLogFileAction), 'Developer: Open Window Log File (Session)...', devCategory); } diff --git a/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts b/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts index 56e7710a32e..8196c1feabb 100644 --- a/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts +++ b/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts @@ -10,6 +10,6 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { OpenLogsFolderAction, OpenExtensionLogsFolderAction } from 'vs/workbench/contrib/logs/electron-browser/logsActions'; const workbenchActionsRegistry = Registry.as(WorkbenchActionExtensions.WorkbenchActions); -const devCategory = nls.localize('developer', "Developer"); +const devCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); workbenchActionsRegistry.registerWorkbenchAction(SyncActionDescriptor.from(OpenLogsFolderAction), 'Developer: Open Logs Folder', devCategory); workbenchActionsRegistry.registerWorkbenchAction(SyncActionDescriptor.from(OpenExtensionLogsFolderAction), 'Developer: Open Extension Logs Folder', devCategory); diff --git a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts index 44ec95995b1..4a8f6b2d4c2 100644 --- a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts @@ -16,7 +16,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { IDisposable, dispose, Disposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ActionBar, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { QuickFixAction, QuickFixActionViewItem } from 'vs/workbench/contrib/markers/browser/markersViewActions'; import { ILabelService } from 'vs/platform/label/common/label'; import { dirname, basename, isEqual } from 'vs/base/common/resources'; @@ -254,6 +254,30 @@ export class MarkerRenderer implements ITreeRenderer action.id === QuickFixAction.ID ? _instantiationService.createInstance(QuickFixActionViewItem, action) : undefined })); this.icon = dom.append(parent, dom.$('')); - this.multilineActionbar = this._register(new ActionBar(dom.append(parent, dom.$('.multiline-actions')))); + this.multilineActionbar = this._register(new ActionBar(dom.append(parent, dom.$('.multiline-actions')), { + actionViewItemProvider: (action) => { + if (action.id === toggleMultilineAction) { + return new ToggleMultilineActionViewItem(undefined, action, { icon: true }); + } + return undefined; + } + })); this.messageAndDetailsContainer = dom.append(parent, dom.$('.marker-message-details-container')); this._clickModifierKey = this._getClickModifierKey(); @@ -332,10 +363,10 @@ class MarkerWidget extends Disposable { private renderMultilineActionbar(marker: Marker): void { const viewModel = this.markersViewModel.getViewModel(marker); const multiline = viewModel && viewModel.multiline; - const action = new Action('problems.action.toggleMultiline'); + const action = new Action(toggleMultilineAction); action.enabled = !!viewModel && marker.lines.length > 1; action.tooltip = multiline ? localize('single line', "Show message in single line") : localize('multi line', "Show message in multiple lines"); - action.class = multiline ? 'codicon codicon-chevron-up' : 'codicon codicon-chevron-down'; + action.class = multiline ? expandedClass : collapsedClass; action.run = () => { if (viewModel) { viewModel.multiline = !viewModel.multiline; } return Promise.resolve(); }; this.multilineActionbar.push([action], { icon: true, label: false }); } diff --git a/src/vs/workbench/contrib/markers/browser/markersView.ts b/src/vs/workbench/contrib/markers/browser/markersView.ts index 3401c3cc1ae..f6796e95edb 100644 --- a/src/vs/workbench/contrib/markers/browser/markersView.ts +++ b/src/vs/workbench/contrib/markers/browser/markersView.ts @@ -26,7 +26,7 @@ import { IContextKey, IContextKeyService, ContextKeyEqualsExpr, ContextKeyExpr } import { Iterable } from 'vs/base/common/iterator'; import { ITreeElement, ITreeNode, ITreeContextMenuEvent, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { Relay, Event, Emitter } from 'vs/base/common/event'; -import { WorkbenchObjectTree, TreeResourceNavigator, IListService, IWorkbenchObjectTreeOptions } from 'vs/platform/list/browser/listService'; +import { WorkbenchObjectTree, IListService, IWorkbenchObjectTreeOptions } from 'vs/platform/list/browser/listService'; import { FilterOptions } from 'vs/workbench/contrib/markers/browser/markersFilterOptions'; import { IExpression } from 'vs/base/common/glob'; import { deepClone } from 'vs/base/common/objects'; @@ -198,7 +198,8 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { if (this.hasNoProblems() && this.messageBoxContainer) { this.messageBoxContainer.focus(); } else if (this.tree) { - this.tree.getHTMLElement().focus(); + this.tree.domFocus(); + this.setTreeSelection(); } } @@ -295,6 +296,7 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { private refreshPanel(markerOrChange?: Marker | MarkerChangesEvent): void { if (this.isVisible() && this.tree) { + const hasSelection = this.tree.getSelection().length > 0; this.cachedFilterStats = undefined; if (markerOrChange) { @@ -321,6 +323,20 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { this.tree.toggleVisibility(total === 0 || filtered === 0); this.renderMessage(); this._onDidChangeFilterStats.fire(this.getFilterStats()); + + if (hasSelection) { + this.setTreeSelection(); + } + } + } + + private setTreeSelection(): void { + if (this.tree && this.tree.getSelection().length === 0) { + const firstMarker = this.markersWorkbenchService.markersModel.resourceMarkers[0].markers[0]; + if (firstMarker) { + this.tree.setFocus([firstMarker]); + this.tree.setSelection([firstMarker]); + } } } @@ -424,7 +440,8 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { expandOnlyOnTwistieClick: (e: TreeElement) => e instanceof Marker && e.relatedInformation.length > 0, overrideStyles: { listBackground: this.getBackgroundColor() - } + }, + openOnFocus: true }, )); @@ -437,8 +454,7 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { relatedInformationFocusContextKey.set(focus.elements.some(e => e instanceof RelatedInformation)); })); - const markersNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: true })); - this._register(Event.debounce(markersNavigator.onDidOpenResource, (last, event) => event, 75, true)(options => { + this._register(Event.debounce(this.tree.onDidOpen, (last, event) => event, 75, true)(options => { this.openFileAtElement(options.element, !!options.editorOptions.preserveFocus, options.sideBySide, !!options.editorOptions.pinned); })); this._register(this.tree.onDidChangeCollapseState(({ node }) => { diff --git a/src/vs/workbench/contrib/markers/browser/media/markers.css b/src/vs/workbench/contrib/markers/browser/media/markers.css index b5570494b91..b898358d421 100644 --- a/src/vs/workbench/contrib/markers/browser/media/markers.css +++ b/src/vs/workbench/contrib/markers/browser/media/markers.css @@ -20,6 +20,11 @@ flex: 1; } +.pane-header .monaco-action-bar .markers-panel-action-filter .monaco-inputbox { + height: 20px; + line-height: 18px; +} + .monaco-workbench.vs .monaco-action-bar .markers-panel-action-filter .monaco-inputbox { height: 25px; } @@ -44,13 +49,21 @@ display: none; } -.markers-panel-action-filter > .markers-panel-filter-controls > .monaco-action-bar .action-label.markers-filters { +.markers-panel-action-filter > .markers-panel-filter-controls > .monaco-action-bar .action-item .action-label.codicon.markers-filters { line-height: 20px; height: 20px; min-width: 22px; margin-left: 4px; } +.pane-header .markers-panel-action-filter > .markers-panel-filter-controls > .monaco-action-bar .action-item .action-label.codicon.markers-filters { + line-height: 18px; + height: 18px; + width: 28px; + margin-right: 0px; + justify-content: center; +} + .panel > .title .monaco-action-bar .action-item.markers-panel-action-filter-container { max-width: 600px; min-width: 300px; diff --git a/src/vs/workbench/contrib/notebook/browser/constants.ts b/src/vs/workbench/contrib/notebook/browser/constants.ts index bceac71a323..cdc24904254 100644 --- a/src/vs/workbench/contrib/notebook/browser/constants.ts +++ b/src/vs/workbench/contrib/notebook/browser/constants.ts @@ -8,17 +8,20 @@ export const SCROLLABLE_ELEMENT_PADDING_TOP = 20; // Cell sizing related -export const CELL_MARGIN = 20; -export const CELL_RUN_GUTTER = 32; +export const CELL_MARGIN = 8; +export const CELL_RUN_GUTTER = 28; +export const CODE_CELL_LEFT_MARGIN = 32; export const EDITOR_TOOLBAR_HEIGHT = 0; -export const BOTTOM_CELL_TOOLBAR_HEIGHT = 32; +export const BOTTOM_CELL_TOOLBAR_HEIGHT = 28; export const CELL_STATUSBAR_HEIGHT = 22; -// Top margin of editor -export const EDITOR_TOP_MARGIN = 0; +// Margin above editor +export const EDITOR_TOP_MARGIN = 6; +export const CELL_BOTTOM_MARGIN = 6; // Top and bottom padding inside the monaco editor in a cell, which are included in `cell.editorHeight` export const EDITOR_TOP_PADDING = 12; -export const EDITOR_BOTTOM_PADDING = 12; +export const EDITOR_BOTTOM_PADDING = 4; +export const CELL_OUTPUT_PADDING = 14; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts b/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts index 8cb046663fe..b91bd74b65a 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts @@ -22,6 +22,7 @@ import { BaseCellRenderTemplate, CellEditState, ICellViewModel, INotebookEditor, import { CellKind, NOTEBOOK_EDITOR_CURSOR_BOUNDARY, NotebookCellRunState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; // Notebook Commands const EXECUTE_NOTEBOOK_COMMAND_ID = 'notebook.execute'; @@ -123,8 +124,8 @@ abstract class NotebookAction extends Action2 { abstract async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise; - private isCellActionContext(context: any): context is INotebookCellActionContext { - return context && !!context.cell && !!context.notebookEditor; + private isCellActionContext(context?: INotebookCellActionContext): context is INotebookCellActionContext { + return !!context && !!context.cell && !!context.notebookEditor; } private getActiveCellContext(accessor: ServicesAccessor): INotebookCellActionContext | undefined { @@ -165,7 +166,7 @@ registerAction2(class extends NotebookAction { } async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { - return runCell(context); + return runCell(accessor, context); } }); @@ -241,7 +242,7 @@ registerAction2(class extends NotebookAction { const newFocusMode = context.cell.focusMode === CellFocusMode.Editor ? 'editor' : 'container'; - const executionP = runCell(context); + const executionP = runCell(accessor, context); // Try to select below, fall back on inserting const nextCell = context.notebookEditor.viewModel?.viewCells[idx + 1]; @@ -274,7 +275,7 @@ registerAction2(class extends NotebookAction { async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { const newFocusMode = context.cell.focusMode === CellFocusMode.Editor ? 'editor' : 'container'; - const executionP = runCell(context); + const executionP = runCell(accessor, context); const newCell = context.notebookEditor.insertNotebookCell(context.cell, CellKind.Code, 'below'); if (newCell) { context.notebookEditor.focusNotebookCell(newCell, newFocusMode); @@ -307,6 +308,16 @@ registerAction2(class extends NotebookAction { async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { renderAllMarkdownCells(context); + + const editorGroupService = accessor.get(IEditorGroupsService); + const group = editorGroupService.activeGroup; + + if (group) { + if (group.activeEditor) { + group.pinEditor(group.activeEditor); + } + } + return context.notebookEditor.executeNotebook(); } }); @@ -393,15 +404,24 @@ registerAction2(class extends NotebookAction { export function getActiveNotebookEditor(editorService: IEditorService): INotebookEditor | undefined { // TODO can `isNotebookEditor` be on INotebookEditor to avoid a circular dependency? - const activeEditorPane = editorService.activeEditorPane as any | undefined; - return activeEditorPane?.isNotebookEditor ? activeEditorPane.getControl() : undefined; + const activeEditorPane = editorService.activeEditorPane as unknown as { isNotebookEditor?: boolean } | undefined; + return activeEditorPane?.isNotebookEditor ? (editorService.activeEditorPane?.getControl() as INotebookEditor) : undefined; } -async function runCell(context: INotebookCellActionContext): Promise { +async function runCell(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { if (context.cell.metadata?.runState === NotebookCellRunState.Running) { return; } + const editorGroupService = accessor.get(IEditorGroupsService); + const group = editorGroupService.activeGroup; + + if (group) { + if (group.activeEditor) { + group.pinEditor(group.activeEditor); + } + } + return context.notebookEditor.executeNotebookCell(context.cell); } @@ -498,7 +518,8 @@ registerAction2(class extends InsertCellCommand { MenuRegistry.appendMenuItem(MenuId.NotebookCellBetween, { command: { id: INSERT_CODE_CELL_BELOW_COMMAND_ID, - title: localize('notebookActions.menu.insertCode', "$(add) Code") + title: localize('notebookActions.menu.insertCode', "$(add) Code"), + tooltip: localize('notebookActions.menu.insertCode.tooltip', "Add Code Cell") }, order: 0, group: 'inline' @@ -531,7 +552,8 @@ registerAction2(class extends InsertCellCommand { MenuRegistry.appendMenuItem(MenuId.NotebookCellBetween, { command: { id: INSERT_MARKDOWN_CELL_BELOW_COMMAND_ID, - title: localize('notebookActions.menu.insertMarkdown', "$(add) Markdown") + title: localize('notebookActions.menu.insertMarkdown', "$(add) Markdown"), + tooltip: localize('notebookActions.menu.insertMarkdown.tooltip', "Add Markdown Cell") }, order: 1, group: 'inline' @@ -654,7 +676,7 @@ async function moveCell(context: INotebookCellActionContext, direction: 'up' | ' if (result) { // move cell command only works when the cell container has focus - await context.notebookEditor.focusNotebookCell(context.cell, 'container'); + await context.notebookEditor.focusNotebookCell(result, 'container'); } } @@ -1005,13 +1027,7 @@ registerAction2(class extends NotebookAction { } async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { - const viewModel = context.notebookEditor.viewModel; - - if (!viewModel) { - return; - } - - viewModel.undo(); + await context.notebookEditor.viewModel?.undo(); } }); @@ -1029,7 +1045,7 @@ registerAction2(class extends NotebookAction { } async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { - context.notebookEditor.viewModel?.redo(); + await context.notebookEditor.viewModel?.redo(); } }); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts index af4c1d1a694..ee1f9b3fd30 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import 'vs/css!./media/notebookFind'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED, INotebookEditor, CellFindMatch, CellEditState, INotebookEditorContribution, NOTEBOOK_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; @@ -24,6 +25,10 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { getActiveNotebookEditor } from 'vs/workbench/contrib/notebook/browser/contrib/coreActions'; +const FIND_HIDE_TRANSITION = 'find-hide-transition'; +const FIND_SHOW_TRANSITION = 'find-show-transition'; + + export class NotebookFindWidget extends SimpleFindReplaceWidget implements INotebookEditorContribution { static id: string = 'workbench.notebook.find'; protected _findWidgetFocused: IContextKey; @@ -32,6 +37,8 @@ export class NotebookFindWidget extends SimpleFindReplaceWidget implements INote private _currentMatch: number = -1; private _allMatchesDecorations: ICellModelDecorations[] = []; private _currentMatchDecorations: ICellModelDecorations[] = []; + private _showTimeout: number | null = null; + private _hideTimeout: number | null = null; constructor( private readonly _notebookEditor: INotebookEditor, @@ -136,11 +143,6 @@ export class NotebookFindWidget extends SimpleFindReplaceWidget implements INote this._notebookEditor.revealRangeInCenterIfOutsideViewportAsync(this._findMatches[cellIndex].cell, this._findMatches[cellIndex].matches[matchIndex].range); } - hide() { - super.hide(); - this.set([]); - } - protected findFirst(): void { } protected onFocusTrackerFocus() { @@ -243,10 +245,56 @@ export class NotebookFindWidget extends SimpleFindReplaceWidget implements INote }); } + show(initialInput?: string): void { + super.show(initialInput); + + if (this._showTimeout === null) { + if (this._hideTimeout !== null) { + window.clearTimeout(this._hideTimeout); + this._hideTimeout = null; + this._notebookEditor.removeClassName(FIND_HIDE_TRANSITION); + } + + this._notebookEditor.addClassName(FIND_SHOW_TRANSITION); + this._showTimeout = window.setTimeout(() => { + this._notebookEditor.removeClassName(FIND_SHOW_TRANSITION); + this._showTimeout = null; + }, 200); + } else { + // no op + } + } + + hide() { + super.hide(); + this.set([]); + + if (this._hideTimeout === null) { + if (this._showTimeout !== null) { + window.clearTimeout(this._showTimeout); + this._showTimeout = null; + this._notebookEditor.removeClassName(FIND_SHOW_TRANSITION); + } + this._notebookEditor.addClassName(FIND_HIDE_TRANSITION); + this._hideTimeout = window.setTimeout(() => { + this._notebookEditor.removeClassName(FIND_HIDE_TRANSITION); + }, 200); + } else { + // no op + } + } + clear() { this._currentMatch = -1; this._findMatches = []; } + + dispose() { + this._notebookEditor?.removeClassName(FIND_SHOW_TRANSITION); + this._notebookEditor?.removeClassName(FIND_HIDE_TRANSITION); + super.dispose(); + } + } registerNotebookContribution(NotebookFindWidget.id, NotebookFindWidget); diff --git a/extensions/npm/src/features/markedTextUtil.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/media/notebookFind.css similarity index 58% rename from extensions/npm/src/features/markedTextUtil.ts rename to src/vs/workbench/contrib/notebook/browser/contrib/find/media/notebookFind.css index 856fad050e5..98fa75e3930 100644 --- a/extensions/npm/src/features/markedTextUtil.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/media/notebookFind.css @@ -3,8 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MarkedString } from 'vscode'; +.monaco-workbench .notebookOverlay.notebook-editor.find-hide-transition { + overflow-y: hidden; +} -export function textToMarkedString(text: string): MarkedString { - return text.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash -} \ No newline at end of file +.monaco-workbench .notebookOverlay.notebook-editor.find-show-transition { + overflow-y: hidden; +} diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/fold/folding.ts b/src/vs/workbench/contrib/notebook/browser/contrib/fold/folding.ts index c3c16540d26..9fcbcf7e1ae 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/fold/folding.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/fold/folding.ts @@ -56,7 +56,7 @@ export class FoldingController extends Disposable implements INotebookEditorCont })); } - saveViewState(): any { + saveViewState(): ICellRange[] { return this._foldingModel?.getMemento() || []; } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/status/editorStatus.ts b/src/vs/workbench/contrib/notebook/browser/contrib/status/editorStatus.ts index 4fed3476101..bfbb6caf623 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/status/editorStatus.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/status/editorStatus.ts @@ -37,11 +37,11 @@ registerAction2(class extends Action2 { const notebookService = accessor.get(INotebookService); const quickInputService = accessor.get(IQuickInputService); - const activeEditorPane = editorService.activeEditorPane as any | undefined; + const activeEditorPane = editorService.activeEditorPane as unknown as { isNotebookEditor?: boolean } | undefined; if (!activeEditorPane?.isNotebookEditor) { return; } - const editor = activeEditorPane.getControl() as INotebookEditor; + const editor = editorService.activeEditorPane?.getControl() as INotebookEditor; const activeKernel = editor.activeKernel; const availableKernels = notebookService.getContributedNotebookKernels(editor.viewModel!.viewType, editor.viewModel!.uri); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/toc/tocProvider.ts b/src/vs/workbench/contrib/notebook/browser/contrib/toc/tocProvider.ts index fda732869c5..5eb8a01929e 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/toc/tocProvider.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/toc/tocProvider.ts @@ -7,14 +7,28 @@ import { TableOfContentsProviderRegistry, ITableOfContentsProvider, ITableOfCont import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEditor'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { Codicon } from 'vs/base/common/codicons'; +import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; TableOfContentsProviderRegistry.register(NotebookEditor.ID, new class implements ITableOfContentsProvider { - async provideTableOfContents(editor: NotebookEditor) { + async provideTableOfContents(editor: NotebookEditor, context: { disposables: DisposableStore }) { if (!editor.viewModel) { return undefined; } // return an entry per markdown header const notebookWidget = editor.getControl(); + if (!notebookWidget) { + return undefined; + } + + // restore initial view state when no item was picked + let didPickOne = false; + const viewState = notebookWidget.getEditorViewState(); + context.disposables.add(toDisposable(() => { + if (!didPickOne) { + notebookWidget.restoreListViewState(viewState); + } + })); + const result: ITableOfContentsEntry[] = []; for (const cell of editor.viewModel.viewCells) { const content = cell.getText(); @@ -29,13 +43,14 @@ TableOfContentsProviderRegistry.register(NotebookEditor.ID, new class implements icon: cell.cellKind === CellKind.Markdown ? Codicon.markdown : Codicon.code, label: matches[j].replace(/^[ \t]*(\#+)/, ''), pick() { - notebookWidget?.revealInCenterIfOutsideViewport(cell); - notebookWidget?.selectElement(cell); - notebookWidget?.focusNotebookCell(cell, cell.cellKind === CellKind.Markdown ? 'container' : 'editor'); + didPickOne = true; + notebookWidget.revealInCenterIfOutsideViewport(cell); + notebookWidget.selectElement(cell); + notebookWidget.focusNotebookCell(cell, cell.cellKind === CellKind.Markdown ? 'container' : 'editor'); }, preview() { - notebookWidget?.revealInCenterIfOutsideViewport(cell); - notebookWidget?.selectElement(cell); + notebookWidget.revealInCenterIfOutsideViewport(cell); + notebookWidget.selectElement(cell); } }); } diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebook.css b/src/vs/workbench/contrib/notebook/browser/media/notebook.css index a3096315f7b..70b8701a46c 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebook.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebook.css @@ -17,6 +17,11 @@ white-space: initial; } +.monaco-workbench .cell.markdown p.emptyMarkdownPlaceholder { + font-style: italic; + opacity: 0.6; +} + .monaco-workbench .notebookOverlay .simple-fr-find-part-wrapper.visible { z-index: 100; } @@ -58,11 +63,11 @@ padding-top: 8px; } -.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .notebook-cell-focus-indicator { - top: 8px !important; +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-focus-indicator { + display: none; } -.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image.markdown-cell-row .notebook-cell-focus-indicator { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image.markdown-cell-row .cell-focus-indicator { bottom: 8px; } @@ -99,6 +104,11 @@ display: flex; } +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:not(.selected) .monaco-editor .lines-content .selected-text, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:not(.selected) .monaco-editor .lines-content .selectionHighlight { + opacity: 0.33; +} + .monaco-workbench .notebookOverlay .notebook-content-widgets { position: absolute; top: 0; @@ -107,8 +117,8 @@ } .monaco-workbench .notebookOverlay .output { - padding-left: 8px; - padding-right: 8px; + position: absolute; + height: 0px; user-select: text; transform: translate3d(0px, 0px, 0px); cursor: auto; @@ -122,6 +132,13 @@ } .monaco-workbench .notebookOverlay .output > div.foreground { + width: 100%; + min-height: 24px; + box-sizing: border-box; +} + +.monaco-workbench .notebookOverlay .output > div.foreground > .output-inner-container { + width: 100%; padding: 8px; box-sizing: border-box; } @@ -130,6 +147,7 @@ .monaco-workbench .notebookOverlay .output > div.foreground .output-plaintext { font-family: var(--monaco-monospace-font); white-space: pre-wrap; + word-wrap: break-word; } .monaco-workbench .notebookOverlay .cell-drag-image .output .multi-mimetype-output { @@ -139,7 +157,7 @@ .monaco-workbench .notebookOverlay .output .multi-mimetype-output { position: absolute; top: 4px; - left: -34px; + left: -26px; width: 16px; height: 16px; cursor: pointer; @@ -189,11 +207,52 @@ outline: none !important; } -.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.selected, .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused { outline: none !important; } +/* top and bottom borders on cells */ +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-top:before, +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-bottom:before, +.monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused:before, +.monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused:after { + content: ""; + position: absolute; + width: 100%; + height: 1px; +} + +/* top border */ +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-top:before, +.monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused:before { + border-top: 1px solid transparent; +} + +.monaco-workbench.hc-black .notebookOverlay .monaco-list .monaco-list-row.focused.cell-editor-focus .cell-focus-indicator-top:before, +.monaco-workbench.hc-black .notebookOverlay .monaco-list .markdown-cell-row.focused.cell-editor-focus:before { + border-top-style: dashed; +} + +/* bottom border */ +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-bottom:before, +.monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused:after { + border-bottom: 1px solid transparent; +} + +.monaco-workbench.hc-black .notebookOverlay .monaco-list .monaco-list-row.focused.cell-editor-focus .cell-focus-indicator-bottom:before, +.monaco-workbench.hc-black .notebookOverlay .monaco-list .markdown-cell-row.focused.cell-editor-focus:after { + border-bottom-style: dashed; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-top:before, +.monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused:before { + top: 0; +} +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-bottom:before, +.monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused:after { + bottom: 0px; +} + .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu.mouseover, .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu:hover { cursor: pointer; @@ -204,8 +263,8 @@ display: inline-block; position: absolute; height: 26px; - right: 32px; - top: -20px; + right: 44px; + top: -12px; /* this lines up the bottom toolbar border with the current line when on line 01 */ z-index: 30; } @@ -288,16 +347,16 @@ position: relative; height: 22px; flex-shrink: 0; + top: 9px; } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .monaco-toolbar { - margin-top: 4px; visibility: hidden; } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .monaco-toolbar .codicon { - margin: 0 0 0 2px; /* accounts for 2px indicator on left */ - padding: 4px; + margin: 0; + padding-right: 4px; } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .monaco-toolbar .actions-container { @@ -312,14 +371,14 @@ .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .execution-count-label { position: absolute; - top: 2px; + top: -2px; font-size: 10px; font-family: var(--monaco-monospace-font); visibility: visible; white-space: pre; width: 100%; text-align: center; - padding-right: 2px; + padding-right: 8px; box-sizing: border-box; opacity: .6; } @@ -358,36 +417,58 @@ outline: none !important; } +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-shadow-container { + height: 10px; + left: 0px; + right: 0px; + overflow: hidden; + position: absolute; +} -.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-shadow-container-top { + top: -10px; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-shadow-top { + margin-top: 10px; + width: 100%; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator { display: block; content: ' '; position: absolute; - width: 32px; box-sizing: border-box; - border-left-width: 2px; - border-left-style: solid; - top: 22px; - visibility: hidden; - opacity: 0.6; + top: 0px; + opacity: 0; } -.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator:hover { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-side { + /** Overidden for code cells */ + top: 0px; + bottom: 0px; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-top, +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-bottom { + width: 100%; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-right { + right: 0px; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator:hover { cursor: grab; } -.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator .codicon:hover { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator .codicon:hover { cursor: pointer; } -.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row:hover .notebook-cell-focus-indicator, -.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.cell-output-hover .notebook-cell-focus-indicator, -.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .notebook-cell-focus-indicator { - visibility: visible; -} - -.monaco-workbench .notebookOverlay .monaco-list:focus .monaco-list-row .notebook-cell-focus-indicator, -.monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row .notebook-cell-focus-indicator { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row:hover .cell-focus-indicator, +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.cell-output-hover .cell-focus-indicator, +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator { opacity: 1; } @@ -414,7 +495,6 @@ left: 0px; right: 0px; opacity: 0; - /* transition: opacity 0.2s ease-in-out; */ z-index: 10; } @@ -441,7 +521,7 @@ } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-toolbar { - margin: 0px 16px; + margin: 0px 8px; } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-toolbar .action-item { @@ -456,6 +536,7 @@ font-size: 12px; margin: 0px; display: inline-flex; + padding: 0px 4px; } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-toolbar .action-label .codicon { @@ -479,7 +560,7 @@ height: 1px; width: 16px; align-self: center; - margin: 0px 16px; + margin: 0px 8px; } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container span.codicon { @@ -542,7 +623,7 @@ /* Adjust margin of first item in markdown cell */ .monaco-workbench .notebookOverlay .cell.markdown div *:first-child { - margin-top: 4px; + margin-top: 0px; } /* h1 tags don't need top margin */ @@ -554,11 +635,12 @@ .monaco-workbench .notebookOverlay .cell.markdown div *:only-child, .monaco-workbench .notebookOverlay .cell.markdown div *:last-child { margin-bottom: 0; + padding-bottom: 0; } /* makes all markdown cells consistent */ .monaco-workbench .notebookOverlay .cell.markdown div { - min-height: 32px; + min-height: 24px; } .monaco-workbench .notebookOverlay .cell.markdown table { @@ -601,22 +683,10 @@ line-height: 1.357em; } -.monaco-workbench .notebookOverlay .cell.markdown body.wordWrap pre { +.monaco-workbench .notebookOverlay .cell.markdown .code { white-space: pre-wrap; } -.monaco-workbench .notebookOverlay .cell.markdown pre:not(.hljs), -.monaco-workbench .notebookOverlay .cell.markdown pre.hljs code > div { - padding: 16px; - border-radius: 3px; - overflow: auto; -} - -.monaco-workbench .notebookOverlay .cell.markdown pre code { - color: var(--vscode-editor-foreground); - tab-size: 4; -} - .monaco-workbench .notebookOverlay .cell.markdown .latex-block { display: block; } @@ -638,15 +708,15 @@ .monaco-workbench .notebookOverlay > .cell-list-container .notebook-folding-indicator { position: absolute; - top: 4px; - left: 0px; + top: 0; + left: 0; right: 0; + height: 100%; } .monaco-workbench .notebookOverlay > .cell-list-container .notebook-folding-indicator .codicon { visibility: visible; - padding: 4px; - width: calc(100% - 8px); + padding: 8px 0 0 10px; } /** Theming */ diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index 5cf6b78813c..b73d6b5c81a 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -6,9 +6,8 @@ import { coalesce, distinct } from 'vs/base/common/arrays'; import { Schemas } from 'vs/base/common/network'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { ResourceMap } from 'vs/base/common/map'; import { parse } from 'vs/base/common/marshalling'; -import { basename, isEqual } from 'vs/base/common/resources'; +import { isEqual } from 'vs/base/common/resources'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { ITextModel, ITextBufferFactory, DefaultEndOfLine, ITextBuffer } from 'vs/editor/common/model'; @@ -17,7 +16,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import * as nls from 'vs/nls'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; -import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { IEditorOptions, ITextEditorOptions, IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -33,15 +32,14 @@ import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookS import { NotebookService } from 'vs/workbench/contrib/notebook/browser/notebookServiceImpl'; import { CellKind, CellUri, NotebookDocumentBackupData, NotebookEditorPriority } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; -import { IEditorGroup, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, IOpenEditorOverride } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { CustomEditorsAssociations, customEditorsAssociationsSettingId } from 'vs/workbench/services/editor/common/editorAssociationsSetting'; +import { CustomEditorsAssociations, customEditorsAssociationsSettingId } from 'vs/workbench/services/editor/common/editorOpenWith'; import { CustomEditorInfo } from 'vs/workbench/contrib/customEditor/common/customEditor'; import { NotebookEditorOptions } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; import { INotebookEditorModelResolverService, NotebookModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; // Editor Contribution @@ -59,6 +57,7 @@ import 'vs/workbench/contrib/notebook/browser/contrib/status/editorStatus'; import 'vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform'; import 'vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform'; import 'vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform'; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; /*--------------------------------------------------------------------------------------------- */ @@ -83,7 +82,6 @@ class NotebookEditorFactory implements IEditorInputFactory { resource: input.resource, name: input.name, viewType: input.viewType, - group: input.group }); } deserialize(instantiationService: IInstantiationService, raw: string) { @@ -97,13 +95,7 @@ class NotebookEditorFactory implements IEditorInputFactory { return undefined; } - // if we have two editors open with the same resource (in different editor groups), we should then create two different - // editor inputs, instead of `getOrCreate`. const input = NotebookEditorInput.create(instantiationService, resource, name, viewType); - if (typeof data.group === 'number') { - input.updateGroup(data.group); - } - return input; } @@ -147,26 +139,21 @@ function getFirstNotebookInfo(notebookService: INotebookService, uri: URI): Note } export class NotebookContribution extends Disposable implements IWorkbenchContribution { - private _resourceMapping = new ResourceMap(); constructor( @IEditorService private readonly editorService: IEditorService, @INotebookService private readonly notebookService: INotebookService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IUndoRedoService undoRedoService: IUndoRedoService + @IUndoRedoService undoRedoService: IUndoRedoService, ) { super(); - this._register(undoRedoService.registerUriComparisonKeyComputer({ - getComparisonKey: (uri: URI): string | null => { - if (uri.scheme !== CellUri.scheme) { - return null; - } - + this._register(undoRedoService.registerUriComparisonKeyComputer(CellUri.scheme, { + getComparisonKey: (uri: URI): string => { const data = CellUri.parse(uri); if (!data) { - return null; + return uri.toString(); } return data.notebook.toString(); @@ -175,6 +162,7 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri this._register(this.editorService.overrideOpenEditor({ getEditorOverrides: (resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) => { + const currentEditorForResource = group?.editors.find(editor => isEqual(editor.resource, resource)); const associatedEditors = distinct([ @@ -191,12 +179,14 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri }; }); }, - open: (editor, options, group, context, id) => this.onEditorOpening(editor, options, group, context, id) + open: (editor, options, group) => { + return this.onEditorOpening2(editor, options, group); + } })); this._register(this.editorService.onDidVisibleEditorsChange(() => { const visibleNotebookEditors = editorService.visibleEditorPanes - .filter(pane => (pane as any).isNotebookEditor) + .filter(pane => (pane as unknown as { isNotebookEditor?: boolean }).isNotebookEditor) .map(pane => pane.getControl() as INotebookEditor) .filter(control => !!control) .map(editor => editor.getId()); @@ -205,30 +195,14 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri })); this._register(this.editorService.onDidActiveEditorChange(() => { - const activeEditorPane = editorService.activeEditorPane as any | undefined; - const notebookEditor = activeEditorPane?.isNotebookEditor ? activeEditorPane.getControl() : undefined; + const activeEditorPane = editorService.activeEditorPane as { isNotebookEditor?: boolean } | undefined; + const notebookEditor = activeEditorPane?.isNotebookEditor ? (editorService.activeEditorPane?.getControl() as INotebookEditor) : undefined; if (notebookEditor) { this.notebookService.updateActiveNotebookEditor(notebookEditor); } else { this.notebookService.updateActiveNotebookEditor(null); } })); - - this._register(this.editorService.onDidCloseEditor(({ editor }) => { - if (!(editor instanceof NotebookEditorInput)) { - return; - } - - if (!this.editorService.editors.some(other => ( - other.resource === editor.resource - && other instanceof NotebookEditorInput - && other.viewType === editor.viewType - ))) { - editor.clearTextModel(); - } - - editor.dispose(); - })); } getUserAssociatedEditors(resource: URI) { @@ -250,49 +224,43 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri return this.notebookService.getContributedNotebookProviders(resource); } - private onEditorOpening(originalInput: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext, id: string | undefined): IOpenEditorOverride | undefined { - if (originalInput instanceof NotebookEditorInput) { - if ((originalInput.group === group.id || originalInput.group === undefined) && (originalInput.viewType === id || typeof id !== 'string')) { - // No need to do anything - originalInput.updateGroup(group.id); - return { - override: this.editorService.openEditor(originalInput, new NotebookEditorOptions(options || {}).with({ override: false }), group) - }; - } else { - // Create a copy of the input. - // Unlike normal editor inputs, we do not want to share custom editor inputs - // between multiple editors / groups. - const copiedInput = NotebookEditorInput.create(this.instantiationService, originalInput.resource, originalInput.name, originalInput.viewType); - copiedInput.updateGroup(group.id); + private onEditorOpening2(originalInput: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup): IOpenEditorOverride | undefined { - if (context === OpenEditorContext.MOVE_EDITOR) { - // transfer ownership of editor widget - const widgetRef = NotebookRegistry.getNotebookEditorWidget(originalInput); - if (widgetRef) { - NotebookRegistry.releaseNotebookEditorWidget(originalInput); - NotebookRegistry.claimNotebookEditorWidget(copiedInput, widgetRef); - } - } - - return { - override: this.editorService.openEditor(copiedInput, new NotebookEditorOptions(options || {}).with({ override: false }), group) - }; - } - } - - let resource = originalInput.resource; - if (!resource) { + let id = typeof options?.override === 'string' ? options.override : undefined; + if (id === undefined && originalInput.isUntitled()) { return undefined; } + if (!originalInput.resource) { + return undefined; + } + + if (originalInput instanceof NotebookEditorInput) { + return undefined; + } + + let notebookUri: URI = originalInput.resource; + let cellOptions: IResourceEditorInput | undefined; + + const data = CellUri.parse(originalInput.resource); + if (data) { + notebookUri = data.notebook; + cellOptions = { resource: originalInput.resource, options }; + } + + if (id === undefined && originalInput instanceof ResourceEditorInput) { + const exitingNotebookEditor = group.editors.find(editor => editor instanceof NotebookEditorInput && isEqual(editor.resource, notebookUri)); + id = exitingNotebookEditor?.viewType; + } + if (id === undefined) { - const existingEditors = group.editors.filter(editor => editor.resource && isEqual(editor.resource, resource) && !(editor instanceof NotebookEditorInput)); + const existingEditors = group.editors.filter(editor => editor.resource && isEqual(editor.resource, notebookUri) && !(editor instanceof NotebookEditorInput)); if (existingEditors.length) { return undefined; } - const userAssociatedEditors = this.getUserAssociatedEditors(resource); + const userAssociatedEditors = this.getUserAssociatedEditors(notebookUri); const notebookEditor = userAssociatedEditors.filter(association => this.notebookService.getContributedNotebookProvider(association.viewType)); if (userAssociatedEditors.length && !notebookEditor.length) { @@ -303,65 +271,40 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri // user might pick a notebook editor const associatedEditors = distinct([ - ...this.getUserAssociatedNotebookEditors(resource), - ...this.getContributedEditors(resource) - ], editor => editor.id).filter(editor => editor.priority === NotebookEditorPriority.default); + ...this.getUserAssociatedNotebookEditors(notebookUri), + ...(this.getContributedEditors(notebookUri).filter(editor => editor.priority === NotebookEditorPriority.default)) + ], editor => editor.id); if (!associatedEditors.length) { // there is no notebook editor contribution which is enabled by default - return; - } - - } else { - const existingEditors = group.editors.filter(editor => editor.resource && isEqual(editor.resource, resource) && (editor instanceof NotebookEditorInput) && editor.viewType === id); - - if (existingEditors.length) { - // switch to this cell - return { override: this.editorService.openEditor(existingEditors[0], new NotebookEditorOptions(options || {}).with({ override: false }), group) }; + return undefined; } } - let info: NotebookProviderInfo | undefined; - const data = CellUri.parse(resource); - if (data) { - const infos = this.getContributedEditors(data.notebook); + const infos = this.notebookService.getContributedNotebookProviders(notebookUri); + let info = infos.find(info => !id || info.id === id); - if (infos.length) { - const info = id === undefined ? infos[0] : (infos.find(info => info.id === id) || infos[0]); - // cell-uri -> open (container) notebook - const name = basename(data.notebook); - let input = this._resourceMapping.get(data.notebook); - if (!input || input.isDisposed()) { - input = NotebookEditorInput.create(this.instantiationService, data.notebook, name, info.id); - this._resourceMapping.set(data.notebook, input); - } - - input.updateGroup(group.id); - return { override: this.editorService.openEditor(input, new NotebookEditorOptions({ ...options, forceReload: true, cellOptions: { resource, options } }), group) }; - } + if (!info && id !== undefined) { + info = this.notebookService.getContributedNotebookProvider(id); } - const infos = this.notebookService.getContributedNotebookProviders(resource); - info = id === undefined ? infos[0] : infos.find(info => info.id === id); - if (!info) { return undefined; } - const input = NotebookEditorInput.create(this.instantiationService, resource, originalInput.getName(), info.id); - input.updateGroup(group.id); - this._resourceMapping.set(resource, input); /** * Scenario: we are reopening a file editor input which is pinned, we should open in a new editor tab. */ let index = undefined; - if (group.activeEditor === originalInput && isEqual(originalInput.resource, resource)) { + if (group.activeEditor === originalInput && isEqual(originalInput.resource, notebookUri)) { const originalEditorIndex = group.getIndexOfEditor(originalInput); index = group.isPinned(originalInput) ? originalEditorIndex + 1 : originalEditorIndex; } - return { override: this.editorService.openEditor(input, new NotebookEditorOptions(options || {}).with({ override: false, index }), group) }; + const notebookInput = NotebookEditorInput.create(this.instantiationService, notebookUri, originalInput.getName(), info.id); + const notebookOptions = new NotebookEditorOptions({ ...options, cellOptions, override: false, index }); + return { override: this.editorService.openEditor(notebookInput, notebookOptions, group) }; } } @@ -374,6 +317,7 @@ class CellContentProvider implements ITextModelContentProvider { @IModelService private readonly _modelService: IModelService, @IModeService private readonly _modeService: IModeService, @INotebookService private readonly _notebookService: INotebookService, + @INotebookEditorModelResolverService private readonly _notebookModelResolverService: INotebookEditorModelResolverService, ) { this._registration = textModelService.registerTextModelContentProvider(CellUri.scheme, this); } @@ -397,12 +341,10 @@ class CellContentProvider implements ITextModelContentProvider { return null; } - const editorModel = await this._notebookService.modelManager.resolve(data.notebook, info.id); - if (!editorModel) { - return null; - } + const ref = await this._notebookModelResolverService.resolve(data.notebook, info.id); + let result: ITextModel | null = null; - for (let cell of editorModel.notebook.cells) { + for (let cell of ref.object.notebook.cells) { if (cell.uri.toString() === resource.toString()) { const bufferFactory: ITextBufferFactory = { create: (defaultEOL) => { @@ -415,15 +357,23 @@ class CellContentProvider implements ITextModelContentProvider { } }; const language = cell.cellKind === CellKind.Markdown ? this._modeService.create('markdown') : (cell.language ? this._modeService.create(cell.language) : this._modeService.createByFilepathOrFirstLine(resource, cell.textBuffer.getLineContent(1))); - return this._modelService.createModel( + result = this._modelService.createModel( bufferFactory, language, resource ); + break; } } - return null; + if (result) { + const once = result.onWillDispose(() => { + once.dispose(); + ref.dispose(); + }); + } + + return result; } } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index d4431cdfdc8..5e58abf2796 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -110,6 +110,7 @@ export interface ICellViewModel { currentTokenSource: CancellationTokenSource | undefined; focusMode: CellFocusMode; getText(): string; + getTextLength(): number; metadata: NotebookCellMetadata | undefined; textModel: ITextModel | undefined; hasModel(): this is IEditableCellViewModel; @@ -135,11 +136,11 @@ export interface INotebookEditorContribution { /** * Store view state. */ - saveViewState?(): any; + saveViewState?(): unknown; /** * Restore view state. */ - restoreViewState?(state: any): void; + restoreViewState?(state: unknown): void; } export interface INotebookEditor extends IEditor { @@ -209,17 +210,17 @@ export interface INotebookEditor extends IEditor { /** * Move a cell up one spot */ - moveCellUp(cell: ICellViewModel): Promise; + moveCellUp(cell: ICellViewModel): Promise; /** * Move a cell down one spot */ - moveCellDown(cell: ICellViewModel): Promise; + moveCellDown(cell: ICellViewModel): Promise; /** * Move a cell above or below another cell */ - moveCell(cell: ICellViewModel, relativeToCell: ICellViewModel, direction: 'above' | 'below'): Promise; + moveCell(cell: ICellViewModel, relativeToCell: ICellViewModel, direction: 'above' | 'below'): Promise; /** * Focus the container of a cell (the monaco editor inside is not focused). @@ -259,7 +260,7 @@ export interface INotebookEditor extends IEditor { /** * Render the output in webview layer */ - createInset(cell: ICellViewModel, output: IProcessedOutput, shadowContent: string, offset: number): void; + createInset(cell: ICellViewModel, output: IProcessedOutput, shadowContent: string, offset: number): Promise; /** * Remove the output from the webview layer @@ -269,7 +270,22 @@ export interface INotebookEditor extends IEditor { /** * Send message to the webview for outputs. */ - postMessage(message: any): void; + postMessage(forRendererId: string | undefined, message: any): void; + + /** + * Toggle class name on the notebook editor root DOM node. + */ + toggleClassName(className: string): void; + + /** + * Remove class name on the notebook editor root DOM node. + */ + addClassName(className: string): void; + + /** + * Remove class name on the notebook editor root DOM node. + */ + removeClassName(className: string): void; /** * Trigger the editor to scroll from scroll event programmatically @@ -332,7 +348,7 @@ export interface INotebookEditor extends IEditor { * Change the decorations on cells. * The notebook is virtualized and this method should be called to create/delete editor decorations safely. */ - changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any; + changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => T): T | null; /** * An event emitted on a "mouseup". @@ -355,6 +371,7 @@ export interface INotebookEditor extends IEditor { } export interface INotebookCellList { + isDisposed: boolean readonly contextKeyService: IContextKeyService; elementAt(position: number): ICellViewModel | undefined; elementHeight(element: ICellViewModel): number; @@ -418,7 +435,7 @@ export interface BaseCellRenderTemplate { currentRenderedCell?: ICellViewModel; statusBarContainer: HTMLElement; languageStatusBarItem: CellLanguageStatusBarItem; - toJSON: () => any; + toJSON: () => object; } export interface MarkdownCellRenderTemplate extends BaseCellRenderTemplate { @@ -435,9 +452,16 @@ export interface CodeCellRenderTemplate extends BaseCellRenderTemplate { runButtonContainer: HTMLElement; executionOrderLabel: HTMLElement; outputContainer: HTMLElement; + focusSinkElement: HTMLElement; editor: ICodeEditor; progressBar: ProgressBar; timer: TimerRenderer; + focusIndicatorRight: HTMLElement; + focusIndicatorBottom: HTMLElement; +} + +export function isCodeCellRenderTemplate(templateData: BaseCellRenderTemplate): templateData is CodeCellRenderTemplate { + return !!(templateData as CodeCellRenderTemplate).runToolbar; } export interface IOutputTransformContribution { @@ -554,7 +578,7 @@ export function getVisibleCells(cells: CellViewModel[], hiddenRanges: ICellRange let start = 0; let hiddenRangeIndex = 0; - let result: any[] = []; + let result: CellViewModel[] = []; while (start < cells.length && hiddenRangeIndex < hiddenRanges.length) { if (start < hiddenRanges[hiddenRangeIndex].start) { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts index a7d4e76a033..d17b20c7efc 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts @@ -6,63 +6,67 @@ import * as DOM from 'vs/base/browser/dom'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; -import { MutableDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { EditorOptions, IEditorCloseEvent, IEditorMemento } from 'vs/workbench/common/editor'; +import { EditorOptions, IEditorMemento, IEditorInput } from 'vs/workbench/common/editor'; import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput'; import { INotebookEditorViewState, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; -import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; -import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; +import { NotebookEditorWidget, NotebookEditorOptions } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; +import { IEditorDropService } from 'vs/workbench/services/editor/browser/editorDropService'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { INotebookEditorWidgetService, IBorrowValue } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidgetService'; +import { localize } from 'vs/nls'; const NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'NotebookEditorViewState'; export class NotebookEditor extends BaseEditor { static readonly ID: string = 'workbench.editor.notebook'; - private editorMemento: IEditorMemento; - private readonly groupListener = this._register(new MutableDisposable()); - private _widget?: NotebookEditorWidget; + + private readonly _editorMemento: IEditorMemento; + private readonly _groupListener = this._register(new DisposableStore()); + private readonly _widgetDisposableStore: DisposableStore = new DisposableStore(); + private _widget: IBorrowValue = { value: undefined }; private _rootElement!: HTMLElement; - private dimension: DOM.Dimension | null = null; - private _widgetDisposableStore: DisposableStore = new DisposableStore(); + private _dimension?: DOM.Dimension; + + // todo@rebornix is there a reason that `super.fireOnDidFocus` isn't used? private readonly _onDidFocusWidget = this._register(new Emitter()); - public get onDidFocus(): Event { return this._onDidFocusWidget.event; } + get onDidFocus(): Event { return this._onDidFocusWidget.event; } + + private readonly _onDidChangeModel = this._register(new Emitter()); + readonly onDidChangeModel: Event = this._onDidChangeModel.event; constructor( @ITelemetryService telemetryService: ITelemetryService, @IThemeService themeService: IThemeService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IStorageService storageService: IStorageService, - @IEditorService private readonly editorService: IEditorService, - @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, - @INotificationService private readonly notificationService: INotificationService) { + @IEditorService private readonly _editorService: IEditorService, + @IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService, + @IEditorDropService private readonly _editorDropService: IEditorDropService, + @INotificationService private readonly _notificationService: INotificationService, + @INotebookEditorWidgetService private readonly _notebookWidgetService: INotebookEditorWidgetService, + ) { super(NotebookEditor.ID, telemetryService, themeService, storageService); - - // this._widget = this.instantiationService.createInstance(NotebookEditorWidget); - this.editorMemento = this.getEditorMemento(editorGroupService, NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY); + this._editorMemento = this.getEditorMemento(_editorGroupService, NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY); } - private readonly _onDidChangeModel = new Emitter(); - readonly onDidChangeModel: Event = this._onDidChangeModel.event; - - set viewModel(newModel: NotebookViewModel | undefined) { - if (this._widget) { - this._widget.viewModel = newModel; + if (this._widget.value) { + this._widget.value.viewModel = newModel; this._onDidChangeModel.fire(); } } get viewModel() { - return this._widget?.viewModel; + return this._widget.value?.viewModel; } get minimumWidth(): number { return 375; } @@ -72,11 +76,9 @@ export class NotebookEditor extends BaseEditor { set minimumWidth(value: number) { /*noop*/ } set maximumWidth(value: number) { /*noop*/ } - //#region Editor Core - - public get isNotebookEditor() { + get isNotebookEditor() { return true; } @@ -84,166 +86,151 @@ export class NotebookEditor extends BaseEditor { this._rootElement = DOM.append(parent, DOM.$('.notebook-editor')); // this._widget.createEditor(); - this._register(this.onDidFocus(() => this._widget?.updateEditorFocus())); - this._register(this.onDidBlur(() => this._widget?.updateEditorFocus())); + this._register(this.onDidFocus(() => this._widget.value?.updateEditorFocus())); + this._register(this.onDidBlur(() => this._widget.value?.updateEditorFocus())); } getDomNode() { return this._rootElement; } - getControl() { - return this._widget; - } - - onWillHide() { - if (this.input && this.input instanceof NotebookEditorInput && !this.input.isDisposed()) { - this.saveEditorViewState(this.input); - } - - if (this.input && NotebookRegistry.getNotebookEditorWidget(this.input as NotebookEditorInput) === this._widget) { - // the widget is not transfered to other editor inputs - this._widget?.onWillHide(); - } - - super.onWillHide(); + getControl(): NotebookEditorWidget | undefined { + return this._widget.value; } setEditorVisible(visible: boolean, group: IEditorGroup | undefined): void { super.setEditorVisible(visible, group); - this.groupListener.value = group?.onWillCloseEditor(e => this.onWillCloseEditorInGroup(e)); - } - - private onWillCloseEditorInGroup(e: IEditorCloseEvent): void { - const editor = e.editor; - if (!(editor instanceof NotebookEditorInput)) { - return; // only handle files + if (group) { + this._groupListener.add(group.onWillCloseEditor(e => this._saveEditorViewState(e.editor))); + this._groupListener.add(group.onDidGroupChange(() => { + if (this._editorGroupService.activeGroup !== group) { + this._widget?.value?.updateEditorFocus(); + } + })); } - if (editor === this.input) { - this.saveEditorViewState(editor); + if (!visible) { + this._saveEditorViewState(this.input); + if (this.input && this._widget.value) { + // the widget is not transfered to other editor inputs + this._widget.value.onWillHide(); + } } } focus() { super.focus(); - this._widget?.focus(); + this._widget.value?.focus(); } async setInput(input: NotebookEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise { - if (this.input instanceof NotebookEditorInput) { - if (!this.input.isDisposed()) { - // set a new input, let's hide previous input - this.saveEditorViewState(this.input as NotebookEditorInput); - this._widget?.onWillHide(); - } - } + const group = this.group!; + + this._saveEditorViewState(this.input); await super.setInput(input, options, token); - // input attached - Event.once(input.onDispose)(() => { - // make sure the editor widget is removed from the view - const existingEditorWidgetForInput = NotebookRegistry.getNotebookEditorWidget(input as NotebookEditorInput); - if (existingEditorWidgetForInput) { - // the editor widget is only referenced by the editor input - // clear its state - existingEditorWidgetForInput?.onWillHide(); - existingEditorWidgetForInput?.getDomNode().remove(); - existingEditorWidgetForInput?.dispose(); - NotebookRegistry.releaseNotebookEditorWidget(input as NotebookEditorInput); - } - }); + // Check for cancellation + if (token.isCancellationRequested) { + return undefined; + } this._widgetDisposableStore.clear(); - const existingEditorWidgetForInput = NotebookRegistry.getNotebookEditorWidget(input); - if (existingEditorWidgetForInput) { - // hide previous widget - if (NotebookRegistry.getNotebookEditorWidget(this.input! as NotebookEditorInput) === this._widget) { - // the widet is not transfered to other editor inputs - this._widget?.onWillHide(); - } - - // previous widget is then detached - // set the new one - this._widget = existingEditorWidgetForInput; - NotebookRegistry.claimNotebookEditorWidget(input, this._widget); - } else { - // hide current widget - this._widget?.onWillHide(); - // create a new widget - this._widget = this.instantiationService.createInstance(NotebookEditorWidget); - this._widget.createEditor(); - NotebookRegistry.claimNotebookEditorWidget(input, this._widget); + // there currently is a widget which we still own so + // we need to hide it before getting a new widget + if (this._widget.value) { + this._widget.value.onWillHide(); } - if (this.dimension) { - this._widget.layout(this.dimension, this._rootElement); + this._widget = this.instantiationService.invokeFunction(this._notebookWidgetService.retrieveWidget, group, input); + + if (this._dimension) { + this._widget.value!.layout(this._dimension, this._rootElement); } - const model = await input.resolve(this._widget!.getId()); + const model = await input.resolve(this._widget.value!.getId()); + // Check for cancellation + if (token.isCancellationRequested) { + return undefined; + } if (model === null) { - this.notificationService.prompt( + this._notificationService.prompt( Severity.Error, - `Cannot open resource with notebook editor type '${input.viewType}', please check if you have the right extension installed or enabled.`, + localize('fail.noEditor', "Cannot open resource with notebook editor type '{0}', please check if you have the right extension installed or enabled.", input.viewType), [{ - label: 'Reopen file with VS Code standard text editor', + label: localize('fail.reOpen', "Reopen file with VS Code standard text editor"), run: async () => { - const fileEditorInput = this.editorService.createEditorInput({ resource: input.resource, forceFile: true }); + const fileEditorInput = this._editorService.createEditorInput({ resource: input.resource, forceFile: true }); const textOptions: IEditorOptions | ITextEditorOptions = options ? { ...options, override: false } : { override: false }; - await this.editorService.openEditor(fileEditorInput, textOptions); + await this._editorService.openEditor(fileEditorInput, textOptions); } }] ); return; } - const viewState = this.loadTextEditorViewState(input); + const viewState = this._loadTextEditorViewState(input); - await this._widget.setModel(model.notebook, viewState, options); - this._widgetDisposableStore.add(this._widget.onDidFocus(() => this._onDidFocusWidget.fire())); + await this._widget.value!.setModel(model.notebook, viewState); + await this._widget.value!.setOptions(options instanceof NotebookEditorOptions ? options : undefined); + this._widgetDisposableStore.add(this._widget.value!.onDidFocus(() => this._onDidFocusWidget.fire())); - if (this.editorGroupService instanceof EditorPart) { - this._widgetDisposableStore.add(this.editorGroupService.createEditorDropTarget(this._widget.getDomNode(), { - groupContainsPredicate: (group) => this.group?.id === group.group.id - })); - } + this._widgetDisposableStore.add(this._editorDropService.createEditorDropTarget(this._widget.value!.getDomNode(), { + containsGroup: (group) => this.group?.id === group.group.id + })); } clearInput(): void { - const existingEditorWidgetForInput = NotebookRegistry.getNotebookEditorWidget(this.input as NotebookEditorInput); - existingEditorWidgetForInput?.onWillHide(); - this._widget = undefined; + if (this._widget.value) { + this._saveEditorViewState(this.input); + this._widget.value.onWillHide(); + } super.clearInput(); } - private saveEditorViewState(input: NotebookEditorInput): void { - if (this.group && this._widget) { - const state = this._widget.getEditorViewState(); - this.editorMemento.saveEditorState(this.group, input.resource, state); + setOptions(options: EditorOptions | undefined): void { + if (options instanceof NotebookEditorOptions) { + this._widget.value?.setOptions(options); + } + super.setOptions(options); + } + + protected saveState(): void { + this._saveEditorViewState(this.input); + super.saveState(); + } + + private _saveEditorViewState(input: IEditorInput | undefined): void { + if (this.group && this._widget.value && input instanceof NotebookEditorInput) { + if (this._widget.value.isDisposed) { + return; + } + + const state = this._widget.value.getEditorViewState(); + this._editorMemento.saveEditorState(this.group, input.resource, state); } } - private loadTextEditorViewState(input: NotebookEditorInput): INotebookEditorViewState | undefined { + private _loadTextEditorViewState(input: NotebookEditorInput): INotebookEditorViewState | undefined { if (this.group) { - return this.editorMemento.loadEditorState(this.group, input.resource); + return this._editorMemento.loadEditorState(this.group, input.resource); } return; } layout(dimension: DOM.Dimension): void { - DOM.toggleClass(this._rootElement, 'mid-width', dimension.width < 1000 && dimension.width >= 600); - DOM.toggleClass(this._rootElement, 'narrow-width', dimension.width < 600); - this.dimension = dimension; + this._rootElement.classList.toggle('mid-width', dimension.width < 1000 && dimension.width >= 600); + this._rootElement.classList.toggle('narrow-width', dimension.width < 600); + this._dimension = dimension; - if (this._input === undefined || this._widget === undefined) { + if (!this._widget.value || !(this._input instanceof NotebookEditorInput)) { return; } - if (this._input.resource?.toString() !== this._widget?.viewModel?.uri.toString() && this._widget?.viewModel) { + if (this._input.resource.toString() !== this._widget.value.viewModel?.uri.toString() && this._widget.value?.viewModel) { // input and widget mismatch // this happens when // 1. open document A, pin the document @@ -253,15 +240,7 @@ export class NotebookEditor extends BaseEditor { return; } - this._widget?.layout(this.dimension, this._rootElement); - } - - protected saveState(): void { - if (this.input instanceof NotebookEditorInput) { - this.saveEditorViewState(this.input); - } - - super.saveState(); + this._widget.value.layout(this._dimension, this._rootElement); } //#endregion @@ -274,10 +253,9 @@ export class NotebookEditor extends BaseEditor { super.dispose(); } - toJSON(): any { + toJSON(): object { return { notebookHandle: this.viewModel?.handle }; } } - diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts index 6f21a29d376..8dfb595f64c 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts @@ -9,10 +9,10 @@ import { URI } from 'vs/base/common/uri'; import { isEqual, basename } from 'vs/base/common/resources'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IFilesConfigurationService, AutoSaveMode } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; -import { NotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; - -let NOTEBOOK_EDITOR_INPUT_HANDLE = 0; +import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; +import { IReference } from 'vs/base/common/lifecycle'; +import { INotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon'; interface NotebookEditorInputOptions { startDirty?: boolean; @@ -24,31 +24,20 @@ export class NotebookEditorInput extends EditorInput { } static readonly ID: string = 'workbench.input.notebook'; - private textModel: NotebookEditorModel | null = null; - - private _group: GroupIdentifier | undefined; - - public get group(): GroupIdentifier | undefined { - return this._group; - } - - public updateGroup(group: GroupIdentifier): void { - this._group = group; - } + private _textModel: IReference | null = null; private _defaultDirtyState: boolean = false; - readonly id: number = NOTEBOOK_EDITOR_INPUT_HANDLE++; constructor( - public resource: URI, - public name: string, + public readonly resource: URI, + public readonly name: string, public readonly viewType: string | undefined, public readonly options: NotebookEditorInputOptions, - @INotebookService private readonly notebookService: INotebookService, - @IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService, - @IFileDialogService private readonly fileDialogService: IFileDialogService, - // @IEditorService private readonly editorService: IEditorService, - @IInstantiationService private readonly instantiationService: IInstantiationService + @INotebookService private readonly _notebookService: INotebookService, + @INotebookEditorModelResolverService private readonly _notebookModelResolverService: INotebookEditorModelResolverService, + @IFilesConfigurationService private readonly _filesConfigurationService: IFilesConfigurationService, + @IFileDialogService private readonly _fileDialogService: IFileDialogService, + @IInstantiationService private readonly _instantiationService: IInstantiationService ) { super(); this._defaultDirtyState = !!options.startDirty; @@ -63,18 +52,21 @@ export class NotebookEditorInput extends EditorInput { } isDirty() { - if (!this.textModel) { + if (!this._textModel) { return !!this._defaultDirtyState; } + return this._textModel.object.isDirty(); + } - return this.textModel?.isDirty() || false; + isUntitled(): boolean { + return this._textModel?.object.isUntitled() || false; } isReadonly() { return false; } - public isSaving(): boolean { + isSaving(): boolean { if (this.isUntitled()) { return false; // untitled is never saving automatically } @@ -83,7 +75,7 @@ export class NotebookEditorInput extends EditorInput { return false; // the editor needs to be dirty for being saved } - if (this.filesConfigurationService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY) { + if (this._filesConfigurationService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY) { return true; // a short auto save is configured, treat this as being saved } @@ -91,8 +83,14 @@ export class NotebookEditorInput extends EditorInput { } async save(group: GroupIdentifier, options?: ISaveOptions): Promise { - if (this.textModel) { - await this.textModel.save(); + if (this._textModel) { + + if (this.isUntitled()) { + return this.saveAs(group, options); + } else { + await this._textModel.object.save(); + } + return this; } @@ -100,17 +98,17 @@ export class NotebookEditorInput extends EditorInput { } async saveAs(group: GroupIdentifier, options?: ISaveOptions): Promise { - if (!this.textModel) { + if (!this._textModel) { return undefined; } - const dialogPath = this.textModel.resource; - const target = await this.fileDialogService.pickFileToSave(dialogPath, options?.availableFileSystems); + const dialogPath = this._textModel.object.resource; + const target = await this._fileDialogService.pickFileToSave(dialogPath, options?.availableFileSystems); if (!target) { return undefined; // save cancelled } - if (!await this.textModel.saveAs(target)) { + if (!await this._textModel.object.saveAs(target)) { return undefined; } @@ -118,46 +116,48 @@ export class NotebookEditorInput extends EditorInput { } // called when users rename a notebook document - move(group: GroupIdentifier, target: URI): IMoveResult | undefined { - if (this.textModel) { - const contributedNotebookProviders = this.notebookService.getContributedNotebookProviders(target); + rename(group: GroupIdentifier, target: URI): IMoveResult | undefined { + if (this._textModel) { + const contributedNotebookProviders = this._notebookService.getContributedNotebookProviders(target); - if (contributedNotebookProviders.find(provider => provider.id === this.textModel!.viewType)) { + if (contributedNotebookProviders.find(provider => provider.id === this._textModel!.object.viewType)) { return this._move(group, target); } } return undefined; } - _move(group: GroupIdentifier, newResource: URI): { editor: IEditorInput } | undefined { - const editorInput = NotebookEditorInput.create(this.instantiationService, newResource, basename(newResource), this.viewType); + private _move(group: GroupIdentifier, newResource: URI): { editor: IEditorInput } | undefined { + const editorInput = NotebookEditorInput.create(this._instantiationService, newResource, basename(newResource), this.viewType); return { editor: editorInput }; } async revert(group: GroupIdentifier, options?: IRevertOptions): Promise { - if (this.textModel) { - await this.textModel.revert(options); + if (this._textModel && this._textModel.object.isDirty()) { + await this._textModel.object.revert(options); } return; } - async resolve(editorId?: string): Promise { - if (!await this.notebookService.canResolve(this.viewType!)) { + async resolve(editorId?: string): Promise { + if (!await this._notebookService.canResolve(this.viewType!)) { return null; } - this.textModel = await this.notebookService.modelManager.resolve(this.resource, this.viewType!, editorId); + if (!this._textModel) { + this._textModel = await this._notebookModelResolverService.resolve(this.resource, this.viewType!, editorId); - this._register(this.textModel.onDidChangeDirty(() => { - this._onDidChangeDirty.fire(); - })); + this._register(this._textModel.object.onDidChangeDirty(() => { + this._onDidChangeDirty.fire(); + })); - if (this.textModel.isDirty()) { - this._onDidChangeDirty.fire(); + if (this._textModel.object.isDirty()) { + this._onDidChangeDirty.fire(); + } } - return this.textModel; + return this._textModel.object; } matches(otherInput: unknown): boolean { @@ -171,14 +171,11 @@ export class NotebookEditorInput extends EditorInput { return false; } - clearTextModel() { - if (this.textModel) { - this.notebookService.destoryNotebookDocument(this.textModel!.notebook.viewType, this.textModel!.notebook); - this.textModel.dispose(); - } - } - dispose() { + if (this._textModel) { + this._textModel.dispose(); + this._textModel = null; + } super.dispose(); } } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index c632158daeb..17439278bbc 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -23,11 +23,11 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { contrastBorder, editorBackground, focusBorder, foreground, registerColor, textBlockQuoteBackground, textBlockQuoteBorder, textLinkActiveForeground, textLinkForeground, textPreformatForeground, errorForeground, transparent } from 'vs/platform/theme/common/colorRegistry'; +import { contrastBorder, editorBackground, focusBorder, foreground, registerColor, textBlockQuoteBackground, textBlockQuoteBorder, textLinkActiveForeground, textLinkForeground, textPreformatForeground, errorForeground, transparent, widgetShadow, listFocusBackground, listInactiveSelectionBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { EditorMemento } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions, IEditorMemento } from 'vs/workbench/common/editor'; -import { CELL_MARGIN, CELL_RUN_GUTTER, EDITOR_BOTTOM_PADDING, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING, SCROLLABLE_ELEMENT_PADDING_TOP, BOTTOM_CELL_TOOLBAR_HEIGHT } from 'vs/workbench/contrib/notebook/browser/constants'; +import { CELL_MARGIN, CELL_RUN_GUTTER, EDITOR_BOTTOM_PADDING, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING, SCROLLABLE_ELEMENT_PADDING_TOP, BOTTOM_CELL_TOOLBAR_HEIGHT, CELL_BOTTOM_MARGIN, CODE_CELL_LEFT_MARGIN } from 'vs/workbench/contrib/notebook/browser/constants'; import { CellEditState, CellFocusMode, ICellRange, ICellViewModel, INotebookCellList, INotebookEditor, INotebookEditorContribution, INotebookEditorMouseEvent, NotebookLayoutInfo, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_EDITOR_RUNNABLE, NOTEBOOK_HAS_MULTIPLE_KERNELS, NOTEBOOK_OUTPUT_FOCUSED } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookEditorExtensionsRegistry } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; import { NotebookCellList } from 'vs/workbench/contrib/notebook/browser/view/notebookCellList'; @@ -69,101 +69,68 @@ export class NotebookEditorOptions extends EditorOptions { export class NotebookEditorWidget extends Disposable implements INotebookEditor { static readonly ID: string = 'workbench.editor.notebook'; - private static readonly EDITOR_MEMENTOS = new Map>(); - private overlayContainer!: HTMLElement; - private body!: HTMLElement; - private webview: BackLayerWebView | null = null; - private webviewTransparentCover: HTMLElement | null = null; - private list: INotebookCellList | undefined; - private dndController: CellDragAndDropController | null = null; - private renderedEditors: Map = new Map(); - private eventDispatcher: NotebookEventDispatcher | undefined; - private notebookViewModel: NotebookViewModel | undefined; - private localStore: DisposableStore = this._register(new DisposableStore()); - private fontInfo: BareFontInfo | undefined; - private dimension: DOM.Dimension | null = null; - private shadowElementViewInfo: { height: number, width: number, top: number; left: number; } | null = null; - private editorFocus: IContextKey | null = null; - private outputFocus: IContextKey | null = null; - private editorEditable: IContextKey | null = null; - private editorRunnable: IContextKey | null = null; - private editorExecutingNotebook: IContextKey | null = null; - private notebookHasMultipleKernels: IContextKey | null = null; - private outputRenderer: OutputRenderer; + private static readonly EDITOR_MEMENTOS = new Map>(); + private _overlayContainer!: HTMLElement; + private _body!: HTMLElement; + private _webview: BackLayerWebView | null = null; + private _webviewTransparentCover: HTMLElement | null = null; + private _list: INotebookCellList | undefined; + private _dndController: CellDragAndDropController | null = null; + private _renderedEditors: Map = new Map(); + private _eventDispatcher: NotebookEventDispatcher | undefined; + private _notebookViewModel: NotebookViewModel | undefined; + private _localStore: DisposableStore = this._register(new DisposableStore()); + private _fontInfo: BareFontInfo | undefined; + private _dimension: DOM.Dimension | null = null; + private _shadowElementViewInfo: { height: number, width: number, top: number; left: number; } | null = null; + private _editorFocus: IContextKey | null = null; + private _outputFocus: IContextKey | null = null; + private _editorEditable: IContextKey | null = null; + private _editorRunnable: IContextKey | null = null; + private _editorExecutingNotebook: IContextKey | null = null; + private _notebookHasMultipleKernels: IContextKey | null = null; + private _outputRenderer: OutputRenderer; protected readonly _contributions: { [key: string]: INotebookEditorContribution; }; - private scrollBeyondLastLine: boolean; - private readonly memento: Memento; - private _isDisposed: boolean = false; - private readonly _onDidFocusWidget = this._register(new Emitter()); - public get onDidFocus(): Event { return this._onDidFocusWidget.event; } + private _scrollBeyondLastLine: boolean; + private readonly _memento: Memento; + private readonly _onDidFocusEmitter = this._register(new Emitter()); + public readonly onDidFocus = this._onDidFocusEmitter.event; private _cellContextKeyManager: CellContextKeyManager | null = null; private _isVisible = false; + private readonly _uuid = generateUuid(); + private _webiewFocused: boolean = false; + + private _isDisposed: boolean = false; get isDisposed() { return this._isDisposed; } - constructor( - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IStorageService storageService: IStorageService, - @INotebookService private notebookService: INotebookService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IContextKeyService readonly contextKeyService: IContextKeyService, - @ILayoutService private readonly _layoutService: ILayoutService - ) { - super(); - this.memento = new Memento(NotebookEditorWidget.ID, storageService); - - this.outputRenderer = new OutputRenderer(this, this.instantiationService); - this._contributions = {}; - this.scrollBeyondLastLine = this.configurationService.getValue('editor.scrollBeyondLastLine'); - - this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('editor.scrollBeyondLastLine')) { - this.scrollBeyondLastLine = this.configurationService.getValue('editor.scrollBeyondLastLine'); - if (this.dimension && this._isVisible) { - this.layout(this.dimension); - } - } - }); - - this.notebookService.addNotebookEditor(this); - } - - private _uuid = generateUuid(); - public getId(): string { - return this._uuid; - } - - private readonly _onDidChangeModel = new Emitter(); + private readonly _onDidChangeModel = this._register(new Emitter()); readonly onDidChangeModel: Event = this._onDidChangeModel.event; - private readonly _onDidFocusEditorWidget = new Emitter(); + private readonly _onDidFocusEditorWidget = this._register(new Emitter()); readonly onDidFocusEditorWidget = this._onDidFocusEditorWidget.event; set viewModel(newModel: NotebookViewModel | undefined) { - this.notebookViewModel = newModel; + this._notebookViewModel = newModel; this._onDidChangeModel.fire(newModel?.notebookDocument); } get viewModel() { - return this.notebookViewModel; + return this._notebookViewModel; } get uri() { - return this.notebookViewModel?.uri; + return this._notebookViewModel?.uri; } get textModel() { - return this.notebookViewModel?.notebookDocument; - } - - hasModel() { - return !!this.notebookViewModel; + return this._notebookViewModel?.notebookDocument; } private _activeKernel: INotebookKernelInfo | undefined = undefined; - private readonly _onDidChangeKernel = new Emitter(); + private readonly _onDidChangeKernel = this._register(new Emitter()); readonly onDidChangeKernel: Event = this._onDidChangeKernel.event; get activeKernel() { @@ -187,8 +154,43 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor return; } - const [focused] = this.list!.getFocusedElements(); - return this.renderedEditors.get(focused); + const [focused] = this._list!.getFocusedElements(); + return this._renderedEditors.get(focused); + } + + constructor( + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IStorageService storageService: IStorageService, + @INotebookService private notebookService: INotebookService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IContextKeyService readonly contextKeyService: IContextKeyService, + @ILayoutService private readonly layoutService: ILayoutService + ) { + super(); + this._memento = new Memento(NotebookEditorWidget.ID, storageService); + + this._outputRenderer = new OutputRenderer(this, this.instantiationService); + this._contributions = {}; + this._scrollBeyondLastLine = this.configurationService.getValue('editor.scrollBeyondLastLine'); + + this.configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('editor.scrollBeyondLastLine')) { + this._scrollBeyondLastLine = this.configurationService.getValue('editor.scrollBeyondLastLine'); + if (this._dimension && this._isVisible) { + this.layout(this._dimension); + } + } + }); + + this.notebookService.addNotebookEditor(this); + } + + public getId(): string { + return this._uuid; + } + + hasModel() { + return !!this._notebookViewModel; } //#region Editor Core @@ -202,11 +204,11 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor NotebookEditorWidget.EDITOR_MEMENTOS.set(mementoKey, editorMemento); } - return editorMemento; + return editorMemento as IEditorMemento; } protected getMemento(scope: StorageScope): MementoObject { - return this.memento.getMemento(scope); + return this._memento.getMemento(scope); } public get isNotebookEditor() { @@ -216,35 +218,37 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor updateEditorFocus() { // Note - focus going to the webview will fire 'blur', but the webview element will be // a descendent of the notebook editor root. - this.editorFocus?.set(DOM.isAncestor(document.activeElement, this.overlayContainer)); + const focused = DOM.isAncestor(document.activeElement, this._overlayContainer); + this._editorFocus?.set(focused); + this._notebookViewModel?.setFocus(focused); } hasFocus() { - return this.editorFocus?.get() || false; + return this._editorFocus?.get() || false; } createEditor(): void { - this.overlayContainer = document.createElement('div'); + this._overlayContainer = document.createElement('div'); const id = generateUuid(); - this.overlayContainer.id = `notebook-${id}`; - this.overlayContainer.className = 'notebookOverlay'; - DOM.addClass(this.overlayContainer, 'notebook-editor'); - this.overlayContainer.style.visibility = 'hidden'; + this._overlayContainer.id = `notebook-${id}`; + this._overlayContainer.className = 'notebookOverlay'; + DOM.addClass(this._overlayContainer, 'notebook-editor'); + this._overlayContainer.style.visibility = 'hidden'; - this._layoutService.container.appendChild(this.overlayContainer); - this.createBody(this.overlayContainer); - this.generateFontInfo(); - this.editorFocus = NOTEBOOK_EDITOR_FOCUSED.bindTo(this.contextKeyService); - this.editorFocus.set(true); + this.layoutService.container.appendChild(this._overlayContainer); + this._createBody(this._overlayContainer); + this._generateFontInfo(); + this._editorFocus = NOTEBOOK_EDITOR_FOCUSED.bindTo(this.contextKeyService); + this._editorFocus.set(true); this._isVisible = true; - this.outputFocus = NOTEBOOK_OUTPUT_FOCUSED.bindTo(this.contextKeyService); - this.editorEditable = NOTEBOOK_EDITOR_EDITABLE.bindTo(this.contextKeyService); - this.editorEditable.set(true); - this.editorRunnable = NOTEBOOK_EDITOR_RUNNABLE.bindTo(this.contextKeyService); - this.editorRunnable.set(true); - this.editorExecutingNotebook = NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK.bindTo(this.contextKeyService); - this.notebookHasMultipleKernels = NOTEBOOK_HAS_MULTIPLE_KERNELS.bindTo(this.contextKeyService); - this.notebookHasMultipleKernels.set(false); + this._outputFocus = NOTEBOOK_OUTPUT_FOCUSED.bindTo(this.contextKeyService); + this._editorEditable = NOTEBOOK_EDITOR_EDITABLE.bindTo(this.contextKeyService); + this._editorEditable.set(true); + this._editorRunnable = NOTEBOOK_EDITOR_RUNNABLE.bindTo(this.contextKeyService); + this._editorRunnable.set(true); + this._editorExecutingNotebook = NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK.bindTo(this.contextKeyService); + this._notebookHasMultipleKernels = NOTEBOOK_HAS_MULTIPLE_KERNELS.bindTo(this.contextKeyService); + this._notebookHasMultipleKernels.set(false); const contributions = NotebookEditorExtensionsRegistry.getEditorContributions(); @@ -258,32 +262,32 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } } - private generateFontInfo(): void { + private _generateFontInfo(): void { const editorOptions = this.configurationService.getValue('editor'); - this.fontInfo = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel()); + this._fontInfo = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel()); } - private createBody(parent: HTMLElement): void { - this.body = document.createElement('div'); - DOM.addClass(this.body, 'cell-list-container'); - this.createCellList(); - DOM.append(parent, this.body); + private _createBody(parent: HTMLElement): void { + this._body = document.createElement('div'); + DOM.addClass(this._body, 'cell-list-container'); + this._createCellList(); + DOM.append(parent, this._body); } - private createCellList(): void { - DOM.addClass(this.body, 'cell-list-container'); + private _createCellList(): void { + DOM.addClass(this._body, 'cell-list-container'); - this.dndController = this._register(new CellDragAndDropController(this, this.body)); - const getScopedContextKeyService = (container?: HTMLElement) => this.list!.contextKeyService.createScoped(container); + this._dndController = this._register(new CellDragAndDropController(this, this._body)); + const getScopedContextKeyService = (container?: HTMLElement) => this._list!.contextKeyService.createScoped(container); const renderers = [ - this.instantiationService.createInstance(CodeCellRenderer, this, this.renderedEditors, this.dndController, getScopedContextKeyService), - this.instantiationService.createInstance(MarkdownCellRenderer, this, this.dndController, this.renderedEditors, getScopedContextKeyService), + this.instantiationService.createInstance(CodeCellRenderer, this, this._renderedEditors, this._dndController, getScopedContextKeyService), + this.instantiationService.createInstance(MarkdownCellRenderer, this, this._dndController, this._renderedEditors, getScopedContextKeyService), ]; - this.list = this.instantiationService.createInstance( + this._list = this.instantiationService.createInstance( NotebookCellList, 'NotebookCellList', - this.body, + this._body, this.instantiationService.createInstance(NotebookCellListDelegate), renderers, this.contextKeyService, @@ -298,23 +302,23 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor enableKeyboardNavigation: true, additionalScrollHeight: 0, transformOptimization: false, - styleController: (_suffix: string) => { return this.list!; }, + styleController: (_suffix: string) => { return this._list!; }, overrideStyles: { - listBackground: editorBackground, - listActiveSelectionBackground: editorBackground, + listBackground: Color.transparent, + listActiveSelectionBackground: Color.transparent, listActiveSelectionForeground: foreground, - listFocusAndSelectionBackground: editorBackground, + listFocusAndSelectionBackground: Color.transparent, listFocusAndSelectionForeground: foreground, - listFocusBackground: editorBackground, + listFocusBackground: Color.transparent, listFocusForeground: foreground, listHoverForeground: foreground, - listHoverBackground: editorBackground, + listHoverBackground: Color.transparent, listHoverOutline: focusBorder, listFocusOutline: focusBorder, - listInactiveSelectionBackground: editorBackground, + listInactiveSelectionBackground: Color.transparent, listInactiveSelectionForeground: foreground, - listInactiveFocusBackground: editorBackground, - listInactiveFocusOutline: editorBackground, + listInactiveFocusBackground: Color.transparent, + listInactiveFocusOutline: Color.transparent, }, accessibilityProvider: { getAriaLabel() { return null; }, @@ -324,104 +328,129 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } }, ); - this.dndController.setList(this.list); + this._dndController.setList(this._list); // create Webview - this._register(this.list); + this._register(this._list); this._register(combinedDisposable(...renderers)); // transparent cover - this.webviewTransparentCover = DOM.append(this.list.rowsContainer, $('.webview-cover')); - this.webviewTransparentCover.style.display = 'none'; + this._webviewTransparentCover = DOM.append(this._list.rowsContainer, $('.webview-cover')); + this._webviewTransparentCover.style.display = 'none'; - this._register(DOM.addStandardDisposableGenericMouseDownListner(this.overlayContainer, (e: StandardMouseEvent) => { - if (DOM.hasClass(e.target, 'slider') && this.webviewTransparentCover) { - this.webviewTransparentCover.style.display = 'block'; + this._register(DOM.addStandardDisposableGenericMouseDownListner(this._overlayContainer, (e: StandardMouseEvent) => { + if (DOM.hasClass(e.target, 'slider') && this._webviewTransparentCover) { + this._webviewTransparentCover.style.display = 'block'; } })); - this._register(DOM.addStandardDisposableGenericMouseUpListner(this.overlayContainer, () => { - if (this.webviewTransparentCover) { + this._register(DOM.addStandardDisposableGenericMouseUpListner(this._overlayContainer, () => { + if (this._webviewTransparentCover) { // no matter when - this.webviewTransparentCover.style.display = 'none'; + this._webviewTransparentCover.style.display = 'none'; } })); - this._register(this.list.onMouseDown(e => { + this._register(this._list.onMouseDown(e => { if (e.element) { this._onMouseDown.fire({ event: e.browserEvent, target: e.element }); } })); - this._register(this.list.onMouseUp(e => { + this._register(this._list.onMouseUp(e => { if (e.element) { this._onMouseUp.fire({ event: e.browserEvent, target: e.element }); } })); - this._register(this.list.onDidChangeFocus(_e => this._onDidChangeActiveEditor.fire(this))); + this._register(this._list.onDidChangeFocus(_e => this._onDidChangeActiveEditor.fire(this))); const widgetFocusTracker = DOM.trackFocus(this.getDomNode()); this._register(widgetFocusTracker); - this._register(widgetFocusTracker.onDidFocus(() => this._onDidFocusWidget.fire())); + this._register(widgetFocusTracker.onDidFocus(() => this._onDidFocusEmitter.fire())); } getDomNode() { - return this.overlayContainer; + return this._overlayContainer; } onWillHide() { this._isVisible = false; - this.editorFocus?.set(false); - this.overlayContainer.style.visibility = 'hidden'; - this.overlayContainer.style.left = '-50000px'; + this._editorFocus?.set(false); + this._overlayContainer.style.visibility = 'hidden'; + this._overlayContainer.style.left = '-50000px'; } getInnerWebview(): Webview | undefined { - return this.webview?.webview; + return this._webview?.webview; } focus() { this._isVisible = true; - this.editorFocus?.set(true); - this.list?.domFocus(); + this._editorFocus?.set(true); + + if (this._webiewFocused) { + this._webview?.focusWebview(); + } else { + const focus = this._list?.getFocus()[0]; + if (typeof focus === 'number') { + const element = this._notebookViewModel!.viewCells[focus]; + + if (element.focusMode === CellFocusMode.Editor) { + element.editState = CellEditState.Editing; + element.focusMode = CellFocusMode.Editor; + this._onDidFocusEditorWidget.fire(); + return; + } + + } + this._list?.domFocus(); + } + this._onDidFocusEditorWidget.fire(); } - async setModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined, options: EditorOptions | undefined): Promise { - if (this.notebookViewModel === undefined || !this.notebookViewModel.equal(textModel)) { - this.detachModel(); - await this.attachModel(textModel, viewState); + async setModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined): Promise { + if (this._notebookViewModel === undefined || !this._notebookViewModel.equal(textModel)) { + this._detachModel(); + await this._attachModel(textModel, viewState); + } else { + this.restoreListViewState(viewState); } // clear state - this.dndController?.clearGlobalDragState(); + this._dndController?.clearGlobalDragState(); this._setKernels(textModel); - this.localStore.add(this.notebookService.onDidChangeKernels(() => { + this._localStore.add(this.notebookService.onDidChangeKernels(() => { if (this.activeKernel === undefined) { this._setKernels(textModel); } })); - this.localStore.add(this.list!.onDidChangeFocus(() => { - this._cellContextKeyManager?.dispose(); - const focused = this.list!.getFocusedElements()[0]; + this._localStore.add(this._list!.onDidChangeFocus(() => { + const focused = this._list!.getFocusedElements()[0]; if (focused) { - this._cellContextKeyManager = this.localStore.add(new CellContextKeyManager(this.contextKeyService, textModel, focused as any)); + if (!this._cellContextKeyManager) { + this._cellContextKeyManager = this._localStore.add(new CellContextKeyManager(this.contextKeyService, textModel, focused as CellViewModel)); + } + + this._cellContextKeyManager.updateForElement(focused as CellViewModel); } })); + } + async setOptions(options: NotebookEditorOptions | undefined) { // reveal cell if editor options tell to do so - if (options instanceof NotebookEditorOptions && options.cellOptions) { + if (options?.cellOptions) { const cellOptions = options.cellOptions; - const cell = this.notebookViewModel!.viewCells.find(cell => cell.uri.toString() === cellOptions.resource.toString()); + const cell = this._notebookViewModel!.viewCells.find(cell => cell.uri.toString() === cellOptions.resource.toString()); if (cell) { this.selectElement(cell); this.revealInCenterIfOutsideViewport(cell); - const editor = this.renderedEditors.get(cell)!; + const editor = this._renderedEditors.get(cell)!; if (editor) { if (cellOptions.options?.selection) { const { selection } = cellOptions.options; @@ -440,21 +469,33 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } } } + } else if (this._notebookViewModel && this._notebookViewModel.viewCells.length === 1 && this._notebookViewModel.viewCells[0].cellKind === CellKind.Code) { + // there is only one code cell in the document + const cell = this._notebookViewModel!.viewCells[0]; + if (cell.getTextLength() === 0) { + // the cell is empty, very likely a template cell, focus it + this.selectElement(cell); + await this.revealLineInCenterAsync(cell, 1); + const editor = this._renderedEditors.get(cell)!; + if (editor) { + editor.focus(); + } + } } } - private detachModel() { - this.localStore.clear(); - this.list?.detachViewModel(); + private _detachModel() { + this._localStore.clear(); + this._list?.detachViewModel(); this.viewModel?.dispose(); // avoid event - this.notebookViewModel = undefined; + this._notebookViewModel = undefined; // this.webview?.clearInsets(); // this.webview?.clearPreloadsCache(); - this.webview?.dispose(); - this.webview?.element.remove(); - this.webview = null; - this.list?.clear(); + this._webview?.dispose(); + this._webview?.element.remove(); + this._webview = null; + this._list?.clear(); } private _setKernels(textModel: NotebookTextModel) { @@ -462,71 +503,79 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor const availableKernels = this.notebookService.getContributedNotebookKernels(textModel.viewType, textModel.uri); if (provider.kernel && availableKernels.length > 0) { - this.notebookHasMultipleKernels!.set(true); + this._notebookHasMultipleKernels!.set(true); } else if (availableKernels.length > 1) { - this.notebookHasMultipleKernels!.set(true); + this._notebookHasMultipleKernels!.set(true); } else { - this.notebookHasMultipleKernels!.set(false); + this._notebookHasMultipleKernels!.set(false); } if (provider && provider.kernel) { // it has a builtin kernel, don't automatically choose a kernel - this.loadKernelPreloads(provider.providerExtensionLocation, provider.kernel); + this._loadKernelPreloads(provider.providerExtensionLocation, provider.kernel); return; } // the provider doesn't have a builtin kernel, choose a kernel this.activeKernel = availableKernels[0]; if (this.activeKernel) { - this.loadKernelPreloads(this.activeKernel.extensionLocation, this.activeKernel); + this._loadKernelPreloads(this.activeKernel.extensionLocation, this.activeKernel); } } - private loadKernelPreloads(extensionLocation: URI, kernel: INotebookKernelInfoDto) { + private _loadKernelPreloads(extensionLocation: URI, kernel: INotebookKernelInfoDto) { if (kernel.preloads) { - this.webview?.updateKernelPreloads([extensionLocation], kernel.preloads.map(preload => URI.revive(preload))); + this._webview?.updateKernelPreloads([extensionLocation], kernel.preloads.map(preload => URI.revive(preload))); } } - private updateForMetadata(): void { - this.editorEditable?.set(!!this.viewModel!.metadata?.editable); - this.editorRunnable?.set(!!this.viewModel!.metadata?.runnable); - DOM.toggleClass(this.overlayContainer, 'notebook-editor-editable', !!this.viewModel!.metadata?.editable); + private _updateForMetadata(): void { + this._editorEditable?.set(!!this.viewModel!.metadata?.editable); + this._editorRunnable?.set(!!this.viewModel!.metadata?.runnable); + DOM.toggleClass(this._overlayContainer, 'notebook-editor-editable', !!this.viewModel!.metadata?.editable); DOM.toggleClass(this.getDomNode(), 'notebook-editor-editable', !!this.viewModel!.metadata?.editable); } - private async createWebview(id: string, document: URI): Promise { - this.webview = this.instantiationService.createInstance(BackLayerWebView, this, id, document); + private async _createWebview(id: string, resource: URI): Promise { + this._webview = this.instantiationService.createInstance(BackLayerWebView, this, id, resource); // attach the webview container to the DOM tree first - this.list?.rowsContainer.insertAdjacentElement('afterbegin', this.webview.element); - await this.webview.createWebview(); - this.webview.webview.onDidBlur(() => { - this.outputFocus?.set(false); + this._list?.rowsContainer.insertAdjacentElement('afterbegin', this._webview.element); + await this._webview.createWebview(); + this._webview.webview.onDidBlur(() => { + this._outputFocus?.set(false); this.updateEditorFocus(); + + if (this._overlayContainer.contains(document.activeElement)) { + this._webiewFocused = false; + } }); - this.webview.webview.onDidFocus(() => { - this.outputFocus?.set(true); + this._webview.webview.onDidFocus(() => { + this._outputFocus?.set(true); this.updateEditorFocus(); - this._onDidFocusWidget.fire(); + this._onDidFocusEmitter.fire(); + + if (this._overlayContainer.contains(document.activeElement)) { + this._webiewFocused = true; + } }); - this.localStore.add(this.webview.onMessage(message => { + this._localStore.add(this._webview.onMessage(({ message, forRenderer }) => { if (this.viewModel) { - this.notebookService.onDidReceiveMessage(this.viewModel.viewType, this.getId(), message); + this.notebookService.onDidReceiveMessage(this.viewModel.viewType, this.getId(), forRenderer, message); } })); } - private async attachModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined) { - await this.createWebview(this.getId(), textModel.uri); + private async _attachModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined) { + await this._createWebview(this.getId(), textModel.uri); - this.eventDispatcher = new NotebookEventDispatcher(); - this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this.eventDispatcher, this.getLayoutInfo()); - this.eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); + this._eventDispatcher = new NotebookEventDispatcher(); + this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this._eventDispatcher, this.getLayoutInfo()); + this._eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); - this.updateForMetadata(); - this.localStore.add(this.eventDispatcher.onDidChangeMetadata(() => { - this.updateForMetadata(); + this._updateForMetadata(); + this._localStore.add(this._eventDispatcher.onDidChangeMetadata(() => { + this._updateForMetadata(); })); // restore view states, including contributions @@ -548,29 +597,29 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } } - this.webview?.updateRendererPreloads(this.viewModel.renderers); + this._webview?.updateRendererPreloads(this.viewModel.renderers); - this.localStore.add(this.list!.onWillScroll(e => { - this.webview!.updateViewScrollTop(-e.scrollTop, []); - this.webviewTransparentCover!.style.top = `${e.scrollTop}px`; + this._localStore.add(this._list!.onWillScroll(e => { + this._webview!.updateViewScrollTop(-e.scrollTop, []); + this._webviewTransparentCover!.style.top = `${e.scrollTop}px`; })); - this.localStore.add(this.list!.onDidChangeContentHeight(() => { + this._localStore.add(this._list!.onDidChangeContentHeight(() => { DOM.scheduleAtNextAnimationFrame(() => { if (this._isDisposed) { return; } - const scrollTop = this.list?.scrollTop || 0; - const scrollHeight = this.list?.scrollHeight || 0; - this.webview!.element.style.height = `${scrollHeight}px`; + const scrollTop = this._list?.scrollTop || 0; + const scrollHeight = this._list?.scrollHeight || 0; + this._webview!.element.style.height = `${scrollHeight}px`; - if (this.webview?.insetMapping) { + if (this._webview?.insetMapping) { let updateItems: { cell: CodeCellViewModel, output: IProcessedOutput, cellTop: number }[] = []; let removedItems: IProcessedOutput[] = []; - this.webview?.insetMapping.forEach((value, key) => { + this._webview?.insetMapping.forEach((value, key) => { const cell = value.cell; - const viewIndex = this.list?.getViewIndex(cell); + const viewIndex = this._list?.getViewIndex(cell); if (viewIndex === undefined) { return; @@ -581,8 +630,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor removedItems.push(key); } - const cellTop = this.list?.getAbsoluteTopOfElement(cell) || 0; - if (this.webview!.shouldUpdateInset(cell, key, cellTop)) { + const cellTop = this._list?.getAbsoluteTopOfElement(cell) || 0; + if (this._webview!.shouldUpdateInset(cell, key, cellTop)) { updateItems.push({ cell: cell, output: key, @@ -591,50 +640,50 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } }); - removedItems.forEach(output => this.webview?.removeInset(output)); + removedItems.forEach(output => this._webview?.removeInset(output)); if (updateItems.length) { - this.webview?.updateViewScrollTop(-scrollTop, updateItems); + this._webview?.updateViewScrollTop(-scrollTop, updateItems); } } }); })); - this.list!.attachViewModel(this.viewModel); - this.localStore.add(this.list!.onDidRemoveOutput(output => { + this._list!.attachViewModel(this.viewModel); + this._localStore.add(this._list!.onDidRemoveOutput(output => { this.removeInset(output); })); - this.localStore.add(this.list!.onDidHideOutput(output => { + this._localStore.add(this._list!.onDidHideOutput(output => { this.hideInset(output); })); - this.list!.layout(); - this.dndController?.clearGlobalDragState(); + this._list!.layout(); + this._dndController?.clearGlobalDragState(); // restore list state at last, it must be after list layout this.restoreListViewState(viewState); } - private restoreListViewState(viewState: INotebookEditorViewState | undefined): void { + restoreListViewState(viewState: INotebookEditorViewState | undefined): void { if (viewState?.scrollPosition !== undefined) { - this.list!.scrollTop = viewState!.scrollPosition.top; - this.list!.scrollLeft = viewState!.scrollPosition.left; + this._list!.scrollTop = viewState!.scrollPosition.top; + this._list!.scrollLeft = viewState!.scrollPosition.left; } else { - this.list!.scrollTop = 0; - this.list!.scrollLeft = 0; + this._list!.scrollTop = 0; + this._list!.scrollLeft = 0; } const focusIdx = typeof viewState?.focus === 'number' ? viewState.focus : 0; - if (focusIdx < this.list!.length) { - this.list!.setFocus([focusIdx]); - this.list!.setSelection([focusIdx]); - } else if (this.list!.length > 0) { - this.list!.setFocus([0]); + if (focusIdx < this._list!.length) { + this._list!.setFocus([focusIdx]); + this._list!.setSelection([focusIdx]); + } else if (this._list!.length > 0) { + this._list!.setFocus([0]); } if (viewState?.editorFocused) { - this.list?.focusView(); - const cell = this.notebookViewModel?.viewCells[focusIdx]; + this._list?.focusView(); + const cell = this._notebookViewModel?.viewCells[focusIdx]; if (cell) { cell.focusMode = CellFocusMode.Editor; } @@ -642,7 +691,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } getEditorViewState(): INotebookEditorViewState { - const state = this.notebookViewModel?.getEditorViewState(); + const state = this._notebookViewModel?.getEditorViewState(); if (!state) { return { editingCells: {}, @@ -650,8 +699,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor }; } - if (this.list) { - state.scrollPosition = { left: this.list.scrollLeft, top: this.list.scrollTop }; + if (this._list) { + state.scrollPosition = { left: this._list.scrollLeft, top: this._list.scrollTop }; let cellHeights: { [key: number]: number } = {}; for (let i = 0; i < this.viewModel!.length; i++) { const elm = this.viewModel!.viewCells[i] as CellViewModel; @@ -664,22 +713,21 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor state.cellTotalHeights = cellHeights; - const focus = this.list.getFocus()[0]; + const focus = this._list.getFocus()[0]; if (typeof focus === 'number') { - const element = this.notebookViewModel!.viewCells[focus]; - const itemDOM = this.list?.domElementOfElement(element!); - let editorFocused = false; - if (document.activeElement && itemDOM && itemDOM.contains(document.activeElement)) { - editorFocused = true; - } + const element = this._notebookViewModel!.viewCells[focus]; + if (element) { + const itemDOM = this._list?.domElementOfElement(element); + let editorFocused = !!(document.activeElement && itemDOM && itemDOM.contains(document.activeElement)); - state.editorFocused = editorFocused; - state.focus = focus; + state.editorFocused = editorFocused; + state.focus = focus; + } } } // Save contribution view states - const contributionsState: { [key: string]: any } = {}; + const contributionsState: { [key: string]: unknown } = {}; const keys = Object.keys(this._contributions); for (const id of keys) { @@ -703,15 +751,15 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor // } layout(dimension: DOM.Dimension, shadowElement?: HTMLElement): void { - if (!shadowElement && this.shadowElementViewInfo === null) { - this.dimension = dimension; + if (!shadowElement && this._shadowElementViewInfo === null) { + this._dimension = dimension; return; } if (shadowElement) { const containerRect = shadowElement.getBoundingClientRect(); - this.shadowElementViewInfo = { + this._shadowElementViewInfo = { height: containerRect.height, width: containerRect.width, top: containerRect.top, @@ -719,25 +767,25 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor }; } - this.dimension = new DOM.Dimension(dimension.width, dimension.height); - DOM.size(this.body, dimension.width, dimension.height); - this.list?.updateOptions({ additionalScrollHeight: this.scrollBeyondLastLine ? dimension.height - SCROLLABLE_ELEMENT_PADDING_TOP : 0 }); - this.list?.layout(dimension.height - SCROLLABLE_ELEMENT_PADDING_TOP, dimension.width); + this._dimension = new DOM.Dimension(dimension.width, dimension.height); + DOM.size(this._body, dimension.width, dimension.height); + this._list?.updateOptions({ additionalScrollHeight: this._scrollBeyondLastLine ? dimension.height - SCROLLABLE_ELEMENT_PADDING_TOP : 0 }); + this._list?.layout(dimension.height - SCROLLABLE_ELEMENT_PADDING_TOP, dimension.width); - this.overlayContainer.style.visibility = 'visible'; - this.overlayContainer.style.display = 'block'; - this.overlayContainer.style.position = 'absolute'; - this.overlayContainer.style.top = `${this.shadowElementViewInfo!.top}px`; - this.overlayContainer.style.left = `${this.shadowElementViewInfo!.left}px`; - this.overlayContainer.style.width = `${dimension ? dimension.width : this.shadowElementViewInfo!.width}px`; - this.overlayContainer.style.height = `${dimension ? dimension.height : this.shadowElementViewInfo!.height}px`; + this._overlayContainer.style.visibility = 'visible'; + this._overlayContainer.style.display = 'block'; + this._overlayContainer.style.position = 'absolute'; + this._overlayContainer.style.top = `${this._shadowElementViewInfo!.top}px`; + this._overlayContainer.style.left = `${this._shadowElementViewInfo!.left}px`; + this._overlayContainer.style.width = `${dimension ? dimension.width : this._shadowElementViewInfo!.width}px`; + this._overlayContainer.style.height = `${dimension ? dimension.height : this._shadowElementViewInfo!.height}px`; - if (this.webviewTransparentCover) { - this.webviewTransparentCover.style.height = `${dimension.height}px`; - this.webviewTransparentCover.style.width = `${dimension.width}px`; + if (this._webviewTransparentCover) { + this._webviewTransparentCover.style.height = `${dimension.height}px`; + this._webviewTransparentCover.style.width = `${dimension.width}px`; } - this.eventDispatcher?.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); + this._eventDispatcher?.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); } // protected saveState(): void { @@ -753,56 +801,56 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor //#region Editor Features selectElement(cell: ICellViewModel) { - this.list?.selectElement(cell); + this._list?.selectElement(cell); // this.viewModel!.selectionHandles = [cell.handle]; } revealInView(cell: ICellViewModel) { - this.list?.revealElementInView(cell); + this._list?.revealElementInView(cell); } revealInCenterIfOutsideViewport(cell: ICellViewModel) { - this.list?.revealElementInCenterIfOutsideViewport(cell); + this._list?.revealElementInCenterIfOutsideViewport(cell); } revealInCenter(cell: ICellViewModel) { - this.list?.revealElementInCenter(cell); + this._list?.revealElementInCenter(cell); } async revealLineInViewAsync(cell: ICellViewModel, line: number): Promise { - return this.list?.revealElementLineInViewAsync(cell, line); + return this._list?.revealElementLineInViewAsync(cell, line); } async revealLineInCenterAsync(cell: ICellViewModel, line: number): Promise { - return this.list?.revealElementLineInCenterAsync(cell, line); + return this._list?.revealElementLineInCenterAsync(cell, line); } async revealLineInCenterIfOutsideViewportAsync(cell: ICellViewModel, line: number): Promise { - return this.list?.revealElementLineInCenterIfOutsideViewportAsync(cell, line); + return this._list?.revealElementLineInCenterIfOutsideViewportAsync(cell, line); } async revealRangeInViewAsync(cell: ICellViewModel, range: Range): Promise { - return this.list?.revealElementRangeInViewAsync(cell, range); + return this._list?.revealElementRangeInViewAsync(cell, range); } async revealRangeInCenterAsync(cell: ICellViewModel, range: Range): Promise { - return this.list?.revealElementRangeInCenterAsync(cell, range); + return this._list?.revealElementRangeInCenterAsync(cell, range); } async revealRangeInCenterIfOutsideViewportAsync(cell: ICellViewModel, range: Range): Promise { - return this.list?.revealElementRangeInCenterIfOutsideViewportAsync(cell, range); + return this._list?.revealElementRangeInCenterIfOutsideViewportAsync(cell, range); } setCellSelection(cell: ICellViewModel, range: Range): void { - this.list?.setCellSelection(cell, range); + this._list?.setCellSelection(cell, range); } - changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any { - return this.notebookViewModel?.changeDecorations(callback); + changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => T): T | null { + return this._notebookViewModel?.changeDecorations(callback) || null; } setHiddenAreas(_ranges: ICellRange[]): boolean { - return this.list!.setHiddenAreas(_ranges, true); + return this._list!.setHiddenAreas(_ranges, true); } //#endregion @@ -820,7 +868,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor //#region Cell operations async layoutNotebookCell(cell: ICellViewModel, height: number): Promise { - const viewIndex = this.list!.getViewIndex(cell); + const viewIndex = this._list!.getViewIndex(cell); if (viewIndex === undefined) { // the cell is hidden return; @@ -831,7 +879,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor return; } - this.list?.updateElementHeight2(cell, height); + this._list?.updateElementHeight2(cell, height); }; if (this.pendingLayouts.has(cell)) { @@ -859,30 +907,32 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } insertNotebookCell(cell: ICellViewModel | undefined, type: CellKind, direction: 'above' | 'below' = 'above', initialText: string = '', ui: boolean = false): CellViewModel | null { - if (!this.notebookViewModel!.metadata.editable) { + if (!this._notebookViewModel!.metadata.editable) { return null; } - const newLanguages = this.notebookViewModel!.languages; - const language = (type === CellKind.Code && newLanguages && newLanguages.length) ? newLanguages[0] : 'markdown'; - const index = cell ? this.notebookViewModel!.getCellIndex(cell) : 0; - const nextIndex = ui ? this.notebookViewModel!.getNextVisibleCellIndex(index) : index + 1; + const index = cell ? this._notebookViewModel!.getCellIndex(cell) : 0; + const nextIndex = ui ? this._notebookViewModel!.getNextVisibleCellIndex(index) : index + 1; + const newLanguages = this._notebookViewModel!.languages; + const language = (cell?.cellKind === CellKind.Code && type === CellKind.Code) + ? cell.language + : ((type === CellKind.Code && newLanguages && newLanguages.length) ? newLanguages[0] : 'markdown'); const insertIndex = cell ? (direction === 'above' ? index : nextIndex) : index; - const newCell = this.notebookViewModel!.createCell(insertIndex, initialText.split(/\r?\n/g), language, type, cell?.metadata, true); - return newCell; + const newCell = this._notebookViewModel!.createCell(insertIndex, initialText.split(/\r?\n/g), language, type, undefined, true); + return newCell as CellViewModel; } async splitNotebookCell(cell: ICellViewModel): Promise { - const index = this.notebookViewModel!.getCellIndex(cell); + const index = this._notebookViewModel!.getCellIndex(cell); - return this.notebookViewModel!.splitNotebookCell(index); + return this._notebookViewModel!.splitNotebookCell(index); } async joinNotebookCells(cell: ICellViewModel, direction: 'above' | 'below', constraint?: CellKind): Promise { - const index = this.notebookViewModel!.getCellIndex(cell); - const ret = await this.notebookViewModel!.joinNotebookCells(index, direction, constraint); + const index = this._notebookViewModel!.getCellIndex(cell); + const ret = await this._notebookViewModel!.joinNotebookCells(index, direction, constraint); if (ret) { ret.deletedCells.forEach(cell => { @@ -898,7 +948,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } async deleteNotebookCell(cell: ICellViewModel): Promise { - if (!this.notebookViewModel!.metadata.editable) { + if (!this._notebookViewModel!.metadata.editable) { return false; } @@ -906,93 +956,94 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this.pendingLayouts.get(cell)!.dispose(); } - const index = this.notebookViewModel!.getCellIndex(cell); - this.notebookViewModel!.deleteCell(index, true); + const index = this._notebookViewModel!.getCellIndex(cell); + this._notebookViewModel!.deleteCell(index, true); return true; } - async moveCellDown(cell: ICellViewModel): Promise { - if (!this.notebookViewModel!.metadata.editable) { - return false; + async moveCellDown(cell: ICellViewModel): Promise { + if (!this._notebookViewModel!.metadata.editable) { + return null; } - const index = this.notebookViewModel!.getCellIndex(cell); - if (index === this.notebookViewModel!.length - 1) { - return false; + const index = this._notebookViewModel!.getCellIndex(cell); + if (index === this._notebookViewModel!.length - 1) { + return null; } const newIdx = index + 1; - return this.moveCellToIndex(index, newIdx); + return this._moveCellToIndex(index, newIdx); } - async moveCellUp(cell: ICellViewModel): Promise { - if (!this.notebookViewModel!.metadata.editable) { - return false; + async moveCellUp(cell: ICellViewModel): Promise { + if (!this._notebookViewModel!.metadata.editable) { + return null; } - const index = this.notebookViewModel!.getCellIndex(cell); + const index = this._notebookViewModel!.getCellIndex(cell); if (index === 0) { - return false; + return null; } const newIdx = index - 1; - return this.moveCellToIndex(index, newIdx); + return this._moveCellToIndex(index, newIdx); } - async moveCell(cell: ICellViewModel, relativeToCell: ICellViewModel, direction: 'above' | 'below'): Promise { - if (!this.notebookViewModel!.metadata.editable) { - return false; + async moveCell(cell: ICellViewModel, relativeToCell: ICellViewModel, direction: 'above' | 'below'): Promise { + if (!this._notebookViewModel!.metadata.editable) { + return null; } if (cell === relativeToCell) { - return false; + return null; } - const originalIdx = this.notebookViewModel!.getCellIndex(cell); - const relativeToIndex = this.notebookViewModel!.getCellIndex(relativeToCell); + const originalIdx = this._notebookViewModel!.getCellIndex(cell); + const relativeToIndex = this._notebookViewModel!.getCellIndex(relativeToCell); let newIdx = direction === 'above' ? relativeToIndex : relativeToIndex + 1; if (originalIdx < newIdx) { newIdx--; } - return this.moveCellToIndex(originalIdx, newIdx); + return this._moveCellToIndex(originalIdx, newIdx); } - private async moveCellToIndex(index: number, newIdx: number): Promise { + private async _moveCellToIndex(index: number, newIdx: number): Promise { if (index === newIdx) { - return false; + return null; } - if (!this.notebookViewModel!.moveCellToIdx(index, newIdx, true)) { + if (!this._notebookViewModel!.moveCellToIdx(index, newIdx, true)) { throw new Error('Notebook Editor move cell, index out of range'); } - let r: (val: boolean) => void; + let r: (val: ICellViewModel | null) => void; DOM.scheduleAtNextAnimationFrame(() => { if (this._isDisposed) { - r(false); + r(null); } - this.list?.revealElementInView(this.notebookViewModel!.viewCells[newIdx]); - r(true); + const viewCell = this._notebookViewModel!.viewCells[newIdx]; + this._list?.revealElementInView(viewCell); + r(viewCell); }); return new Promise(resolve => { r = resolve; }); } editNotebookCell(cell: CellViewModel): void { - if (!cell.getEvaluatedMetadata(this.notebookViewModel!.metadata).editable) { + if (!cell.getEvaluatedMetadata(this._notebookViewModel!.metadata).editable) { return; } cell.editState = CellEditState.Editing; - this.renderedEditors.get(cell)?.focus(); + this._renderedEditors.get(cell)?.focus(); } getActiveCell() { - let elements = this.list?.getFocusedElements(); + let elements = this._list?.getFocusedElements(); if (elements && elements.length) { return elements[0]; @@ -1002,17 +1053,17 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } cancelNotebookExecution(): void { - if (!this.notebookViewModel!.currentTokenSource) { + if (!this._notebookViewModel!.currentTokenSource) { throw new Error('Notebook is not executing'); } - this.notebookViewModel!.currentTokenSource.cancel(); - this.notebookViewModel!.currentTokenSource = undefined; + this._notebookViewModel!.currentTokenSource.cancel(); + this._notebookViewModel!.currentTokenSource = undefined; } async executeNotebook(): Promise { - if (!this.notebookViewModel!.metadata.runnable) { + if (!this._notebookViewModel!.metadata.runnable) { return; } @@ -1020,21 +1071,21 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } async _executeNotebook(): Promise { - if (this.notebookViewModel!.currentTokenSource) { + if (this._notebookViewModel!.currentTokenSource) { return; } const tokenSource = new CancellationTokenSource(); try { - this.editorExecutingNotebook!.set(true); - this.notebookViewModel!.currentTokenSource = tokenSource; + this._editorExecutingNotebook!.set(true); + this._notebookViewModel!.currentTokenSource = tokenSource; const provider = this.notebookService.getContributedNotebookProviders(this.viewModel!.uri)[0]; if (provider) { const viewType = provider.id; - const notebookUri = this.notebookViewModel!.uri; + const notebookUri = this._notebookViewModel!.uri; if (this._activeKernel) { - await this.notebookService.executeNotebook2(this.notebookViewModel!.viewType, this.notebookViewModel!.uri, this._activeKernel.id, tokenSource.token); + await this.notebookService.executeNotebook2(this._notebookViewModel!.viewType, this._notebookViewModel!.uri, this._activeKernel.id, tokenSource.token); } else if (provider.kernel) { return await this.notebookService.executeNotebook(viewType, notebookUri, true, tokenSource.token); } else { @@ -1043,8 +1094,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } } finally { - this.editorExecutingNotebook!.set(false); - this.notebookViewModel!.currentTokenSource = undefined; + this._editorExecutingNotebook!.set(false); + this._notebookViewModel!.currentTokenSource = undefined; tokenSource.dispose(); } } @@ -1060,11 +1111,11 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor async executeNotebookCell(cell: ICellViewModel): Promise { if (cell.cellKind === CellKind.Markdown) { - cell.editState = CellEditState.Preview; + this.focusNotebookCell(cell, 'container'); return; } - if (!cell.getEvaluatedMetadata(this.notebookViewModel!.metadata).runnable) { + if (!cell.getEvaluatedMetadata(this._notebookViewModel!.metadata).runnable) { return; } @@ -1083,7 +1134,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor const provider = this.notebookService.getContributedNotebookProviders(this.viewModel!.uri)[0]; if (provider) { const viewType = provider.id; - const notebookUri = this.notebookViewModel!.uri; + const notebookUri = this._notebookViewModel!.uri; if (this._activeKernel) { return await this.notebookService.executeNotebookCell2(viewType, notebookUri, cell.handle, this._activeKernel.id, tokenSource.token); @@ -1105,25 +1156,25 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor if (focusItem === 'editor') { this.selectElement(cell); - this.list?.focusView(); + this._list?.focusView(); cell.editState = CellEditState.Editing; cell.focusMode = CellFocusMode.Editor; this.revealInCenterIfOutsideViewport(cell); } else if (focusItem === 'output') { this.selectElement(cell); - this.list?.focusView(); + this._list?.focusView(); - if (!this.webview) { + if (!this._webview) { return; } - this.webview.focusOutput(cell.id); + this._webview.focusOutput(cell.id); cell.editState = CellEditState.Preview; cell.focusMode = CellFocusMode.Container; this.revealInCenterIfOutsideViewport(cell); } else { - let itemDOM = this.list?.domElementOfElement(cell); + let itemDOM = this._list?.domElementOfElement(cell); if (document.activeElement && itemDOM && itemDOM.contains(document.activeElement)) { (document.activeElement as HTMLElement).blur(); } @@ -1133,7 +1184,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this.selectElement(cell); this.revealInCenterIfOutsideViewport(cell); - this.list?.focusView(); + this._list?.focusView(); } } @@ -1142,63 +1193,80 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor //#region MISC getLayoutInfo(): NotebookLayoutInfo { - if (!this.list) { + if (!this._list) { throw new Error('Editor is not initalized successfully'); } return { - width: this.dimension!.width, - height: this.dimension!.height, - fontInfo: this.fontInfo! + width: this._dimension!.width, + height: this._dimension!.height, + fontInfo: this._fontInfo! }; } triggerScroll(event: IMouseWheelEvent) { - this.list?.triggerScrollFromMouseWheelEvent(event); + this._list?.triggerScrollFromMouseWheelEvent(event); } - createInset(cell: CodeCellViewModel, output: IProcessedOutput, shadowContent: string, offset: number) { - if (!this.webview) { + async createInset(cell: CodeCellViewModel, output: IProcessedOutput, shadowContent: string, offset: number) { + if (!this._webview) { return; } - let preloads = this.notebookViewModel!.renderers; + let preloads = this._notebookViewModel!.renderers; - if (!this.webview!.insetMapping.has(output)) { - let cellTop = this.list?.getAbsoluteTopOfElement(cell) || 0; - this.webview!.createInset(cell, output, cellTop, offset, shadowContent, preloads); + if (!this._webview!.insetMapping.has(output)) { + let cellTop = this._list?.getAbsoluteTopOfElement(cell) || 0; + await this._webview!.createInset(cell, output, cellTop, offset, shadowContent, preloads); } else { - let cellTop = this.list?.getAbsoluteTopOfElement(cell) || 0; - let scrollTop = this.list?.scrollTop || 0; + let cellTop = this._list?.getAbsoluteTopOfElement(cell) || 0; + let scrollTop = this._list?.scrollTop || 0; - this.webview!.updateViewScrollTop(-scrollTop, [{ cell: cell, output: output, cellTop: cellTop }]); + this._webview!.updateViewScrollTop(-scrollTop, [{ cell: cell, output: output, cellTop: cellTop }]); } } removeInset(output: IProcessedOutput) { - if (!this.webview) { + if (!this._webview) { return; } - this.webview!.removeInset(output); + this._webview!.removeInset(output); } hideInset(output: IProcessedOutput) { - if (!this.webview) { + if (!this._webview) { return; } - this.webview!.hideInset(output); + this._webview!.hideInset(output); } getOutputRenderer(): OutputRenderer { - return this.outputRenderer; + return this._outputRenderer; } - postMessage(message: any) { - this.webview?.webview.postMessage(message); + postMessage(forRendererId: string | undefined, message: any) { + if (forRendererId === undefined) { + this._webview?.webview.postMessage(message); + } else { + this._webview?.postRendererMessage(forRendererId, message); + } } + toggleClassName(className: string) { + DOM.toggleClass(this._overlayContainer, className); + } + + addClassName(className: string) { + DOM.addClass(this._overlayContainer, className); + } + + removeClassName(className: string) { + DOM.removeClass(this._overlayContainer, className); + } + + //#endregion //#region Editor Contributions @@ -1210,6 +1278,9 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor dispose() { this._isDisposed = true; + // dispose webview first + this._webview?.dispose(); + this.notebookService.removeNotebookEditor(this); const keys = Object.keys(this._contributions); for (let i = 0, len = keys.length; i < len; i++) { @@ -1217,11 +1288,10 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this._contributions[contributionId].dispose(); } - this.localStore.clear(); - this.list?.dispose(); - this.webview?.dispose(); + this._localStore.clear(); + this._list?.dispose(); - this.overlayContainer.remove(); + this._overlayContainer.remove(); this.viewModel?.dispose(); // this._layoutService.container.removeChild(this.overlayContainer); @@ -1229,7 +1299,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor super.dispose(); } - toJSON(): any { + toJSON(): object { return { notebookHandle: this.viewModel?.handle }; @@ -1237,22 +1307,16 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } export const notebookCellBorder = registerColor('notebook.cellBorderColor', { - dark: transparent(PANEL_BORDER, .6), - light: transparent(PANEL_BORDER, .4), + dark: transparent(PANEL_BORDER, .4), + light: transparent(listInactiveSelectionBackground, 1), hc: PANEL_BORDER }, nls.localize('notebook.cellBorderColor', "The border color for notebook cells.")); -export const focusedCellIndicator = registerColor('notebook.focusedCellIndicator', { +export const focusedEditorBorderColor = registerColor('notebook.focusedEditorBorder', { light: focusBorder, dark: focusBorder, hc: focusBorder -}, nls.localize('notebook.focusedCellIndicator', "The color of the notebook cell indicator.")); - -export const focusedEditorIndicator = registerColor('notebook.focusedEditorIndicator', { - light: focusBorder, - dark: focusBorder, - hc: focusBorder -}, nls.localize('notebook.focusedEditorIndicator', "The color of the notebook cell editor indicator.")); +}, nls.localize('notebook.focusedEditorBorder', "The color of the notebook cell editor border.")); export const cellStatusIconSuccess = registerColor('notebookStatusSuccessIcon.foreground', { light: debugIconStartForeground, @@ -1274,7 +1338,7 @@ export const cellStatusIconRunning = registerColor('notebookStatusRunningIcon.fo export const notebookOutputContainerColor = registerColor('notebook.outputContainerBackgroundColor', { dark: notebookCellBorder, - light: notebookCellBorder, + light: transparent(listFocusBackground, .4), hc: null }, nls.localize('notebook.outputContainerBackgroundColor', "The Color of the notebook output container background.")); @@ -1283,7 +1347,31 @@ export const CELL_TOOLBAR_SEPERATOR = registerColor('notebook.cellToolbarSeperat dark: Color.fromHex('#808080').transparent(0.35), light: Color.fromHex('#808080').transparent(0.35), hc: contrastBorder -}, nls.localize('cellToolbarSeperator', "The color of seperator in Cell bottom toolbar")); +}, nls.localize('notebook.cellToolbarSeperator', "The color of the seperator in the cell bottom toolbar")); + +export const focusedCellBackground = registerColor('notebook.focusedCellBackground', { + dark: transparent(PANEL_BORDER, .4), + light: transparent(listFocusBackground, .4), + hc: null +}, nls.localize('focusedCellBackground', "The background color of a cell when the cell is focused.")); + +export const cellHoverBackground = registerColor('notebook.cellHoverBackground', { + dark: transparent(focusedCellBackground, .5), + light: transparent(focusedCellBackground, .7), + hc: null +}, nls.localize('notebook.cellHoverBackground', "The background color of a cell when the cell is hovered.")); + +export const focusedCellBorder = registerColor('notebook.focusedCellBorder', { + dark: Color.white.transparent(0.12), + light: Color.black.transparent(0.12), + hc: focusBorder +}, nls.localize('notebook.focusedCellBorder', "The color of the cell's top and bottom border when the cell is focused.")); + +export const focusedCellShadow = registerColor('notebook.focusedCellShadow', { + dark: transparent(widgetShadow, 0.6), + light: transparent(widgetShadow, 0.4), + hc: Color.transparent +}, nls.localize('notebook.focusedCellShadow', "The color of the cell shadow when cells are focused.")); export const cellStatusBarItemHover = registerColor('notebook.cellStatusBarItemHoverBackground', { light: new Color(new RGBA(0, 0, 0, 0.08)), @@ -1291,6 +1379,33 @@ export const cellStatusBarItemHover = registerColor('notebook.cellStatusBarItemH hc: new Color(new RGBA(255, 255, 255, 0.15)), }, nls.localize('notebook.cellStatusBarItemHoverBackground', "The background color of notebook cell status bar items.")); +export const cellInsertionIndicator = registerColor('notebook.cellInsertionIndicator', { + light: focusBorder, + dark: focusBorder, + hc: focusBorder +}, nls.localize('notebook.cellInsertionIndicator', "The color of the notebook cell insertion indicator.")); + + +export const listScrollbarSliderBackground = registerColor('notebookScrollbarSlider.background', { + dark: scrollbarSliderBackground, + light: scrollbarSliderBackground, + hc: scrollbarSliderBackground +}, nls.localize('notebookScrollbarSliderBackground', "Notebook scrollbar slider background color.")); + +export const listScrollbarSliderHoverBackground = registerColor('notebookScrollbarSlider.hoverBackground', { + dark: scrollbarSliderHoverBackground, + light: scrollbarSliderHoverBackground, + hc: scrollbarSliderHoverBackground +}, nls.localize('notebookScrollbarSliderHoverBackground', "Notebook scrollbar slider background color when hovering.")); + +export const listScrollbarSliderActiveBackground = registerColor('notebookScrollbarSlider.activeBackground', { + dark: scrollbarSliderActiveBackground, + light: scrollbarSliderActiveBackground, + hc: scrollbarSliderActiveBackground +}, nls.localize('notebookScrollbarSliderActiveBackground', "Notebook scrollbar slider background color when clicked on.")); + + + registerThemingParticipant((theme, collector) => { collector.addRule(`.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element { padding-top: ${SCROLLABLE_ELEMENT_PADDING_TOP}px; @@ -1336,6 +1451,7 @@ registerThemingParticipant((theme, collector) => { const containerBackground = theme.getColor(notebookOutputContainerColor); if (containerBackground) { collector.addRule(`.notebookOverlay .output { background-color: ${containerBackground}; }`); + collector.addRule(`.notebookOverlay .output-element { background-color: ${containerBackground}; }`); } const editorBackgroundColor = theme.getColor(editorBackground); @@ -1350,20 +1466,32 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container .separator { background-color: ${cellToolbarSeperator} }`); collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container .action-item:first-child::after { background-color: ${cellToolbarSeperator} }`); collector.addRule(`.notebookOverlay .monaco-list-row > .monaco-toolbar { border: solid 1px ${cellToolbarSeperator}; }`); - collector.addRule(`.notebookOverlay .monaco-list-row:hover .notebook-cell-focus-indicator, - .notebookOverlay .monaco-list-row.cell-output-hover .notebook-cell-focus-indicator { border-color: ${cellToolbarSeperator}; }`); } - const focusedCellIndicatorColor = theme.getColor(focusedCellIndicator); - if (focusedCellIndicatorColor) { - collector.addRule(`.notebookOverlay .monaco-list-row.focused .notebook-cell-focus-indicator { border-color: ${focusedCellIndicatorColor}; }`); - collector.addRule(`.notebookOverlay .monaco-list-row .notebook-cell-focus-indicator { border-color: ${focusedCellIndicatorColor}; }`); - collector.addRule(`.notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { background-color: ${focusedCellIndicatorColor}; }`); + const focusedCellBackgroundColor = theme.getColor(focusedCellBackground); + if (focusedCellBackgroundColor) { + collector.addRule(`.notebookOverlay .code-cell-row.focused .cell-focus-indicator, + .notebookOverlay .markdown-cell-row.focused { background-color: ${focusedCellBackgroundColor} !important; }`); } - const focusedEditorIndicatorColor = theme.getColor(focusedEditorIndicator); - if (focusedEditorIndicatorColor) { - collector.addRule(`.notebookOverlay .monaco-list-row.cell-editor-focus .cell-editor-part:before { outline: solid 1px ${focusedEditorIndicatorColor}; }`); + const cellHoverBackgroundColor = theme.getColor(cellHoverBackground); + if (cellHoverBackgroundColor) { + collector.addRule(`.notebookOverlay .code-cell-row:not(.focused):hover .cell-focus-indicator, + .notebookOverlay .code-cell-row:not(.focused).cell-output-hover .cell-focus-indicator, + .notebookOverlay .markdown-cell-row:not(.focused):hover { background-color: ${cellHoverBackgroundColor} !important; }`); + } + + const focusedCellBorderColor = theme.getColor(focusedCellBorder); + collector.addRule(`.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-top:before, + .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-bottom:before, + .monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused:before, + .monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused:after { + border-color: ${focusedCellBorderColor} !important; + }`); + + const focusedEditorBorderColorColor = theme.getColor(focusedEditorBorderColor); + if (focusedEditorBorderColorColor) { + collector.addRule(`.notebookOverlay .monaco-list-row.cell-editor-focus .cell-editor-part:before { outline: solid 1px ${focusedEditorBorderColorColor}; }`); } const editorBorderColor = theme.getColor(notebookCellBorder); @@ -1396,23 +1524,55 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-language-picker:hover { background-color: ${cellStatusBarHoverBg}; }`); } - // const widgetShadowColor = theme.getColor(widgetShadow); - // if (widgetShadowColor) { - // collector.addRule(`.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar { - // box-shadow: 0 0 8px 4px ${widgetShadowColor} - // }`) - // } + const cellShadowColor = theme.getColor(focusedCellShadow); + if (cellShadowColor) { + // Code cells + collector.addRule(`.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-shadow { box-shadow: 0px 0px 4px 2px ${cellShadowColor} }`); + + // Markdown cells + collector.addRule(`.monaco-workbench .notebookOverlay .monaco-list .markdown-cell-row.focused { box-shadow: 0px 0px 4px 2px ${cellShadowColor} }`); + } + + const cellInsertionIndicatorColor = theme.getColor(cellInsertionIndicator); + if (cellInsertionIndicatorColor) { + collector.addRule(`.notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { background-color: ${cellInsertionIndicatorColor}; }`); + } + + const scrollbarSliderBackgroundColor = theme.getColor(listScrollbarSliderBackground); + if (scrollbarSliderBackgroundColor) { + collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider { background: ${editorBackgroundColor}; } `); + collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider:before { content: ""; width: 100%; height: 100%; position: absolute; background: ${scrollbarSliderBackgroundColor}; } `); /* hack to not have cells see through scroller */ + } + + const scrollbarSliderHoverBackgroundColor = theme.getColor(listScrollbarSliderHoverBackground); + if (scrollbarSliderHoverBackgroundColor) { + collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider:hover { background: ${editorBackgroundColor}; } `); + collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider:hover:before { content: ""; width: 100%; height: 100%; position: absolute; background: ${scrollbarSliderHoverBackgroundColor}; } `); /* hack to not have cells see through scroller */ + } + + const scrollbarSliderActiveBackgroundColor = theme.getColor(listScrollbarSliderActiveBackground); + if (scrollbarSliderActiveBackgroundColor) { + collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider.active { background: ${editorBackgroundColor}; } `); + collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider.active:before { content: ""; width: 100%; height: 100%; position: absolute; background: ${scrollbarSliderActiveBackgroundColor}; } `); /* hack to not have cells see through scroller */ + } // Cell Margin - collector.addRule(`.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > div.cell { margin: 0px ${CELL_MARGIN}px 0px ${CELL_MARGIN}px; }`); + collector.addRule(`.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > div.cell { margin: 0px ${CELL_MARGIN * 2}px 0px ${CELL_MARGIN}px; }`); + collector.addRule(`.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > div.cell.code { margin-left: ${CODE_CELL_LEFT_MARGIN}px; }`); collector.addRule(`.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row { padding-top: ${EDITOR_TOP_MARGIN}px; }`); - collector.addRule(`.notebookOverlay .output { margin: 0px ${CELL_MARGIN}px 0px ${CELL_MARGIN + CELL_RUN_GUTTER}px }`); - collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container { width: calc(100% - ${CELL_MARGIN * 2 + CELL_RUN_GUTTER}px); margin: 0px ${CELL_MARGIN}px 0px ${CELL_MARGIN + CELL_RUN_GUTTER}px }`); + collector.addRule(`.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .markdown-cell-row { padding-bottom: ${CELL_BOTTOM_MARGIN}px; }`); + collector.addRule(`.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .markdown-cell-row .cell-bottom-toolbar-container { margin-top: ${CELL_BOTTOM_MARGIN}px; }`); + collector.addRule(`.notebookOverlay .output { margin: 0px ${CELL_MARGIN}px 0px ${CODE_CELL_LEFT_MARGIN + CELL_RUN_GUTTER}px; }`); + collector.addRule(`.notebookOverlay .output { width: calc(100% - ${CODE_CELL_LEFT_MARGIN + CELL_RUN_GUTTER + (CELL_MARGIN * 2)}px); }`); + collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container { width: calc(100% - ${CELL_MARGIN * 2 + CELL_RUN_GUTTER}px); margin: 0px ${CELL_MARGIN * 2}px 0px ${CELL_MARGIN + CELL_RUN_GUTTER}px; }`); - collector.addRule(`.notebookOverlay .markdown-cell-row .cell .cell-editor-part { margin-left: ${CELL_RUN_GUTTER}px; }`); collector.addRule(`.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > div.cell.markdown { padding-left: ${CELL_RUN_GUTTER}px; }`); collector.addRule(`.notebookOverlay .cell .run-button-container { width: ${CELL_RUN_GUTTER}px; }`); - collector.addRule(`.notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { left: ${CELL_MARGIN + CELL_RUN_GUTTER}px; right: ${CELL_MARGIN}px; }`); collector.addRule(`.notebookOverlay .cell-drag-image .cell-editor-container > div { padding: ${EDITOR_TOP_PADDING}px 16px ${EDITOR_BOTTOM_PADDING}px 16px; }`); - collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator { left: ${CELL_MARGIN}px; bottom: ${BOTTOM_CELL_TOOLBAR_HEIGHT}px; }`); + collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-top { height: ${EDITOR_TOP_MARGIN}px; }`); + collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-side { bottom: ${BOTTOM_CELL_TOOLBAR_HEIGHT}px; }`); + collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator { width: ${CODE_CELL_LEFT_MARGIN + CELL_RUN_GUTTER}px; }`); + collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator.cell-focus-indicator-right { width: ${CELL_MARGIN * 2}px; }`); + collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-bottom { height: ${CELL_BOTTOM_MARGIN}px; }`); + collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .cell-shadow-container-bottom { top: ${CELL_BOTTOM_MARGIN}px; }`); }); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidgetService.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidgetService.ts new file mode 100644 index 00000000000..2369eee6a02 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidgetService.ts @@ -0,0 +1,159 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ResourceMap } from 'vs/base/common/map'; +import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; +import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { IEditorGroupsService, IEditorGroup, GroupChangeKind, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IInstantiationService, createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; + +export const INotebookEditorWidgetService = createDecorator('INotebookEditorWidgetService'); + +export interface IBorrowValue { + readonly value: T | undefined; +} + +export interface INotebookEditorWidgetService { + _serviceBrand: undefined; + retrieveWidget(accessor: ServicesAccessor, group: IEditorGroup, input: NotebookEditorInput): IBorrowValue; +} + +class NotebookEditorWidgetService implements INotebookEditorWidgetService { + + readonly _serviceBrand: undefined; + + private _tokenPool = 1; + + private readonly _notebookWidgets = new Map>(); + private readonly _disposables = new DisposableStore(); + + constructor( + @IEditorGroupsService editorGroupService: IEditorGroupsService, + @IEditorService editorService: IEditorService, + ) { + + const groupListener = new Map(); + const onNewGroup = (group: IEditorGroup) => { + const { id } = group; + const listener = group.onDidGroupChange(e => { + const widgets = this._notebookWidgets.get(group.id); + if (!widgets || e.kind !== GroupChangeKind.EDITOR_CLOSE || !(e.editor instanceof NotebookEditorInput)) { + return; + } + const value = widgets.get(e.editor.resource); + if (!value) { + return; + } + value.token = undefined; + this._disposeWidget(value.widget); + widgets.delete(e.editor.resource); + }); + groupListener.set(id, listener); + }; + this._disposables.add(editorGroupService.onDidAddGroup(onNewGroup)); + editorGroupService.groups.forEach(onNewGroup); + + // group removed -> clean up listeners, clean up widgets + this._disposables.add(editorGroupService.onDidRemoveGroup(group => { + const listener = groupListener.get(group.id); + if (listener) { + listener.dispose(); + groupListener.delete(group.id); + } + const widgets = this._notebookWidgets.get(group.id); + this._notebookWidgets.delete(group.id); + if (widgets) { + for (let value of widgets.values()) { + value.token = undefined; + this._disposeWidget(value.widget); + } + } + })); + + // HACK + // we use the open override to spy on tab movements because that's the only + // way to do that... + this._disposables.add(editorService.overrideOpenEditor({ + open: (input, _options, group, context) => { + if (input instanceof NotebookEditorInput && context === OpenEditorContext.MOVE_EDITOR) { + // when moving a notebook editor we release it from its current tab and we + // "place" it into its future slot so that the editor can pick it up from there + this._freeWidget(input, editorGroupService.activeGroup, group); + } + return undefined; + } + })); + } + + private _disposeWidget(widget: NotebookEditorWidget): void { + widget.onWillHide(); + const domNode = widget.getDomNode(); + widget.dispose(); + domNode.remove(); + } + + private _freeWidget(input: NotebookEditorInput, source: IEditorGroup, target: IEditorGroup): void { + const targetWidget = this._notebookWidgets.get(target.id)?.get(input.resource); + if (targetWidget) { + // not needed + return; + } + + const widget = this._notebookWidgets.get(source.id)?.get(input.resource); + if (!widget) { + throw new Error('no widget at source group'); + } + this._notebookWidgets.get(source.id)?.delete(input.resource); + widget.token = undefined; + + let targetMap = this._notebookWidgets.get(target.id); + if (!targetMap) { + targetMap = new ResourceMap(); + this._notebookWidgets.set(target.id, targetMap); + } + targetMap.set(input.resource, widget); + } + + retrieveWidget(accessor: ServicesAccessor, group: IEditorGroup, input: NotebookEditorInput): IBorrowValue { + + let value = this._notebookWidgets.get(group.id)?.get(input.resource); + + if (!value) { + // NEW widget + const instantiationService = accessor.get(IInstantiationService); + const widget = instantiationService.createInstance(NotebookEditorWidget); + widget.createEditor(); + const token = this._tokenPool++; + value = { widget, token }; + + let map = this._notebookWidgets.get(group.id); + if (!map) { + map = new ResourceMap(); + this._notebookWidgets.set(group.id, map); + } + map.set(input.resource, value); + + } else { + // reuse a widget which was either free'ed before or which + // is simply being reused... + value.token = this._tokenPool++; + } + + return this._createBorrowValue(value.token!, value); + } + + private _createBorrowValue(myToken: number, widget: { widget: NotebookEditorWidget, token: number | undefined }): IBorrowValue { + return { + get value() { + return widget.token === myToken ? widget.widget : undefined; + } + }; + } +} + +registerSingleton(INotebookEditorWidgetService, NotebookEditorWidgetService, true); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookRegistry.ts b/src/vs/workbench/contrib/notebook/browser/notebookRegistry.ts index 9af645bc91d..abf2220cc6c 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookRegistry.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookRegistry.ts @@ -6,8 +6,6 @@ import { CellOutputKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { BrandedService, IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; import { INotebookEditor, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput'; -import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; export type IOutputTransformCtor = IConstructorSignature1; @@ -17,56 +15,16 @@ export interface IOutputTransformDescription { ctor: IOutputTransformCtor; } -export namespace NotebookRegistry { - export function getOutputTransformContributions(): IOutputTransformDescription[] { - return NotebookRegistryImpl.INSTANCE.getNotebookOutputTransform(); - } - export function claimNotebookEditorWidget(editorInput: NotebookEditorInput, widget: NotebookEditorWidget) { - NotebookRegistryImpl.INSTANCE.claimNotebookEditorWidget(editorInput, widget); - } +export const NotebookRegistry = new class NotebookRegistryImpl { - export function releaseNotebookEditorWidget(editorInput: NotebookEditorInput) { - NotebookRegistryImpl.INSTANCE.releaseNotebookEditorWidget(editorInput); - } - - export function getNotebookEditorWidget(editorInput: NotebookEditorInput): NotebookEditorWidget | undefined { - return NotebookRegistryImpl.INSTANCE.getNotebookEditorWidget(editorInput); - } -} - -export function registerOutputTransform(id: string, kind: CellOutputKind, ctor: { new(editor: INotebookEditor, ...services: Services): IOutputTransformContribution }): void { - NotebookRegistryImpl.INSTANCE.registerOutputTransform(id, kind, ctor); -} - -class NotebookRegistryImpl { - - static readonly INSTANCE = new NotebookRegistryImpl(); - - private readonly outputTransforms: IOutputTransformDescription[]; - private readonly notebookEditorWidgetOwnership = new Map(); - - constructor() { - this.outputTransforms = []; - } + readonly outputTransforms: IOutputTransformDescription[] = []; registerOutputTransform(id: string, kind: CellOutputKind, ctor: { new(editor: INotebookEditor, ...services: Services): IOutputTransformContribution }): void { this.outputTransforms.push({ id: id, kind: kind, ctor: ctor as IOutputTransformCtor }); } - getNotebookOutputTransform(): IOutputTransformDescription[] { + getOutputTransformContributions(): IOutputTransformDescription[] { return this.outputTransforms.slice(0); } - - claimNotebookEditorWidget(editorInput: NotebookEditorInput, widget: NotebookEditorWidget) { - this.notebookEditorWidgetOwnership.set(editorInput, widget); - } - - releaseNotebookEditorWidget(editorInput: NotebookEditorInput) { - this.notebookEditorWidgetOwnership.delete(editorInput); - } - - getNotebookEditorWidget(editorInput: NotebookEditorInput) { - return this.notebookEditorWidgetOwnership.get(editorInput); - } -} +}; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts index a0e2f7a2fdb..4a10bb16f0a 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts @@ -5,7 +5,6 @@ import * as nls from 'vs/nls'; import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { URI, UriComponents } from 'vs/base/common/uri'; import { notebookProviderExtensionPoint, notebookRendererExtensionPoint, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/extensionPoint'; import { NotebookProviderInfo, NotebookEditorDescriptor } from 'vs/workbench/contrib/notebook/common/notebookProvider'; @@ -19,7 +18,6 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorService, ICustomEditorViewTypesHandler, ICustomEditorInfo } from 'vs/workbench/services/editor/common/editorService'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; -import { NotebookEditorModelManager } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; import { INotebookService, IMainNotebookController } from 'vs/workbench/contrib/notebook/common/notebookService'; import * as glob from 'vs/base/common/glob'; import { basename } from 'vs/base/common/path'; @@ -29,26 +27,44 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { Memento } from 'vs/workbench/common/memento'; import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; import { IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { generateUuid } from 'vs/base/common/uuid'; function MODEL_ID(resource: URI): string { return resource.toString(); } -export class NotebookProviderInfoStore implements IDisposable { +export class NotebookProviderInfoStore extends Disposable { private static readonly CUSTOM_EDITORS_STORAGE_ID = 'notebookEditors'; private static readonly CUSTOM_EDITORS_ENTRY_ID = 'editors'; private readonly _memento: Memento; - constructor(storageService: IStorageService) { + private _handled: boolean = false; + constructor( + storageService: IStorageService, + extensionService: IExtensionService + + ) { + super(); this._memento = new Memento(NotebookProviderInfoStore.CUSTOM_EDITORS_STORAGE_ID, storageService); const mementoObject = this._memento.getMemento(StorageScope.GLOBAL); for (const info of (mementoObject[NotebookProviderInfoStore.CUSTOM_EDITORS_ENTRY_ID] || []) as NotebookEditorDescriptor[]) { this.add(new NotebookProviderInfo(info)); } + + this._register(extensionService.onDidRegisterExtensions(() => { + if (!this._handled) { + // there is no extension point registered for notebook content provider + // clear the memento and cache + this.clear(); + mementoObject[NotebookProviderInfoStore.CUSTOM_EDITORS_ENTRY_ID] = []; + this._memento.saveMemento(); + } + })); } - update(extensions: readonly IExtensionPointUser[]) { + setupHandler(extensions: readonly IExtensionPointUser[]) { + this._handled = true; this.clear(); for (const extension of extensions) { @@ -57,7 +73,7 @@ export class NotebookProviderInfoStore implements IDisposable { id: notebookContribution.viewType, displayName: notebookContribution.displayName, selector: notebookContribution.selector || [], - priority: this.convertPriority(notebookContribution.priority), + priority: this._convertPriority(notebookContribution.priority), providerDisplayName: extension.description.isBuiltin ? nls.localize('builtinProviderDisplayName', "Built-in") : extension.description.displayName || extension.description.identifier.value, providerExtensionLocation: extension.description.extensionLocation })); @@ -65,11 +81,11 @@ export class NotebookProviderInfoStore implements IDisposable { } const mementoObject = this._memento.getMemento(StorageScope.GLOBAL); - mementoObject[NotebookProviderInfoStore.CUSTOM_EDITORS_ENTRY_ID] = Array.from(this.contributedEditors.values()); + mementoObject[NotebookProviderInfoStore.CUSTOM_EDITORS_ENTRY_ID] = Array.from(this._contributedEditors.values()); this._memento.saveMemento(); } - private convertPriority(priority?: string) { + private _convertPriority(priority?: string) { if (!priority) { return NotebookEditorPriority.default; } @@ -82,32 +98,29 @@ export class NotebookProviderInfoStore implements IDisposable { } - dispose(): void { - } - - private readonly contributedEditors = new Map(); + private readonly _contributedEditors = new Map(); clear() { - this.contributedEditors.clear(); + this._contributedEditors.clear(); } get(viewType: string): NotebookProviderInfo | undefined { - return this.contributedEditors.get(viewType); + return this._contributedEditors.get(viewType); } add(info: NotebookProviderInfo): void { - if (this.contributedEditors.has(info.id)) { + if (this._contributedEditors.has(info.id)) { return; } - this.contributedEditors.set(info.id, info); + this._contributedEditors.set(info.id, info); } getContributedNotebook(resource: URI): readonly NotebookProviderInfo[] { - return [...Iterable.filter(this.contributedEditors.values(), customEditor => customEditor.matches(resource))]; + return [...Iterable.filter(this._contributedEditors.values(), customEditor => resource.scheme === 'untitled' || customEditor.matches(resource))]; } public [Symbol.iterator](): Iterator { - return this.contributedEditors.values(); + return this._contributedEditors.values(); } } @@ -178,28 +191,22 @@ export class NotebookService extends Disposable implements INotebookService, ICu onDidChangeKernels: Event = this._onDidChangeKernels.event; private cutItems: NotebookCellTextModel[] | undefined; - modelManager: NotebookEditorModelManager; private _displayOrder: { userOrder: string[], defaultOrder: string[] } = Object.create(null); constructor( - @IExtensionService private readonly extensionService: IExtensionService, - @IEditorService private readonly editorService: IEditorService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IAccessibilityService private readonly accessibilityService: IAccessibilityService, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IStorageService private readonly storageService: IStorageService + @IExtensionService private readonly _extensionService: IExtensionService, + @IEditorService private readonly _editorService: IEditorService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IAccessibilityService private readonly _accessibilityService: IAccessibilityService, + @IStorageService private readonly _storageService: IStorageService ) { super(); - this.modelManager = this.instantiationService.createInstance(NotebookEditorModelManager); - this._register(this.modelManager); - this.notebookProviderInfoStore = new NotebookProviderInfoStore(this.storageService); + this.notebookProviderInfoStore = new NotebookProviderInfoStore(this._storageService, this._extensionService); this._register(this.notebookProviderInfoStore); notebookProviderExtensionPoint.setHandler((extensions) => { - this.notebookProviderInfoStore.update(extensions); - - // console.log(this._notebookProviderInfoStore); + this.notebookProviderInfoStore.setupHandler(extensions); }); notebookRendererExtensionPoint.setHandler((renderers) => { @@ -218,25 +225,25 @@ export class NotebookService extends Disposable implements INotebookService, ICu // console.log(this.notebookRenderersInfoStore); }); - this.editorService.registerCustomEditorViewTypesHandler('Notebook', this); + this._editorService.registerCustomEditorViewTypesHandler('Notebook', this); const updateOrder = () => { - let userOrder = this.configurationService.getValue('notebook.displayOrder'); + let userOrder = this._configurationService.getValue('notebook.displayOrder'); this._displayOrder = { - defaultOrder: this.accessibilityService.isScreenReaderOptimized() ? ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER : NOTEBOOK_DISPLAY_ORDER, + defaultOrder: this._accessibilityService.isScreenReaderOptimized() ? ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER : NOTEBOOK_DISPLAY_ORDER, userOrder: userOrder }; }; updateOrder(); - this._register(this.configurationService.onDidChangeConfiguration(e => { + this._register(this._configurationService.onDidChangeConfiguration(e => { if (e.affectedKeys.indexOf('notebook.displayOrder') >= 0) { updateOrder(); } })); - this._register(this.accessibilityService.onDidChangeScreenReaderOptimized(() => { + this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(() => { updateOrder(); })); } @@ -251,11 +258,11 @@ export class NotebookService extends Disposable implements INotebookService, ICu async canResolve(viewType: string): Promise { if (!this._notebookProviders.has(viewType)) { - await this.extensionService.whenInstalledExtensionsRegistered(); + await this._extensionService.whenInstalledExtensionsRegistered(); // notebook providers/kernels/renderers might use `*` as activation event. - await this.extensionService.activateByEvent(`*`); + await this._extensionService.activateByEvent(`*`); // this awaits full activation of all matching extensions - await this.extensionService.activateByEvent(`onNotebookEditor:${viewType}`); + await this._extensionService.activateByEvent(`onNotebookEditor:${viewType}`); } return this._notebookProviders.has(viewType); } @@ -359,13 +366,13 @@ export class NotebookService extends Disposable implements INotebookService, ICu return modelData.model; } - async resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string): Promise { + async resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string, backupId?: string): Promise { const provider = this._notebookProviders.get(viewType); if (!provider) { return undefined; } - const notebookModel = await provider.controller.createNotebook(viewType, uri, undefined, forceReload, editorId); + const notebookModel = await provider.controller.createNotebook(viewType, uri, undefined, forceReload, editorId, backupId); if (!notebookModel) { return undefined; } @@ -381,6 +388,11 @@ export class NotebookService extends Disposable implements INotebookService, ICu this._onNotebookDocumentAdd.fire([notebookModel!.uri]); // after the document is added to the store and sent to ext host, we transform the ouputs await this.transformTextModelOutputs(notebookModel!); + + if (editorId) { + await provider.controller.resolveNotebookEditor(viewType, uri, editorId); + } + return modelData.model; } @@ -435,14 +447,14 @@ export class NotebookService extends Disposable implements INotebookService, ICu outputs.forEach((output, index) => { if (output.outputKind === CellOutputKind.Rich) { // TODO no string[] casting - const ret = this._transformMimeTypes(output, textModel.metadata.displayOrder as string[] || []); + const ret = this._transformMimeTypes(output, output.outputId, textModel.metadata.displayOrder as string[] || []); const orderedMimeTypes = ret.orderedMimeTypes!; const pickedMimeTypeIndex = ret.pickedMimeTypeIndex!; output.pickedMimeTypeIndex = pickedMimeTypeIndex; output.orderedMimeTypes = orderedMimeTypes; if (orderedMimeTypes[pickedMimeTypeIndex!].rendererId && orderedMimeTypes[pickedMimeTypeIndex].rendererId !== BUILTIN_RENDERER_ID) { - outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType }); + outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, outputId: output.outputId }); renderers.add(orderedMimeTypes[pickedMimeTypeIndex].rendererId!); } } @@ -469,14 +481,14 @@ export class NotebookService extends Disposable implements INotebookService, ICu const outputRequest: IOutputRenderRequestOutputInfo[] = []; outputs.map((output, index) => { if (output.outputKind === CellOutputKind.Rich) { - const ret = this._transformMimeTypes(output, textModel.metadata.displayOrder as string[] || []); + const ret = this._transformMimeTypes(output, output.outputId, textModel.metadata.displayOrder as string[] || []); const orderedMimeTypes = ret.orderedMimeTypes!; const pickedMimeTypeIndex = ret.pickedMimeTypeIndex!; output.pickedMimeTypeIndex = pickedMimeTypeIndex; output.orderedMimeTypes = orderedMimeTypes; if (orderedMimeTypes[pickedMimeTypeIndex!].rendererId && orderedMimeTypes[pickedMimeTypeIndex].rendererId !== BUILTIN_RENDERER_ID) { - outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, output: output }); + outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, output: output, outputId: output.outputId }); renderers.add(orderedMimeTypes[pickedMimeTypeIndex].rendererId!); } } @@ -505,14 +517,14 @@ export class NotebookService extends Disposable implements INotebookService, ICu const outputRequest: IOutputRenderRequestOutputInfo[] = []; outputs.map((output, index) => { if (output.outputKind === CellOutputKind.Rich) { - const ret = this._transformMimeTypes(output, textModel.metadata.displayOrder as string[] || []); + const ret = this._transformMimeTypes(output, output.outputId, textModel.metadata.displayOrder as string[] || []); const orderedMimeTypes = ret.orderedMimeTypes!; const pickedMimeTypeIndex = ret.pickedMimeTypeIndex!; output.pickedMimeTypeIndex = pickedMimeTypeIndex; output.orderedMimeTypes = orderedMimeTypes; if (orderedMimeTypes[pickedMimeTypeIndex!].rendererId && orderedMimeTypes[pickedMimeTypeIndex].rendererId !== BUILTIN_RENDERER_ID) { - outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, output: output }); + outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, output: output, outputId: output.outputId }); renderers.add(orderedMimeTypes[pickedMimeTypeIndex].rendererId!); } } @@ -536,6 +548,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu outputs: [ { index: 0, + outputId: generateUuid(), handlerId: rendererId, mimeType: mimeType, output: output @@ -560,7 +573,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu return; } - private _transformMimeTypes(output: IDisplayOutput, documentDisplayOrder: string[]): ITransformedDisplayOutputDto { + private _transformMimeTypes(output: IDisplayOutput, outputId: string, documentDisplayOrder: string[]): ITransformedDisplayOutputDto { let mimeTypes = Object.keys(output.data); let coreDisplayOrder = this._displayOrder; const sorted = sortMimeTypes(mimeTypes, coreDisplayOrder?.userOrder || [], documentDisplayOrder, coreDisplayOrder?.defaultOrder || []); @@ -605,6 +618,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu return { outputKind: output.outputKind, + outputId, data: output.data, orderedMimeTypes: orderMimeTypes, pickedMimeTypeIndex: 0 @@ -681,13 +695,17 @@ export class NotebookService extends Disposable implements INotebookService, ICu this._onNotebookEditorAdd.fire(editor); } + getNotebookEditor(editorId: string) { + return this._notebookEditors.get(editorId); + } + listNotebookEditors(): INotebookEditor[] { return [...this._notebookEditors].map(e => e[1]); } listVisibleNotebookEditors(): INotebookEditor[] { - return this.editorService.visibleEditorPanes - .filter(pane => (pane as any).isNotebookEditor) + return this._editorService.visibleEditorPanes + .filter(pane => (pane as unknown as { isNotebookEditor?: boolean }).isNotebookEditor) .map(pane => pane.getControl() as INotebookEditor) .filter(editor => !!editor) .filter(editor => this._notebookEditors.has(editor.getId())); @@ -738,11 +756,21 @@ export class NotebookService extends Disposable implements INotebookService, ICu return false; } - onDidReceiveMessage(viewType: string, editorId: string, message: any): void { + async backup(viewType: string, uri: URI, token: CancellationToken): Promise { let provider = this._notebookProviders.get(viewType); if (provider) { - return provider.controller.onDidReceiveMessage(editorId, message); + return provider.controller.backup(uri, token); + } + + return; + } + + onDidReceiveMessage(viewType: string, editorId: string, rendererType: string | undefined, message: any): void { + let provider = this._notebookProviders.get(viewType); + + if (provider) { + return provider.controller.onDidReceiveMessage(editorId, rendererType, message); } } diff --git a/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts b/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts index 0820f6f2e56..3dc707837f8 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts @@ -6,7 +6,7 @@ import * as DOM from 'vs/base/browser/dom'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { IListRenderer, IListVirtualDelegate, ListError } from 'vs/base/browser/ui/list/list'; -import { IListStyles, IStyleController, MouseController, IListOptions } from 'vs/base/browser/ui/list/listWidget'; +import { IListStyles, IStyleController } from 'vs/base/browser/ui/list/listWidget'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { isMacintosh } from 'vs/base/common/platform'; @@ -19,7 +19,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IListService, IWorkbenchListOptions, WorkbenchList } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { CellRevealPosition, CellRevealType, CursorAtBoundary, getVisibleCells, ICellRange, ICellViewModel, INotebookCellList, reduceCellRanges, CellEditState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellRevealPosition, CellRevealType, CursorAtBoundary, getVisibleCells, ICellRange, ICellViewModel, INotebookCellList, reduceCellRanges, CellEditState, CellFocusMode, BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { diff, IProcessedOutput, NOTEBOOK_EDITOR_CURSOR_BOUNDARY, CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { clamp } from 'vs/base/common/numbers'; @@ -45,11 +45,17 @@ export class NotebookCellList extends WorkbenchList implements ID private _hiddenRangeIds: string[] = []; private hiddenRangesPrefixSum: PrefixSumComputer | null = null; + private _isDisposed = false; + + get isDisposed() { + return this._isDisposed; + } + constructor( private listUser: string, container: HTMLElement, delegate: IListVirtualDelegate, - renderers: IListRenderer[], + renderers: IListRenderer[], contextKeyService: IContextKeyService, options: IWorkbenchListOptions, @IListService listService: IListService, @@ -124,6 +130,13 @@ export class NotebookCellList extends WorkbenchList implements ID notebookEditorCursorAtBoundaryContext.set('none'); })); + this._localDisposableStore.add(this.view.onMouseDblClick(() => { + const focus = this.getFocusedElements()[0]; + if (focus && focus.cellKind === CellKind.Markdown) { + focus.editState = CellEditState.Editing; + focus.focusMode = CellFocusMode.Editor; + } + })); } elementAt(position: number): ICellViewModel | undefined { @@ -146,10 +159,6 @@ export class NotebookCellList extends WorkbenchList implements ID return this.view.elementHeight(index); } - protected createMouseController(_options: IListOptions): MouseController { - return new NotebookMouseController(this); - } - detachViewModel() { this._viewModelStore.clear(); this._viewModel = null; @@ -159,6 +168,10 @@ export class NotebookCellList extends WorkbenchList implements ID attachViewModel(model: NotebookViewModel) { this._viewModel = model; this._viewModelStore.add(model.onDidChangeViewCells((e) => { + if (this._isDisposed) { + return; + } + const currentRanges = this._hiddenRangeIds.map(id => this._viewModel!.getTrackedRange(id)).filter(range => range !== null) as ICellRange[]; const newVisibleViewCells: CellViewModel[] = getVisibleCells(this._viewModel!.viewCells as CellViewModel[], currentRanges); @@ -194,7 +207,11 @@ export class NotebookCellList extends WorkbenchList implements ID deletedOutputs.forEach(output => this._onDidRemoveOutput.fire(output)); }); } else { - DOM.scheduleAtNextAnimationFrame(() => { + this._viewModelStore.add(DOM.scheduleAtNextAnimationFrame(() => { + if (this._isDisposed) { + return; + } + viewDiffs.reverse().forEach((diff) => { const hideOutputs: IProcessedOutput[] = []; const deletedOutputs: IProcessedOutput[] = []; @@ -213,7 +230,7 @@ export class NotebookCellList extends WorkbenchList implements ID hideOutputs.forEach(output => this._onDidHideOutput.fire(output)); deletedOutputs.forEach(output => this._onDidRemoveOutput.fire(output)); }); - }); + })); } })); @@ -370,7 +387,7 @@ export class NotebookCellList extends WorkbenchList implements ID } - private _getViewIndexUpperBound(cell: ICellViewModel) { + private _getViewIndexUpperBound(cell: ICellViewModel): number { const modelIndex = this._viewModel!.getCellIndex(cell); if (!this.hiddenRangesPrefixSum) { return modelIndex; @@ -384,7 +401,7 @@ export class NotebookCellList extends WorkbenchList implements ID focusElement(cell: ICellViewModel) { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { this.setFocus([index]); } } @@ -395,7 +412,7 @@ export class NotebookCellList extends WorkbenchList implements ID } const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { this.setSelection([index]); this.setFocus([index]); } @@ -416,7 +433,7 @@ export class NotebookCellList extends WorkbenchList implements ID revealElementInView(cell: ICellViewModel) { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { this._revealInView(index); } } @@ -424,7 +441,7 @@ export class NotebookCellList extends WorkbenchList implements ID revealElementInCenterIfOutsideViewport(cell: ICellViewModel) { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { this._revealInCenterIfOutsideViewport(index); } } @@ -432,7 +449,7 @@ export class NotebookCellList extends WorkbenchList implements ID revealElementInCenter(cell: ICellViewModel) { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { this._revealInCenter(index); } } @@ -440,7 +457,7 @@ export class NotebookCellList extends WorkbenchList implements ID async revealElementLineInViewAsync(cell: ICellViewModel, line: number): Promise { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { return this._revealLineInViewAsync(index, line); } } @@ -448,7 +465,7 @@ export class NotebookCellList extends WorkbenchList implements ID async revealElementLineInCenterAsync(cell: ICellViewModel, line: number): Promise { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { return this._revealLineInCenterAsync(index, line); } } @@ -456,7 +473,7 @@ export class NotebookCellList extends WorkbenchList implements ID async revealElementLineInCenterIfOutsideViewportAsync(cell: ICellViewModel, line: number): Promise { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { return this._revealLineInCenterIfOutsideViewportAsync(index, line); } } @@ -464,7 +481,7 @@ export class NotebookCellList extends WorkbenchList implements ID async revealElementRangeInViewAsync(cell: ICellViewModel, range: Range): Promise { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { return this._revealRangeInView(index, range); } } @@ -472,7 +489,7 @@ export class NotebookCellList extends WorkbenchList implements ID async revealElementRangeInCenterAsync(cell: ICellViewModel, range: Range): Promise { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { return this._revealRangeInCenterAsync(index, range); } } @@ -480,14 +497,14 @@ export class NotebookCellList extends WorkbenchList implements ID async revealElementRangeInCenterIfOutsideViewportAsync(cell: ICellViewModel, range: Range): Promise { const index = this._getViewIndexUpperBound(cell); - if (index !== undefined) { + if (index >= 0) { return this._revealRangeInCenterIfOutsideViewportAsync(index, range); } } domElementOfElement(element: ICellViewModel): HTMLElement | null { const index = this._getViewIndexUpperBound(element); - if (index !== undefined) { + if (index >= 0) { return this.view.domElement(index); } @@ -515,7 +532,7 @@ export class NotebookCellList extends WorkbenchList implements ID updateElementHeight2(element: ICellViewModel, size: number): void { const index = this._getViewIndexUpperBound(element); - if (index === undefined) { + if (index === undefined || index < 0 || index >= this.length) { return; } @@ -525,7 +542,10 @@ export class NotebookCellList extends WorkbenchList implements ID // override domFocus() { - if (document.activeElement && this.view.domNode.contains(document.activeElement)) { + const focused = this.getFocusedElements()[0]; + const focusedDomElement = focused && this.domElementOfElement(focused); + + if (document.activeElement && focusedDomElement && focusedDomElement.contains(document.activeElement)) { // for example, when focus goes into monaco editor, if we refocus the list view, the editor will lose focus. return; } @@ -868,6 +888,7 @@ export class NotebookCellList extends WorkbenchList implements ID } dispose() { + this._isDisposed = true; this._viewModelStore.dispose(); this._localDisposableStore.dispose(); super.dispose(); @@ -883,13 +904,3 @@ function getEditorAttachedPromise(element: CellViewModel) { function isContextMenuFocused() { return !!DOM.findParentWithClass(document.activeElement, 'context-view'); } - - -class NotebookMouseController extends MouseController { - protected onDoubleClick(): void { - const focus = this.list.getFocusedElements()[0]; - if (focus && focus.cellKind === CellKind.Markdown) { - focus.editState = CellEditState.Editing; - } - } -} diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform.ts b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform.ts index cb02e31a669..fba5fe9f3e6 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IRenderOutput, CellOutputKind, IErrorOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { registerOutputTransform } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; +import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; import * as DOM from 'vs/base/browser/dom'; import { RGBA, Color } from 'vs/base/common/color'; import { ansiColorIdentifiers } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -45,7 +45,7 @@ class ErrorTransform implements IOutputTransformContribution { } } -registerOutputTransform('notebook.output.error', CellOutputKind.Error, ErrorTransform); +NotebookRegistry.registerOutputTransform('notebook.output.error', CellOutputKind.Error, ErrorTransform); /** * @param text The content to stylize. diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform.ts b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform.ts index 667ac683adb..423a2c5ec4c 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IRenderOutput, CellOutputKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { registerOutputTransform } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; +import { IRenderOutput, CellOutputKind, ITransformedDisplayOutputDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; import * as DOM from 'vs/base/browser/dom'; import { INotebookEditor, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { isArray } from 'vs/base/common/types'; @@ -20,7 +20,7 @@ import { handleANSIOutput } from 'vs/workbench/contrib/notebook/browser/view/out class RichRenderer implements IOutputTransformContribution { private _mdRenderer: MarkdownRenderer; - private _richMimeTypeRenderers = new Map IRenderOutput>(); + private _richMimeTypeRenderers = new Map IRenderOutput>(); constructor( public notebookEditor: INotebookEditor, @@ -36,12 +36,12 @@ class RichRenderer implements IOutputTransformContribution { this._richMimeTypeRenderers.set('image/svg+xml', this.renderSVG.bind(this)); this._richMimeTypeRenderers.set('text/markdown', this.renderMarkdown.bind(this)); this._richMimeTypeRenderers.set('image/png', this.renderPNG.bind(this)); - this._richMimeTypeRenderers.set('image/jpeg', this.renderJavaScript.bind(this)); + this._richMimeTypeRenderers.set('image/jpeg', this.renderJPEG.bind(this)); this._richMimeTypeRenderers.set('text/plain', this.renderPlainText.bind(this)); this._richMimeTypeRenderers.set('text/x-javascript', this.renderCode.bind(this)); } - render(output: any, container: HTMLElement, preferredMimeType: string | undefined): IRenderOutput { + render(output: ITransformedDisplayOutputDto, container: HTMLElement, preferredMimeType: string | undefined): IRenderOutput { if (!output.data) { const contentNode = document.createElement('p'); contentNode.innerText = `No data could be found for output.`; @@ -61,7 +61,12 @@ class RichRenderer implements IOutputTransformContribution { let mimeTypesMessage = mimeTypes.join(', '); - contentNode.innerText = `No renderer could be found for output. It has the following MIME types: ${mimeTypesMessage}`; + if (preferredMimeType) { + contentNode.innerText = `No renderer could be found for MIME type: ${preferredMimeType}`; + } else { + contentNode.innerText = `No renderer could be found for output. It has the following MIME types: ${mimeTypesMessage}`; + } + container.appendChild(contentNode); return { @@ -73,7 +78,7 @@ class RichRenderer implements IOutputTransformContribution { return renderer!(output, container); } - renderJSON(output: any, container: HTMLElement) { + renderJSON(output: ITransformedDisplayOutputDto, container: HTMLElement) { let data = output.data['application/json']; let str = JSON.stringify(data, null, '\t'); @@ -108,9 +113,9 @@ class RichRenderer implements IOutputTransformContribution { }; } - renderCode(output: any, container: HTMLElement) { + renderCode(output: ITransformedDisplayOutputDto, container: HTMLElement) { let data = output.data['text/x-javascript']; - let str = isArray(data) ? data.join('') : data; + let str = (isArray(data) ? data.join('') : data) as string; const editor = this.instantiationService.createInstance(CodeEditorWidget, container, { ...getOutputSimpleEditorOptions(), @@ -143,7 +148,7 @@ class RichRenderer implements IOutputTransformContribution { }; } - renderJavaScript(output: any, container: HTMLElement) { + renderJavaScript(output: ITransformedDisplayOutputDto, container: HTMLElement) { let data = output.data['application/javascript']; let str = isArray(data) ? data.join('') : data; let scriptVal = ``; @@ -153,9 +158,9 @@ class RichRenderer implements IOutputTransformContribution { }; } - renderHTML(output: any, container: HTMLElement) { + renderHTML(output: ITransformedDisplayOutputDto, container: HTMLElement) { let data = output.data['text/html']; - let str = isArray(data) ? data.join('') : data; + let str = (isArray(data) ? data.join('') : data) as string; return { shadowContent: str, hasDynamicHeight: false @@ -163,20 +168,20 @@ class RichRenderer implements IOutputTransformContribution { } - renderSVG(output: any, container: HTMLElement) { + renderSVG(output: ITransformedDisplayOutputDto, container: HTMLElement) { let data = output.data['image/svg+xml']; - let str = isArray(data) ? data.join('') : data; + let str = (isArray(data) ? data.join('') : data) as string; return { shadowContent: str, hasDynamicHeight: false }; } - renderMarkdown(output: any, container: HTMLElement) { + renderMarkdown(output: ITransformedDisplayOutputDto, container: HTMLElement) { let data = output.data['text/markdown']; - const str = isArray(data) ? data.join('') : data; + const str = (isArray(data) ? data.join('') : data) as string; const mdOutput = document.createElement('div'); - mdOutput.appendChild(this._mdRenderer.render({ value: str, isTrusted: false, supportThemeIcons: true }).element); + mdOutput.appendChild(this._mdRenderer.render({ value: str, isTrusted: true, supportThemeIcons: true }).element); container.appendChild(mdOutput); return { @@ -184,7 +189,7 @@ class RichRenderer implements IOutputTransformContribution { }; } - renderPNG(output: any, container: HTMLElement) { + renderPNG(output: ITransformedDisplayOutputDto, container: HTMLElement) { const image = document.createElement('img'); image.src = `data:image/png;base64,${output.data['image/png']}`; const display = document.createElement('div'); @@ -197,7 +202,7 @@ class RichRenderer implements IOutputTransformContribution { } - renderJPEG(output: any, container: HTMLElement) { + renderJPEG(output: ITransformedDisplayOutputDto, container: HTMLElement) { const image = document.createElement('img'); image.src = `data:image/jpeg;base64,${output.data['image/jpeg']}`; const display = document.createElement('div'); @@ -209,9 +214,9 @@ class RichRenderer implements IOutputTransformContribution { }; } - renderPlainText(output: any, container: HTMLElement) { + renderPlainText(output: ITransformedDisplayOutputDto, container: HTMLElement) { let data = output.data['text/plain']; - let str = isArray(data) ? data.join('') : data; + let str = (isArray(data) ? data.join('') : data) as string; const contentNode = DOM.$('.output-plaintext'); contentNode.appendChild(handleANSIOutput(str, this.themeService)); container.appendChild(contentNode); @@ -225,7 +230,7 @@ class RichRenderer implements IOutputTransformContribution { } } -registerOutputTransform('notebook.output.rich', CellOutputKind.Rich, RichRenderer); +NotebookRegistry.registerOutputTransform('notebook.output.rich', CellOutputKind.Rich, RichRenderer); export function getOutputSimpleEditorOptions(): IEditorOptions { diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts index 0a4d2a75b88..b3d7698c233 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts @@ -5,7 +5,7 @@ import * as DOM from 'vs/base/browser/dom'; import { IRenderOutput, CellOutputKind, IStreamOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { registerOutputTransform } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; +import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; import { INotebookEditor, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; class StreamRenderer implements IOutputTransformContribution { @@ -28,4 +28,4 @@ class StreamRenderer implements IOutputTransformContribution { } } -registerOutputTransform('notebook.output.stream', CellOutputKind.Text, StreamRenderer); +NotebookRegistry.registerOutputTransform('notebook.output.stream', CellOutputKind.Text, StreamRenderer); diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index dc0daa654c5..90df53c06b5 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -13,12 +13,12 @@ import { URI } from 'vs/base/common/uri'; import * as UUID from 'vs/base/common/uuid'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IOpenerService, matchesScheme } from 'vs/platform/opener/common/opener'; -import { CELL_MARGIN, CELL_RUN_GUTTER } from 'vs/workbench/contrib/notebook/browser/constants'; +import { CELL_MARGIN, CELL_RUN_GUTTER, CODE_CELL_LEFT_MARGIN, CELL_OUTPUT_PADDING } from 'vs/workbench/contrib/notebook/browser/constants'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { CellOutputKind, IProcessedOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; -import { IWebviewService, WebviewElement } from 'vs/workbench/contrib/webview/browser/webview'; +import { IWebviewService, WebviewElement, WebviewContentPurpose } from 'vs/workbench/contrib/webview/browser/webview'; import { asWebviewUri } from 'vs/workbench/contrib/webview/common/webviewUri'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { dirname, joinPath } from 'vs/base/common/resources'; @@ -76,7 +76,7 @@ export interface IBlurOutputMessage { } export interface IClickedDataUrlMessage { - __vscode_notebook_message: string; + __vscode_notebook_message: boolean; type: 'clicked-data-url'; data: string; downloadName?: string; @@ -86,18 +86,14 @@ export interface IClearMessage { type: 'clear'; } -export interface IFocusOutputMessage { - type: 'focus-output'; - id: string; -} - export interface ICreationRequestMessage { type: 'html'; content: string; - id: string; + cellId: string; outputId: string; top: number; left: number; + requiredPreloads: IPreloadResource[]; initiallyHidden?: boolean; apiNamespace?: string | undefined; } @@ -125,25 +121,28 @@ export interface IScrollRequestMessage { export interface IClearOutputRequestMessage { type: 'clearOutput'; - id: string; + cellId: string; + outputId: string; cellUri: string; apiNamespace: string | undefined; } export interface IHideOutputMessage { type: 'hideOutput'; - id: string; + outputId: string; + cellId: string; } export interface IShowOutputMessage { type: 'showOutput'; - id: string; + cellId: string; + outputId: string; top: number; } export interface IFocusOutputMessage { type: 'focus-output'; - id: string; + cellId: string; } export interface IPreloadResource { @@ -156,6 +155,13 @@ export interface IUpdatePreloadResourceMessage { source: 'renderer' | 'kernel'; } +export interface ICustomRendererMessage { + __vscode_notebook_message: boolean; + type: 'customRendererMessage'; + rendererId: string; + message: unknown; +} + export type FromWebviewMessage = | WebviewIntialized | IDimensionMessage @@ -163,7 +169,9 @@ export type FromWebviewMessage = | IMouseLeaveMessage | IWheelMessage | IScrollAckMessage - | IBlurOutputMessage; + | IBlurOutputMessage + | ICustomRendererMessage + | IClickedDataUrlMessage; export type ToWebviewMessage = | IClearMessage @@ -175,7 +183,8 @@ export type ToWebviewMessage = | IHideOutputMessage | IShowOutputMessage | IUpdatePreloadResourceMessage - | IFocusOutputMessage; + | IFocusOutputMessage + | ICustomRendererMessage; export type AnyMessage = FromWebviewMessage | ToWebviewMessage; @@ -194,7 +203,10 @@ function html(strings: TemplateStringsArray, ...values: any[]): string { return str; } -type IMessage = IDimensionMessage | IScrollAckMessage | IWheelMessage | IMouseEnterMessage | IMouseLeaveMessage | IBlurOutputMessage | WebviewIntialized | IClickedDataUrlMessage; +export interface INotebookWebviewMessage { + message: unknown; + forRenderer?: string; +} let version = 0; export class BackLayerWebView extends Disposable { @@ -207,8 +219,8 @@ export class BackLayerWebView extends Disposable { localResourceRootsCache: URI[] | undefined = undefined; rendererRootsCache: URI[] = []; kernelRootsCache: URI[] = []; - private readonly _onMessage = this._register(new Emitter()); - public readonly onMessage: Event = this._onMessage.event; + private readonly _onMessage = this._register(new Emitter()); + public readonly onMessage: Event = this._onMessage.event; private _loaded!: Promise; private _initalized?: Promise; private _disposed = false; @@ -230,10 +242,10 @@ export class BackLayerWebView extends Disposable { this.element = document.createElement('div'); - this.element.style.width = `calc(100% - ${CELL_MARGIN * 2 + CELL_RUN_GUTTER}px)`; + this.element.style.width = `calc(100% - ${CODE_CELL_LEFT_MARGIN + (CELL_MARGIN * 2) + CELL_RUN_GUTTER}px)`; this.element.style.height = '1400px'; this.element.style.position = 'absolute'; - this.element.style.margin = `0px 0 0px ${CELL_MARGIN + CELL_RUN_GUTTER}px`; + this.element.style.margin = `0px 0 0px ${CODE_CELL_LEFT_MARGIN + CELL_RUN_GUTTER}px`; } generateContent(outputNodePadding: number, coreDependencies: string, baseUrl: string) { return html` @@ -267,6 +279,15 @@ export class BackLayerWebView extends Disposable { `; } + postRendererMessage(rendererId: string, message: any) { + this._sendMessageToWebview({ + __vscode_notebook_message: true, + type: 'customRendererMessage', + message, + rendererId + }); + } + private resolveOutputId(id: string): { cell: CodeCellViewModel, output: IProcessedOutput } | undefined { const output = this.reversedInsetMapping.get(id); if (!output) { @@ -291,7 +312,7 @@ export class BackLayerWebView extends Disposable { if (!isWeb) { coreDependencies = ``; - const htmlContent = this.generateContent(8, coreDependencies, baseUrl.toString()); + const htmlContent = this.generateContent(CELL_OUTPUT_PADDING, coreDependencies, baseUrl.toString()); this.initialize(htmlContent); resolveFunc!(); } else { @@ -308,7 +329,7 @@ ${loaderJs} `; - const htmlContent = this.generateContent(8, coreDependencies, baseUrl.toString()); + const htmlContent = this.generateContent(CELL_OUTPUT_PADDING, coreDependencies, baseUrl.toString()); this.initialize(htmlContent); resolveFunc!(); }); @@ -318,11 +339,19 @@ ${loaderJs} } async initialize(content: string) { + if (!document.body.contains(this.element)) { + throw new Error('Element is already detached from the DOM tree'); + } + this.webview = this._createInset(this.webviewService, content); this.webview.mountTo(this.element); this._register(this.webview); this._register(this.webview.onDidClickLink(link => { + if (this._disposed) { + return; + } + if (!link) { return; } @@ -334,6 +363,10 @@ ${loaderJs} })); this._register(this.webview.onDidReload(() => { + if (this._disposed) { + return; + } + this.preloadsCache.clear(); for (const [output, inset] of this.insetMapping.entries()) { this.updateRendererPreloads(inset.preloads); @@ -341,7 +374,11 @@ ${loaderJs} } })); - this._register(this.webview.onMessage((data: IMessage) => { + this._register(this.webview.onMessage((data: FromWebviewMessage) => { + if (this._disposed) { + return; + } + if (data.__vscode_notebook_message) { if (data.type === 'dimension') { let height = data.data.height; @@ -397,11 +434,13 @@ ${loaderJs} } } else if (data.type === 'clicked-data-url') { this._onDidClickDataLink(data); + } else if (data.type === 'customRendererMessage') { + this._onMessage.fire({ message: data.message, forRenderer: data.rendererId }); } return; } - this._onMessage.fire(data); + this._onMessage.fire({ message: data }); })); } @@ -447,6 +486,7 @@ ${loaderJs} this.localResourceRootsCache = [...this.notebookService.getNotebookProviderResourceRoots(), ...workspaceFolders, rootPath]; const webview = webviewService.createWebviewElement(this.id, { + purpose: WebviewContentPurpose.NotebookRenderer, enableFindWidget: false, }, { allowMultipleAPIAcquire: true, @@ -459,7 +499,7 @@ ${loaderJs} resolveFunc = resolve; }); - let dispose = webview.onMessage((data: IMessage) => { + let dispose = webview.onMessage((data: FromWebviewMessage) => { if (data.__vscode_notebook_message && data.type === 'initialized') { resolveFunc(); dispose.dispose(); @@ -519,12 +559,12 @@ ${loaderJs} }); } - createInset(cell: CodeCellViewModel, output: IProcessedOutput, cellTop: number, offset: number, shadowContent: string, preloads: Set) { + async createInset(cell: CodeCellViewModel, output: IProcessedOutput, cellTop: number, offset: number, shadowContent: string, preloads: Set) { if (this._disposed) { return; } - this.updateRendererPreloads(preloads); + const requiredPreloads = await this.updateRendererPreloads(preloads); let initialTop = cellTop + offset; if (this.insetMapping.has(output)) { @@ -534,14 +574,15 @@ ${loaderJs} this.hiddenInsetMapping.delete(output); this._sendMessageToWebview({ type: 'showOutput', - id: outputCache.outputId, + cellId: outputCache.cell.id, + outputId: outputCache.outputId, top: initialTop }); return; } } - let outputId = UUID.generateUuid(); + let outputId = output.outputKind === CellOutputKind.Rich ? output.outputId : UUID.generateUuid(); let apiNamespace: string | undefined; if (output.outputKind === CellOutputKind.Rich && output.pickedMimeTypeIndex !== undefined) { const pickedMimeTypeRenderer = output.orderedMimeTypes?.[output.pickedMimeTypeIndex]; @@ -553,10 +594,11 @@ ${loaderJs} let message: ICreationRequestMessage = { type: 'html', content: shadowContent, - id: cell.id, + cellId: cell.id, apiNamespace, outputId: outputId, top: initialTop, + requiredPreloads, left: 0 }; @@ -582,7 +624,8 @@ ${loaderJs} type: 'clearOutput', apiNamespace: outputCache.cachedCreation.apiNamespace, cellUri: outputCache.cell.uri.toString(), - id: id + outputId: id, + cellId: outputCache.cell.id }); this.insetMapping.delete(output); this.reversedInsetMapping.delete(id); @@ -598,12 +641,12 @@ ${loaderJs} return; } - let id = outputCache.outputId; this.hiddenInsetMapping.add(output); this._sendMessageToWebview({ type: 'hideOutput', - id: id + outputId: outputCache.outputId, + cellId: outputCache.cell.id, }); } @@ -620,6 +663,14 @@ ${loaderJs} this.reversedInsetMapping = new Map(); } + focusWebview() { + if (this._disposed) { + return; + } + + this.webview.focus(); + } + focusOutput(cellId: string) { if (this._disposed) { return; @@ -629,7 +680,7 @@ ${loaderJs} setTimeout(() => { // Need this, or focus decoration is not shown. No clue. this._sendMessageToWebview({ type: 'focus-output', - id: cellId + cellId, }); }, 50); } @@ -666,11 +717,12 @@ ${loaderJs} async updateRendererPreloads(preloads: ReadonlySet) { if (this._disposed) { - return; + return []; } await this._loaded; + let requiredPreloads: IPreloadResource[] = []; let resources: IPreloadResource[] = []; let extensionLocations: URI[] = []; preloads.forEach(preload => { @@ -685,8 +737,11 @@ ${loaderJs} }); extensionLocations.push(rendererInfo.extensionLocation); preloadResources.forEach(e => { + const resource: IPreloadResource = { uri: e.toString() }; + requiredPreloads.push(resource); + if (!this.preloadsCache.has(e.toString())) { - resources.push({ uri: e.toString() }); + resources.push(resource); this.preloadsCache.set(e.toString(), true); } }); @@ -694,11 +749,12 @@ ${loaderJs} }); if (!resources.length) { - return; + return requiredPreloads; } this.rendererRootsCache = extensionLocations; this._updatePreloads(resources, 'renderer'); + return requiredPreloads; } private _updatePreloads(resources: IPreloadResource[], source: 'renderer' | 'kernel') { @@ -714,6 +770,10 @@ ${loaderJs} } private _sendMessageToWebview(message: ToWebviewMessage) { + if (this._disposed) { + return; + } + this.webview.postMessage(message); } @@ -723,6 +783,7 @@ ${loaderJs} dispose() { this._disposed = true; + this.webview.dispose(); super.dispose(); } } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys.ts index 8626aadcf6f..401d6e755f7 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys.ts @@ -9,7 +9,7 @@ import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewMod import { NOTEBOOK_CELL_TYPE, NOTEBOOK_VIEW_TYPE, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_RUNNABLE, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_RUN_STATE, NOTEBOOK_CELL_HAS_OUTPUTS, CellViewModelStateChangeEvent, CellEditState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { MarkdownCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; export class CellContextKeyManager extends Disposable { @@ -22,10 +22,12 @@ export class CellContextKeyManager extends Disposable { private markdownEditMode: IContextKey; + private elementDisposables = new DisposableStore(); + constructor( private readonly contextKeyService: IContextKeyService, private readonly notebookTextModel: INotebookTextModel, - private readonly element: BaseCellViewModel + private element: BaseCellViewModel ) { super(); @@ -37,16 +39,18 @@ export class CellContextKeyManager extends Disposable { this.cellRunState = NOTEBOOK_CELL_RUN_STATE.bindTo(this.contextKeyService); this.cellHasOutputs = NOTEBOOK_CELL_HAS_OUTPUTS.bindTo(this.contextKeyService); - this._register(element.onDidChangeState(e => this.onDidChangeState(e))); - - if (element instanceof CodeCellViewModel) { - this._register(element.onDidChangeOutputs(() => this.updateForOutputs())); - } - - this.initialize(); + this.updateForElement(element); } - private initialize() { + public updateForElement(element: BaseCellViewModel) { + this.elementDisposables.clear(); + this.elementDisposables.add(element.onDidChangeState(e => this.onDidChangeState(e))); + + if (element instanceof CodeCellViewModel) { + this.elementDisposables.add(element.onDidChangeOutputs(() => this.updateForOutputs())); + } + + this.element = element; if (this.element instanceof MarkdownCellViewModel) { this.cellType.set('markdown'); } else if (this.element instanceof CodeCellViewModel) { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts index 46f3e3a379e..c1ae59e9793 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -38,9 +38,9 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { BOTTOM_CELL_TOOLBAR_HEIGHT, EDITOR_BOTTOM_PADDING, EDITOR_TOOLBAR_HEIGHT, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING } from 'vs/workbench/contrib/notebook/browser/constants'; +import { BOTTOM_CELL_TOOLBAR_HEIGHT, EDITOR_BOTTOM_PADDING, EDITOR_TOOLBAR_HEIGHT, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING, CELL_BOTTOM_MARGIN } from 'vs/workbench/contrib/notebook/browser/constants'; import { CancelCellAction, ChangeCellLanguageAction, ExecuteCellAction, INotebookCellActionContext, CELL_TITLE_GROUP_ID } from 'vs/workbench/contrib/notebook/browser/contrib/coreActions'; -import { BaseCellRenderTemplate, CellEditState, CodeCellRenderTemplate, ICellViewModel, INotebookCellList, INotebookEditor, MarkdownCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { BaseCellRenderTemplate, CellEditState, CodeCellRenderTemplate, ICellViewModel, INotebookCellList, INotebookEditor, MarkdownCellRenderTemplate, isCodeCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellMenus } from 'vs/workbench/contrib/notebook/browser/view/renderers/cellMenus'; import { CodeCell } from 'vs/workbench/contrib/notebook/browser/view/renderers/codeCell'; import { StatefullMarkdownCell } from 'vs/workbench/contrib/notebook/browser/view/renderers/markdownCell'; @@ -53,17 +53,17 @@ import { CellContextKeyManager } from 'vs/workbench/contrib/notebook/browser/vie const $ = DOM.$; export class NotebookCellListDelegate implements IListVirtualDelegate { - private _lineHeight: number; + private readonly lineHeight: number; constructor( @IConfigurationService private readonly configurationService: IConfigurationService ) { const editorOptions = this.configurationService.getValue('editor'); - this._lineHeight = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel()).lineHeight; + this.lineHeight = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel()).lineHeight; } getHeight(element: CellViewModel): number { - return element.getHeight(this._lineHeight); + return element.getHeight(this.lineHeight); } hasDynamicHeight(element: CellViewModel): boolean { @@ -82,11 +82,11 @@ export class NotebookCellListDelegate implements IListVirtualDelegate(); readonly onDidChange: Event = this._onDidChange.event; constructor(configurationService: IConfigurationService, language: string) { - this._disposable = configurationService.onDidChangeConfiguration(e => { + this.disposable = configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('editor')) { this._value = computeEditorOptions(); this._onDidChange.fire(this.value); @@ -150,7 +150,7 @@ export class CellEditorOptions { dispose(): void { this._onDidChange.dispose(); - this._disposable.dispose(); + this.disposable.dispose(); } get value(): IEditorOptions { @@ -199,14 +199,13 @@ abstract class AbstractCellRenderer { }); toolbar.getContainer().style.height = `${BOTTOM_CELL_TOOLBAR_HEIGHT}px`; - container.style.height = `${BOTTOM_CELL_TOOLBAR_HEIGHT}px`; const cellMenu = this.instantiationService.createInstance(CellMenus); const menu = disposables.add(cellMenu.getCellInsertionMenu(contextKeyService)); const actions = this.getCellToolbarActions(menu); - toolbar.setActions(actions.primary, actions.secondary)(); + toolbar.setActions(actions.primary, actions.secondary); return toolbar; } @@ -223,9 +222,6 @@ abstract class AbstractCellRenderer { const bottomToolbarOffset = element.layoutInfo.bottomToolbarOffset; container.style.top = `${bottomToolbarOffset}px`; })); - } else { - container.style.position = 'static'; - container.style.height = `${BOTTOM_CELL_TOOLBAR_HEIGHT}`; } } @@ -266,15 +262,23 @@ abstract class AbstractCellRenderer { const updateActions = () => { const actions = this.getCellToolbarActions(menu); - templateData.toolbar.setActions(actions.primary, actions.secondary)(); + const hadFocus = DOM.isAncestor(document.activeElement, templateData.toolbar.getContainer()); + templateData.toolbar.setActions(actions.primary, actions.secondary); + if (hadFocus) { + this.notebookEditor.focus(); + } - if (templateData.focusIndicator) { - if (actions.primary.length || actions.secondary.length) { - templateData.container.classList.add('cell-has-toolbar-actions'); + if (actions.primary.length || actions.secondary.length) { + templateData.container.classList.add('cell-has-toolbar-actions'); + if (isCodeCellRenderTemplate(templateData)) { templateData.focusIndicator.style.top = `${EDITOR_TOOLBAR_HEIGHT + EDITOR_TOP_MARGIN}px`; - } else { - templateData.container.classList.remove('cell-has-toolbar-actions'); + templateData.focusIndicatorRight.style.top = `${EDITOR_TOOLBAR_HEIGHT + EDITOR_TOP_MARGIN}px`; + } + } else { + templateData.container.classList.remove('cell-has-toolbar-actions'); + if (isCodeCellRenderTemplate(templateData)) { templateData.focusIndicator.style.top = `${EDITOR_TOP_MARGIN}px`; + templateData.focusIndicatorRight.style.top = `${EDITOR_TOP_MARGIN}px`; } } }; @@ -332,7 +336,7 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR const disposables = new DisposableStore(); const contextKeyService = disposables.add(this.contextKeyServiceProvider(container)); const toolbar = disposables.add(this.createToolbar(container)); - const focusIndicator = DOM.append(container, DOM.$('.notebook-cell-focus-indicator')); + const focusIndicator = DOM.append(container, DOM.$('.cell-focus-indicator.cell-focus-indicator-side')); focusIndicator.setAttribute('draggable', 'true'); const codeInnerContent = DOM.append(container, $('.cell.code')); @@ -374,13 +378,13 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR private getDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { if (templateData.currentRenderedCell!.editState === CellEditState.Editing) { - return this._getEditDragImage(templateData); + return this.getEditDragImage(templateData); } else { - return this._getMarkdownDragImage(templateData); + return this.getMarkdownDragImage(templateData); } } - private _getMarkdownDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { + private getMarkdownDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { const dragImageContainer = DOM.$('.cell-drag-image.monaco-list-row.focused.markdown-cell-row'); dragImageContainer.innerHTML = templateData.container.innerHTML; @@ -394,7 +398,7 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR return dragImageContainer; } - private _getEditDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { + private getEditDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { return new CodeCellDragImageRenderer().getDragImage(templateData, templateData.currentEditor!, 'markdown'); } @@ -410,31 +414,31 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR templateData.cellContainer.appendChild(renderedHTML); } - if (height) { - const elementDisposables = templateData.elementDisposables; - - elementDisposables.add(new CellContextKeyManager(templateData.contextKeyService, this.notebookEditor.viewModel?.notebookDocument!, element)); - - // render toolbar first - this.setupCellToolbarActions(templateData.contextKeyService, templateData, elementDisposables); - - const toolbarContext = { - cell: element, - notebookEditor: this.notebookEditor, - $mid: 12 - }; - templateData.toolbar.context = toolbarContext; - - this.setBetweenCellToolbarContext(templateData, element, toolbarContext); - - const markdownCell = this.instantiationService.createInstance(StatefullMarkdownCell, this.notebookEditor, element, templateData, this.editorOptions.value, this.renderedEditors); - elementDisposables.add(this.editorOptions.onDidChange(newValue => markdownCell.updateEditorOptions(newValue))); - elementDisposables.add(markdownCell); - - element.totalHeight = height; - - templateData.languageStatusBarItem.update(element, this.notebookEditor); + if (height === undefined) { + return; } + + const elementDisposables = templateData.elementDisposables; + + elementDisposables.add(new CellContextKeyManager(templateData.contextKeyService, this.notebookEditor.viewModel?.notebookDocument!, element)); + + // render toolbar first + this.setupCellToolbarActions(templateData.contextKeyService, templateData, elementDisposables); + + const toolbarContext = { + cell: element, + notebookEditor: this.notebookEditor, + $mid: 12 + }; + templateData.toolbar.context = toolbarContext; + + this.setBetweenCellToolbarContext(templateData, element, toolbarContext); + + const markdownCell = this.instantiationService.createInstance(StatefullMarkdownCell, this.notebookEditor, element, templateData, this.editorOptions.value, this.renderedEditors); + elementDisposables.add(this.editorOptions.onDidChange(newValue => markdownCell.updateEditorOptions(newValue))); + elementDisposables.add(markdownCell); + + templateData.languageStatusBarItem.update(element, this.notebookEditor); } disposeTemplate(templateData: MarkdownCellRenderTemplate): void { @@ -661,10 +665,8 @@ export class CellDragAndDropController extends Disposable { })); } - private moveCell(draggedCell: ICellViewModel, ontoCell: ICellViewModel, direction: 'above' | 'below') { - const editState = draggedCell.editState; - this.notebookEditor.moveCell(draggedCell, ontoCell, direction); - this.notebookEditor.focusNotebookCell(draggedCell, editState === CellEditState.Editing ? 'editor' : 'container'); + private async moveCell(draggedCell: ICellViewModel, ontoCell: ICellViewModel, direction: 'above' | 'below') { + await this.notebookEditor.moveCell(draggedCell, ontoCell, direction); } private copyCell(draggedCell: ICellViewModel, ontoCell: ICellViewModel, direction: 'above' | 'below') { @@ -677,10 +679,10 @@ export class CellDragAndDropController extends Disposable { } export class CellLanguageStatusBarItem extends Disposable { - private labelElement: HTMLElement; + private readonly labelElement: HTMLElement; - private _cell: ICellViewModel | undefined; - private _editor: INotebookEditor | undefined; + private cell: ICellViewModel | undefined; + private editor: INotebookEditor | undefined; private cellDisposables: DisposableStore; @@ -695,7 +697,7 @@ export class CellLanguageStatusBarItem extends Disposable { this._register(DOM.addDisposableListener(this.labelElement, DOM.EventType.CLICK, () => { this.instantiationService.invokeFunction(accessor => { - new ChangeCellLanguageAction().run(accessor, { notebookEditor: this._editor!, cell: this._cell! }); + new ChangeCellLanguageAction().run(accessor, { notebookEditor: this.editor!, cell: this.cell! }); }); })); this._register(this.cellDisposables = new DisposableStore()); @@ -703,15 +705,16 @@ export class CellLanguageStatusBarItem extends Disposable { update(cell: ICellViewModel, editor: INotebookEditor): void { this.cellDisposables.clear(); - this._cell = cell; - this._editor = editor; + this.cell = cell; + this.editor = editor; this.render(); - this.cellDisposables.add(this._cell.model.onDidChangeLanguage(() => this.render())); + this.cellDisposables.add(this.cell.model.onDidChangeLanguage(() => this.render())); } private render(): void { - this.labelElement.textContent = this.modeService.getLanguageName(this._cell!.language!); + const modeId = this.modeService.getModeIdForLanguageName(this.cell!.language) || this.cell!.language; + this.labelElement.textContent = this.modeService.getLanguageName(modeId) || this.modeService.getLanguageName('plaintext'); } } @@ -723,7 +726,7 @@ class EditorTextRenderer { return null; } - const colorMap = this._getDefaultColorMap(); + const colorMap = this.getDefaultColorMap(); const fontInfo = editor.getOptions().get(EditorOption.fontInfo); const fontFamily = fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily ? fontInfo.fontFamily : `'${fontInfo.fontFamily}', ${EDITOR_FONT_DEFAULTS.fontFamily}`; @@ -736,11 +739,11 @@ class EditorTextRenderer { + `line-height: ${fontInfo.lineHeight}px;` + `white-space: pre;` + `">` - + this._getRichTextLines(model, modelRange, colorMap) + + this.getRichTextLines(model, modelRange, colorMap) + ''; } - private _getRichTextLines(model: ITextModel, modelRange: Range, colorMap: string[]): string { + private getRichTextLines(model: ITextModel, modelRange: Range, colorMap: string[]): string { const startLineNumber = modelRange.startLineNumber; const startColumn = modelRange.startColumn; const endLineNumber = modelRange.endLineNumber; @@ -766,7 +769,7 @@ class EditorTextRenderer { return result; } - private _getDefaultColorMap(): string[] { + private getDefaultColorMap(): string[] { let colorMap = modes.TokenizationRegistry.getColorMap(); let result: string[] = ['#000000']; if (colorMap) { @@ -780,7 +783,7 @@ class EditorTextRenderer { class CodeCellDragImageRenderer { getDragImage(templateData: BaseCellRenderTemplate, editor: ICodeEditor, type: 'code' | 'markdown'): HTMLElement { - let dragImage = this._getDragImage(templateData, editor, type); + let dragImage = this.getDragImageImpl(templateData, editor, type); if (!dragImage) { // TODO@roblourens I don't think this can happen dragImage = document.createElement('div'); @@ -790,7 +793,7 @@ class CodeCellDragImageRenderer { return dragImage; } - private _getDragImage(templateData: BaseCellRenderTemplate, editor: ICodeEditor, type: 'code' | 'markdown'): HTMLElement | null { + private getDragImageImpl(templateData: BaseCellRenderTemplate, editor: ICodeEditor, type: 'code' | 'markdown'): HTMLElement | null { const dragImageContainer = DOM.$(`.cell-drag-image.monaco-list-row.focused.${type}-cell-row`); dragImageContainer.innerHTML = templateData.container.innerHTML; @@ -799,11 +802,6 @@ class CodeCellDragImageRenderer { return null; } - const focusIndicator = dragImageContainer.querySelector('.notebook-cell-focus-indicator') as HTMLElement; - if (focusIndicator) { - focusIndicator.style.height = '40px'; - } - const richEditorText = new EditorTextRenderer().getRichText(editor, new Range(1, 1, 1, 1000)); if (!richEditorText) { return null; @@ -861,8 +859,13 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende container.classList.add('code-cell-row'); const disposables = new DisposableStore(); const contextKeyService = disposables.add(this.contextKeyServiceProvider(container)); + + const focusIndicatorTop = DOM.append(container, $('.cell-focus-indicator.cell-focus-indicator-top')); + DOM.append( + DOM.append(focusIndicatorTop, $('.cell-shadow-container.cell-shadow-container-top')), + $('.cell-shadow.cell-shadow-top')); const toolbar = disposables.add(this.createToolbar(container)); - const focusIndicator = DOM.append(container, DOM.$('.notebook-cell-focus-indicator')); + const focusIndicator = DOM.append(container, DOM.$('.cell-focus-indicator.cell-focus-indicator-side')); focusIndicator.setAttribute('draggable', 'true'); const cellContainer = DOM.append(container, $('.cell.code')); @@ -897,13 +900,22 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende const timer = new TimerRenderer(statusBar.durationContainer); const outputContainer = DOM.append(container, $('.output')); - const focusSink = DOM.append(container, $('.cell-editor-focus-sink')); - focusSink.setAttribute('tabindex', '0'); + + const focusIndicatorRight = DOM.append(container, DOM.$('.cell-focus-indicator.cell-focus-indicator-side.cell-focus-indicator-right')); + focusIndicatorRight.setAttribute('draggable', 'true'); + + const focusSinkElement = DOM.append(container, $('.cell-editor-focus-sink')); + focusSinkElement.setAttribute('tabindex', '0'); const bottomCellContainer = DOM.append(container, $('.cell-bottom-toolbar-container')); DOM.append(bottomCellContainer, $('.separator')); const betweenCellToolbar = this.createBetweenCellToolbar(bottomCellContainer, disposables, contextKeyService); DOM.append(bottomCellContainer, $('.separator')); + const focusIndicatorBottom = DOM.append(container, $('.cell-focus-indicator.cell-focus-indicator-bottom')); + DOM.append( + DOM.append(focusIndicatorBottom, $('.cell-shadow-container.cell-shadow-container-bottom')), + $('.cell-shadow.cell-shadow-bottom')); + const templateData: CodeCellRenderTemplate = { contextKeyService, container, @@ -914,8 +926,11 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende languageStatusBarItem: statusBar.languageStatusBarItem, progressBar, focusIndicator, + focusIndicatorRight, + focusIndicatorBottom, toolbar, betweenCellToolbar, + focusSinkElement, runToolbar, runButtonContainer, executionOrderLabel, @@ -930,8 +945,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende this.dndController.registerDragHandle(templateData, () => new CodeCellDragImageRenderer().getDragImage(templateData, templateData.editor, 'code')); - disposables.add(DOM.addDisposableListener(focusSink, DOM.EventType.FOCUS, () => { - if (templateData.currentRenderedCell) { + disposables.add(DOM.addDisposableListener(focusSinkElement, DOM.EventType.FOCUS, () => { + if (templateData.currentRenderedCell && (templateData.currentRenderedCell as CodeCellViewModel).outputs.length) { this.notebookEditor.focusNotebookCell(templateData.currentRenderedCell, 'output'); } })); @@ -951,13 +966,21 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende templateData.runToolbar.setActions([ this.instantiationService.createInstance(CancelCellAction) - ])(); + ]); } else { templateData.progressBar.hide(); templateData.runToolbar.setActions([ this.instantiationService.createInstance(ExecuteCellAction) - ])(); + ]); + } + } + + private updateForOutputs(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void { + if (element.outputs.length) { + DOM.show(templateData.focusSinkElement); + } else { + DOM.hide(templateData.focusSinkElement); } } @@ -1011,6 +1034,13 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende DOM.toggleClass(templateData.container, 'cell-output-hover', element.outputIsHovered); } + private updateForLayout(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void { + templateData.focusIndicator.style.height = `${element.layoutInfo.indicatorHeight}px`; + templateData.focusIndicatorRight.style.height = `${element.layoutInfo.indicatorHeight}px`; + templateData.focusIndicatorBottom.style.top = `${element.layoutInfo.totalHeight - BOTTOM_CELL_TOOLBAR_HEIGHT - CELL_BOTTOM_MARGIN}px`; + templateData.outputContainer.style.top = `${element.layoutInfo.outputContainerOffset}px`; + } + renderElement(element: CodeCellViewModel, index: number, templateData: CodeCellRenderTemplate, height: number | undefined): void { this.commonRenderElement(element, index, templateData); @@ -1029,12 +1059,13 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende elementDisposables.add(new CellContextKeyManager(templateData.contextKeyService, this.notebookEditor.viewModel?.notebookDocument!, element)); - templateData.focusIndicator.style.height = `${element.layoutInfo.indicatorHeight}px`; + this.updateForLayout(element, templateData); elementDisposables.add(element.onDidChangeLayout(() => { - templateData.focusIndicator.style.height = `${element.layoutInfo.indicatorHeight}px`; + this.updateForLayout(element, templateData); })); this.updateForMetadata(element, templateData); + this.updateForHover(element, templateData); elementDisposables.add(element.onDidChangeState((e) => { if (e.metadataChanged) { this.updateForMetadata(element, templateData); @@ -1045,6 +1076,9 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende } })); + this.updateForOutputs(element, templateData); + elementDisposables.add(element.onDidChangeOutputs(_e => this.updateForOutputs(element, templateData))); + this.setupCellToolbarActions(templateData.contextKeyService, templateData, elementDisposables); const toolbarContext = { @@ -1068,7 +1102,6 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende disposeElement(element: ICellViewModel, index: number, templateData: CodeCellRenderTemplate, height: number | undefined): void { templateData.elementDisposables.clear(); this.renderedEditors.delete(element); - templateData.focusIndicator.style.height = 'initial'; } } @@ -1087,7 +1120,7 @@ export class TimerRenderer { const duration = Date.now() - startTime; this.container.textContent = this.formatDuration(duration); }, 100); - this.intervalTimer = intervalTimer as any; + this.intervalTimer = intervalTimer as unknown as number | undefined; return toDisposable(() => { clearInterval(intervalTimer); diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts index a06f17895f0..1ddc2846709 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts @@ -176,7 +176,7 @@ export class CodeCell extends Disposable { let prevElement: HTMLElement | undefined = undefined; - this.viewCell.outputs.reverse().forEach(output => { + [...this.viewCell.outputs].reverse().forEach(output => { if (this.outputElements.has(output)) { // already exist prevElement = this.outputElements.get(output); @@ -200,6 +200,17 @@ export class CodeCell extends Disposable { } })); + this._register(viewCell.onDidChangeLayout(() => { + this.outputElements.forEach((value, key) => { + const index = viewCell.outputs.indexOf(key); + if (index >= 0) { + const top = this.viewCell.getOutputOffsetInContainer(index); + value.style.top = `${top}px`; + } + }); + + })); + const updateFocusMode = () => viewCell.focusMode = templateData.editor!.hasWidgetFocus() ? CellFocusMode.Editor : CellFocusMode.Container; this._register(templateData.editor!.onDidFocusEditorWidget(() => { updateFocusMode(); @@ -311,15 +322,21 @@ export class CodeCell extends Disposable { } let pickedMimeTypeRenderer = currOutput.orderedMimeTypes![currOutput.pickedMimeTypeIndex!]; + const innerContainer = DOM.$('.output-inner-container'); + DOM.append(outputItemDiv, innerContainer); + if (pickedMimeTypeRenderer.isResolved) { // html - result = this.notebookEditor.getOutputRenderer().render({ outputKind: CellOutputKind.Rich, data: { 'text/html': pickedMimeTypeRenderer.output! } } as any, outputItemDiv, 'text/html'); + result = this.notebookEditor.getOutputRenderer().render({ outputId: currOutput.outputId, outputKind: CellOutputKind.Rich, data: { 'text/html': pickedMimeTypeRenderer.output! } }, innerContainer, 'text/html'); } else { - result = this.notebookEditor.getOutputRenderer().render(currOutput, outputItemDiv, pickedMimeTypeRenderer.mimeType); + result = this.notebookEditor.getOutputRenderer().render(currOutput, innerContainer, pickedMimeTypeRenderer.mimeType); } } else { // for text and error, there is no mimetype - result = this.notebookEditor.getOutputRenderer().render(currOutput, outputItemDiv, undefined); + const innerContainer = DOM.$('.output-inner-container'); + DOM.append(outputItemDiv, innerContainer); + + result = this.notebookEditor.getOutputRenderer().render(currOutput, innerContainer, undefined); } if (!result) { @@ -340,11 +357,15 @@ export class CodeCell extends Disposable { this.notebookEditor.createInset(this.viewCell, currOutput, result.shadowContent, this.viewCell.getOutputOffset(index)); } else { DOM.addClass(outputItemDiv, 'foreground'); + DOM.addClass(outputItemDiv, 'output-element'); + outputItemDiv.style.position = 'absolute'; } let hasDynamicHeight = result.hasDynamicHeight; if (hasDynamicHeight) { + this.viewCell.selfSizeMonitoring = true; + let clientHeight = outputItemDiv.clientHeight; let dimension = { width: this.viewCell.layoutInfo.editorWidth, @@ -352,10 +373,9 @@ export class CodeCell extends Disposable { }; const elementSizeObserver = getResizesObserver(outputItemDiv, dimension, () => { if (this.templateData.outputContainer && document.body.contains(this.templateData.outputContainer!)) { - let height = elementSizeObserver.getHeight() + 8 * 2; // include padding + let height = Math.ceil(elementSizeObserver.getHeight()); if (clientHeight === height) { - // console.log(this.viewCell.outputs); return; } @@ -375,13 +395,13 @@ export class CodeCell extends Disposable { if (result.shadowContent) { // webview // noop - // let cachedHeight = this.viewCell.getOutputHeight(currOutput); } else { // static output - - // @TODO@rebornix, if we stop checking output height, we need to evaluate it later when checking the height of output container - let clientHeight = outputItemDiv.clientHeight; + let clientHeight = Math.ceil(outputItemDiv.clientHeight); this.viewCell.updateOutputHeight(index, clientHeight); + + const top = this.viewCell.getOutputOffsetInContainer(index); + outputItemDiv.style.top = `${top}px`; } } } @@ -464,14 +484,17 @@ export class CodeCell extends Disposable { this.notebookEditor.layoutNotebookCell(this.viewCell, this.viewCell.layoutInfo.totalHeight); } - private _timer: any = null; + private _timer: number | null = null; relayoutCellDebounced() { - clearTimeout(this._timer); + if (this._timer !== null) { + clearTimeout(this._timer); + } + this._timer = setTimeout(() => { this.notebookEditor.layoutNotebookCell(this.viewCell, this.viewCell.layoutInfo.totalHeight); this._timer = null; - }, 200); + }, 200) as unknown as number | null; } dispose() { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell.ts index 0bbb7773905..356b81bd198 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell.ts @@ -57,7 +57,7 @@ export class StatefullMarkdownCell extends Disposable { this._register(getResizesObserver(this.markdownContainer, undefined, () => { if (viewCell.editState === CellEditState.Preview) { - this.viewCell.totalHeight = templateData.container.clientHeight; + this.viewCell.renderedMarkdownHeight = templateData.container.clientHeight; } })).startObserving(); @@ -96,8 +96,8 @@ export class StatefullMarkdownCell extends Disposable { this._register(viewCell.onDidChangeLayout((e) => { const layoutInfo = this.editor?.getLayoutInfo(); if (e.outerWidth && layoutInfo && layoutInfo.width !== viewCell.layoutInfo.editorWidth) { - this.onCellWidthChange(); - } else if (e.totalHeight) { + this.onCellEditorWidthChange(); + } else if (e.totalHeight || e.outerWidth) { this.relayoutCell(); } })); @@ -202,15 +202,13 @@ export class StatefullMarkdownCell extends Disposable { if (this.editor) { // switch from editing mode - const clientHeight = this.templateData.container.clientHeight; - this.viewCell.totalHeight = clientHeight; - this.notebookEditor.layoutNotebookCell(this.viewCell, clientHeight); + this.viewCell.renderedMarkdownHeight = this.templateData.container.clientHeight; + this.relayoutCell(); } else { // first time, readonly mode this.localDisposables.add(markdownRenderer.onDidUpdateRender(() => { - const clientHeight = this.templateData.container.clientHeight; - this.viewCell.totalHeight = clientHeight; - this.notebookEditor.layoutNotebookCell(this.viewCell, clientHeight); + this.viewCell.renderedMarkdownHeight = this.templateData.container.clientHeight; + this.relayoutCell(); })); this.localDisposables.add(this.viewCell.textBuffer.onDidChangeContent(() => { @@ -222,9 +220,8 @@ export class StatefullMarkdownCell extends Disposable { } })); - const clientHeight = this.templateData.container.clientHeight; - this.viewCell.totalHeight = clientHeight; - this.notebookEditor.layoutNotebookCell(this.viewCell, clientHeight); + this.viewCell.renderedMarkdownHeight = this.templateData.container.clientHeight; + this.relayoutCell(); } } @@ -239,7 +236,7 @@ export class StatefullMarkdownCell extends Disposable { this.templateData.statusBarContainer.style.width = `${dimension.width}px`; } - private onCellWidthChange(): void { + private onCellEditorWidthChange(): void { const realContentHeight = this.editor!.getContentHeight(); this.layoutEditor( { @@ -256,7 +253,7 @@ export class StatefullMarkdownCell extends Disposable { this.notebookEditor.layoutNotebookCell(this.viewCell, this.viewCell.layoutInfo.totalHeight); } - updateEditorOptions(newValue: IEditorOptions): any { + updateEditorOptions(newValue: IEditorOptions): void { this.editorOptions = newValue; if (this.editor) { this.editor.updateOptions(this.editorOptions); diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index 6010fd34496..b640c84fef5 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -11,17 +11,17 @@ import { ToWebviewMessage } from 'vs/workbench/contrib/notebook/browser/view/ren // function. Imports are not allowed. This is stringifies and injected into // the webview. -declare const acquireVsCodeApi: () => ({ getState(): { [key: string]: unknown }, setState(data: { [key: string]: unknown }): void, postMessage: (msg: unknown) => void }); +declare const acquireVsCodeApi: () => ({ getState(): { [key: string]: unknown; }, setState(data: { [key: string]: unknown; }): void, postMessage: (msg: unknown) => void; }); declare class ResizeObserver { - constructor(onChange: (entries: { target: HTMLElement, contentRect?: ClientRect }[]) => void); + constructor(onChange: (entries: { target: HTMLElement, contentRect?: ClientRect; }[]) => void); observe(element: Element): void; disconnect(): void; } declare const __outputNodePadding__: number; -type Listener = { fn: (evt: T) => void; thisArg: unknown }; +type Listener = { fn: (evt: T) => void; thisArg: unknown; }; interface EmitterLike { fire(data: T): void; @@ -251,9 +251,18 @@ function webviewPreloads() { return mapped.event; } + interface ICreateCellInfo { + outputId: string; + element: HTMLElement; + } - const onWillDestroyCell = createEmitter<[string | undefined /* namespace */, string | undefined /* cell uri */]>(); - const onDidCreateCell = createEmitter<[string | undefined /* namespace */, HTMLElement]>(); + interface IDestroyCellInfo { + outputId: string; + } + + const onWillDestroyOutput = createEmitter<[string | undefined /* namespace */, IDestroyCellInfo | undefined /* cell uri */]>(); + const onDidCreateOutput = createEmitter<[string | undefined /* namespace */, ICreateCellInfo]>(); + const onDidReceiveMessage = createEmitter<[string, unknown]>(); const matchesNs = (namespace: string, query: string | undefined) => namespace === '*' || query === namespace || query === 'undefined'; @@ -263,7 +272,14 @@ function webviewPreloads() { } return { - postMessage: vscode.postMessage, + postMessage(message: unknown) { + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'customRendererMessage', + rendererId: namespace, + message, + }); + }, setState(newState: T) { vscode.setState({ ...vscode.getState(), [namespace]: newState }); }, @@ -271,55 +287,89 @@ function webviewPreloads() { const state = vscode.getState(); return typeof state === 'object' && state ? state[namespace] as T : undefined; }, - onWillDestroyCell: mapEmitter(onWillDestroyCell, ([ns, cellUri]) => matchesNs(namespace, ns) ? cellUri : dontEmit), - onDidCreateCell: mapEmitter(onDidCreateCell, ([ns, element]) => matchesNs(namespace, ns) ? element : dontEmit), + onDidReceiveMessage: mapEmitter(onDidReceiveMessage, ([ns, data]) => ns === namespace ? data : dontEmit), + onWillDestroyOutput: mapEmitter(onWillDestroyOutput, ([ns, data]) => matchesNs(namespace, ns) ? data : dontEmit), + onDidCreateOutput: mapEmitter(onDidCreateOutput, ([ns, data]) => matchesNs(namespace, ns) ? data : dontEmit), }; }; + /** + * Map of preload resource URIs to promises that resolve one the resource + * loads or errors. + */ + const preloadPromises = new Map>(); + const queuedOuputActions = new Map>(); + + /** + * Enqueues an action that affects a output. This blocks behind renderer load + * requests that affect the same output. This should be called whenever you + * do something that affects output to ensure it runs in + * the correct order. + */ + const enqueueOutputAction = (event: T, fn: (event: T) => Promise | void) => { + const queued = queuedOuputActions.get(event.outputId); + const maybePromise = queued ? queued.then(() => fn(event)) : fn(event); + if (typeof maybePromise === 'undefined') { + return; // a synchonrously-called function, we're done + } + + const promise = maybePromise.then(() => { + if (queuedOuputActions.get(event.outputId) === promise) { + queuedOuputActions.delete(event.outputId); + } + }); + + queuedOuputActions.set(event.outputId, promise); + }; + window.addEventListener('wheel', handleWheel); window.addEventListener('message', rawEvent => { - const event = rawEvent as ({ data: ToWebviewMessage }); + const event = rawEvent as ({ data: ToWebviewMessage; }); switch (event.data.type) { case 'html': - { - const id = event.data.id; - let cellOutputContainer = document.getElementById(id); - let outputId = event.data.outputId; + enqueueOutputAction(event.data, async data => { + await Promise.all(data.requiredPreloads.map(p => preloadPromises.get(p.uri))); + if (!queuedOuputActions.has(data.outputId)) { // output was cleared while loading + return; + } + + let cellOutputContainer = document.getElementById(data.cellId); + let outputId = data.outputId; if (!cellOutputContainer) { const container = document.getElementById('container')!; - const upperWrapperElement = createFocusSink(id, outputId); + const upperWrapperElement = createFocusSink(data.cellId, outputId); container.appendChild(upperWrapperElement); let newElement = document.createElement('div'); - newElement.id = id; + newElement.id = data.cellId; container.appendChild(newElement); cellOutputContainer = newElement; - const lowerWrapperElement = createFocusSink(id, outputId, true); + const lowerWrapperElement = createFocusSink(data.cellId, outputId, true); container.appendChild(lowerWrapperElement); } let outputNode = document.createElement('div'); outputNode.style.position = 'absolute'; - outputNode.style.top = event.data.top + 'px'; - outputNode.style.left = event.data.left + 'px'; - outputNode.style.width = 'calc(100% - ' + event.data.left + 'px)'; + outputNode.style.top = data.top + 'px'; + outputNode.style.left = data.left + 'px'; + outputNode.style.width = 'calc(100% - ' + data.left + 'px)'; outputNode.style.minHeight = '32px'; outputNode.id = outputId; addMouseoverListeners(outputNode, outputId); - let content = event.data.content; + let content = data.content; outputNode.innerHTML = content; cellOutputContainer.appendChild(outputNode); // eval domEval(outputNode); resizeObserve(outputNode, outputId); - onDidCreateCell.fire([event.data.apiNamespace, outputNode]); + onDidCreateOutput.fire([data.apiNamespace, { element: outputNode, outputId }]); vscode.postMessage({ __vscode_notebook_message: true, @@ -331,8 +381,8 @@ function webviewPreloads() { }); // don't hide until after this step so that the height is right - cellOutputContainer.style.display = event.data.initiallyHidden ? 'none' : 'block'; - } + cellOutputContainer.style.display = data.initiallyHidden ? 'none' : 'block'; + }); break; case 'view-scroll': { @@ -347,7 +397,8 @@ function webviewPreloads() { break; } case 'clear': - onWillDestroyCell.fire([undefined, undefined]); + queuedOuputActions.clear(); // stop all loading outputs + onWillDestroyOutput.fire([undefined, undefined]); document.getElementById('container')!.innerHTML = ''; for (let i = 0; i < observers.length; i++) { observers[i].disconnect(); @@ -356,32 +407,29 @@ function webviewPreloads() { observers = []; break; case 'clearOutput': - { - const id = event.data.id; - onWillDestroyCell.fire([event.data.apiNamespace, event.data.cellUri]); - let output = document.getElementById(id); - if (output && output.parentNode) { - document.getElementById(id)!.parentNode!.removeChild(output); - } - // @TODO remove observer + let output = document.getElementById(event.data.outputId); + queuedOuputActions.delete(event.data.outputId); // stop any in-progress rendering + if (output && output.parentNode) { + onWillDestroyOutput.fire([event.data.apiNamespace, { outputId: event.data.outputId }]); + output.parentNode.removeChild(output); } break; case 'hideOutput': - { - const container = document.getElementById(event.data.id)?.parentElement; + enqueueOutputAction(event.data, ({ outputId }) => { + const container = document.getElementById(outputId)?.parentElement; if (container) { container.style.display = 'none'; } - } + }); break; case 'showOutput': - { - let output = document.getElementById(event.data.id); + enqueueOutputAction(event.data, ({ outputId, top }) => { + let output = document.getElementById(outputId); if (output) { output.parentElement!.style.display = 'block'; - output.style.top = event.data.top + 'px'; + output.style.top = top + 'px'; } - } + }); break; case 'preload': let resources = event.data.resources; @@ -391,13 +439,18 @@ function webviewPreloads() { const scriptTag = document.createElement('script'); scriptTag.setAttribute('src', uri); preloadsContainer.appendChild(scriptTag); + preloadPromises.set(uri, new Promise(resolve => { + scriptTag.addEventListener('load', () => resolve()); + scriptTag.addEventListener('error', () => resolve()); + })); } break; case 'focus-output': - { - focusFirstFocusableInCell(event.data.id); - break; - } + focusFirstFocusableInCell(event.data.cellId); + break; + case 'customRendererMessage': + onDidReceiveMessage.fire([event.data.rendererId, event.data.message]); + break; } }); diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts index c0b6961d5f6..f38e530a90a 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts @@ -75,12 +75,8 @@ export abstract class BaseCellViewModel extends Disposable { return this._focusMode; } set focusMode(newMode: CellFocusMode) { - const changed = this._focusMode !== newMode; this._focusMode = newMode; - - if (changed) { - this._onDidChangeState.fire({ focusModeChanged: true }); - } + this._onDidChangeState.fire({ focusModeChanged: true }); } protected _textEditor?: ICodeEditor; @@ -94,14 +90,17 @@ export abstract class BaseCellViewModel extends Disposable { options: model.IModelDeltaDecoration; }>(); private _lastDecorationId: number = 0; - protected _textModel?: model.ITextModel; get textModel(): model.ITextModel | undefined { - return this._textModel; + return this.model.textModel; + } + + set textModel(m: model.ITextModel | undefined) { + this.model.textModel = m; } hasModel(): this is IEditableCellViewModel { - return !!this._textModel; + return !!this.model.textModel; } private _dragging: boolean = false; @@ -131,7 +130,7 @@ export abstract class BaseCellViewModel extends Disposable { abstract onDeselect(): void; assertTextModelAttached(): boolean { - if (this._textModel && this._textEditor && this._textEditor.getModel() === this._textModel) { + if (this.textModel && this._textEditor && this._textEditor.getModel() === this.textModel) { return true; } @@ -152,10 +151,10 @@ export abstract class BaseCellViewModel extends Disposable { } this._textEditor = editor; - this._textModel = this._textEditor.getModel() || undefined; + this.textModel = this._textEditor.getModel() || undefined; if (this._editorViewStates) { - this.restoreViewState(this._editorViewStates); + this._restoreViewState(this._editorViewStates); } this._resolvedDecorations.forEach((value, key) => { @@ -187,7 +186,7 @@ export abstract class BaseCellViewModel extends Disposable { }); this._textEditor = undefined; - this._textModel = undefined; + this.textModel = undefined; this._cursorChangeListener?.dispose(); this._cursorChangeListener = null; this._onDidChangeEditorAttachState.fire(); @@ -197,6 +196,10 @@ export abstract class BaseCellViewModel extends Disposable { return this.model.getValue(); } + getTextLength(): number { + return this.model.getTextLength(); + } + private saveViewState(): void { if (!this._textEditor) { return; @@ -217,7 +220,7 @@ export abstract class BaseCellViewModel extends Disposable { this._editorViewStates = editorViewStates; } - private restoreViewState(state: editorCommon.ICodeEditorViewState | null): void { + private _restoreViewState(state: editorCommon.ICodeEditorViewState | null): void { if (state) { this._textEditor?.restoreViewState(state); } @@ -306,6 +309,10 @@ export abstract class BaseCellViewModel extends Disposable { return CursorAtBoundary.None; } + if (!this.textModel) { + return CursorAtBoundary.None; + } + // only validate primary cursor const selection = this._textEditor.getSelection(); @@ -315,7 +322,7 @@ export abstract class BaseCellViewModel extends Disposable { } const firstViewLineTop = this._textEditor.getTopForPosition(1, 1); - const lastViewLineTop = this._textEditor.getTopForPosition(this._textModel!.getLineCount(), this._textModel!.getLineLength(this._textModel!.getLineCount())); + const lastViewLineTop = this._textEditor.getTopForPosition(this.textModel!.getLineCount(), this.textModel!.getLineLength(this.textModel!.getLineCount())); const selectionTop = this._textEditor.getTopForPosition(selection.startLineNumber, selection.startColumn); if (selectionTop === lastViewLineTop) { @@ -343,7 +350,7 @@ export abstract class BaseCellViewModel extends Disposable { let cellMatches: model.FindMatch[] = []; if (this.assertTextModelAttached()) { - cellMatches = this._textModel!.findMatches(value, false, false, false, null, false); + cellMatches = this.textModel!.findMatches(value, false, false, false, null, false); } else { const lineCount = this.textBuffer.getLineCount(); const fullRange = new Range(1, 1, lineCount, this.textBuffer.getLineLength(lineCount) + 1); @@ -384,7 +391,7 @@ export abstract class BaseCellViewModel extends Disposable { super.dispose(); } - toJSON(): any { + toJSON(): object { return { handle: this.handle }; diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit.ts index 030188a6a8f..709c41859b2 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit.ts @@ -5,181 +5,24 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { ICell, CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IResourceUndoRedoElement, UndoRedoElementType } from 'vs/platform/undoRedo/common/undoRedo'; import { URI } from 'vs/base/common/uri'; import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel'; -import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { CellFocusMode } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; +import { ITextCellEditingDelegate } from 'vs/workbench/contrib/notebook/common/model/cellEdit'; -/** - * It should not modify Undo/Redo stack - */ -export interface ICellEditingDelegate { - insertCell?(index: number, viewCell: BaseCellViewModel): void; - deleteCell?(index: number): void; - moveCell?(fromIndex: number, toIndex: number): void; - createCellViewModel?(cell: ICell): BaseCellViewModel; + +export interface IViewCellEditingDelegate extends ITextCellEditingDelegate { + createCellViewModel?(cell: NotebookCellTextModel): BaseCellViewModel; createCell?(index: number, source: string | string[], language: string, type: CellKind): BaseCellViewModel; - setSelections(selections: number[]): void; -} - -export class InsertCellEdit implements IResourceUndoRedoElement { - type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; - label: string = 'Insert Cell'; - constructor( - public resource: URI, - private insertIndex: number, - private cell: BaseCellViewModel, - private editingDelegate: ICellEditingDelegate, - private beforedSelections: number[], - private endSelections: number[] - ) { - } - - undo(): void | Promise { - if (!this.editingDelegate.deleteCell) { - throw new Error('Notebook Delete Cell not implemented for Undo/Redo'); - } - - this.editingDelegate.deleteCell(this.insertIndex); - this.editingDelegate.setSelections(this.beforedSelections); - } - redo(): void | Promise { - if (!this.editingDelegate.insertCell) { - throw new Error('Notebook Insert Cell not implemented for Undo/Redo'); - } - - this.editingDelegate.insertCell(this.insertIndex, this.cell); - this.editingDelegate.setSelections(this.endSelections); - } -} - -export class DeleteCellEdit implements IResourceUndoRedoElement { - type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; - label: string = 'Delete Cell'; - - private _rawCell: ICell; - constructor( - public resource: URI, - private insertIndex: number, - cell: BaseCellViewModel, - private editingDelegate: ICellEditingDelegate, - private beforedSelections: number[], - private endSelections: number[] - ) { - this._rawCell = cell.model; - - // save inmem text to `ICell` - // no needed any more as the text buffer is transfered to `raw_cell` - // this._rawCell.source = [cell.getText()]; - } - - undo(): void | Promise { - if (!this.editingDelegate.insertCell || !this.editingDelegate.createCellViewModel) { - throw new Error('Notebook Insert Cell not implemented for Undo/Redo'); - } - - const cell = this.editingDelegate.createCellViewModel(this._rawCell); - this.editingDelegate.insertCell(this.insertIndex, cell); - this.editingDelegate.setSelections(this.beforedSelections); - } - - redo(): void | Promise { - if (!this.editingDelegate.deleteCell) { - throw new Error('Notebook Delete Cell not implemented for Undo/Redo'); - } - - this.editingDelegate.deleteCell(this.insertIndex); - this.editingDelegate.setSelections(this.endSelections); - } -} - -export class MoveCellEdit implements IResourceUndoRedoElement { - type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; - label: string = 'Delete Cell'; - - constructor( - public resource: URI, - private fromIndex: number, - private toIndex: number, - private editingDelegate: ICellEditingDelegate, - private beforedSelections: number[], - private endSelections: number[] - ) { - } - - undo(): void | Promise { - if (!this.editingDelegate.moveCell) { - throw new Error('Notebook Move Cell not implemented for Undo/Redo'); - } - - this.editingDelegate.moveCell(this.toIndex, this.fromIndex); - this.editingDelegate.setSelections(this.beforedSelections); - } - - redo(): void | Promise { - if (!this.editingDelegate.moveCell) { - throw new Error('Notebook Move Cell not implemented for Undo/Redo'); - } - - this.editingDelegate.moveCell(this.fromIndex, this.toIndex); - this.editingDelegate.setSelections(this.endSelections); - } -} - -export class SpliceCellsEdit implements IResourceUndoRedoElement { - type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; - label: string = 'Insert Cell'; - constructor( - public resource: URI, - private diffs: [number, CellViewModel[], CellViewModel[]][], - private editingDelegate: ICellEditingDelegate, - private beforeHandles: number[], - private endHandles: number[] - ) { - } - - undo(): void | Promise { - if (!this.editingDelegate.deleteCell || !this.editingDelegate.insertCell) { - throw new Error('Notebook Insert/Delete Cell not implemented for Undo/Redo'); - } - - this.diffs.forEach(diff => { - for (let i = 0; i < diff[2].length; i++) { - this.editingDelegate.deleteCell!(diff[0]); - } - - diff[1].reverse().forEach(cell => { - this.editingDelegate.insertCell!(diff[0], cell); - }); - }); - this.editingDelegate.setSelections(this.beforeHandles); - } - - redo(): void | Promise { - if (!this.editingDelegate.deleteCell || !this.editingDelegate.insertCell) { - throw new Error('Notebook Insert/Delete Cell not implemented for Undo/Redo'); - } - - this.diffs.reverse().forEach(diff => { - for (let i = 0; i < diff[1].length; i++) { - this.editingDelegate.deleteCell!(diff[0]); - } - - diff[2].reverse().forEach(cell => { - this.editingDelegate.insertCell!(diff[0], cell); - }); - }); - - this.editingDelegate.setSelections(this.endHandles); - } } export class JoinCellEdit implements IResourceUndoRedoElement { type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; label: string = 'Join Cell'; - private _deletedRawCell: ICell; + private _deletedRawCell: NotebookCellTextModel; constructor( public resource: URI, private index: number, @@ -189,7 +32,7 @@ export class JoinCellEdit implements IResourceUndoRedoElement { private inverseRange: Range, private insertContent: string, private removedCell: BaseCellViewModel, - private editingDelegate: ICellEditingDelegate, + private editingDelegate: IViewCellEditingDelegate, ) { this._deletedRawCell = this.removedCell.model; } @@ -209,12 +52,12 @@ export class JoinCellEdit implements IResourceUndoRedoElement { const cell = this.editingDelegate.createCellViewModel(this._deletedRawCell); if (this.direction === 'above') { - this.editingDelegate.insertCell(this.index, cell); - this.editingDelegate.setSelections([cell.handle]); + this.editingDelegate.insertCell(this.index, this._deletedRawCell); + this.editingDelegate.emitSelections([cell.handle]); cell.focusMode = CellFocusMode.Editor; } else { - this.editingDelegate.insertCell(this.index, cell); - this.editingDelegate.setSelections([this.cell.handle]); + this.editingDelegate.insertCell(this.index, cell.model); + this.editingDelegate.emitSelections([this.cell.handle]); this.cell.focusMode = CellFocusMode.Editor; } } @@ -230,7 +73,7 @@ export class JoinCellEdit implements IResourceUndoRedoElement { ]); this.editingDelegate.deleteCell(this.index); - this.editingDelegate.setSelections([this.cell.handle]); + this.editingDelegate.emitSelections([this.cell.handle]); this.cell.focusMode = CellFocusMode.Editor; } } @@ -247,13 +90,13 @@ export class SplitCellEdit implements IResourceUndoRedoElement { private cellContents: string[], private language: string, private cellKind: CellKind, - private editingDelegate: ICellEditingDelegate + private editingDelegate: IViewCellEditingDelegate ) { } async undo(): Promise { - if (!this.editingDelegate.deleteCell || !this.editingDelegate.createCellViewModel) { + if (!this.editingDelegate.deleteCell) { throw new Error('Notebook Delete Cell not implemented for Undo/Redo'); } @@ -270,12 +113,12 @@ export class SplitCellEdit implements IResourceUndoRedoElement { this.editingDelegate.deleteCell(this.index + 1); } - this.editingDelegate.setSelections([this.cell.handle]); + this.editingDelegate.emitSelections([this.cell.handle]); this.cell.focusMode = CellFocusMode.Editor; } async redo(): Promise { - if (!this.editingDelegate.insertCell || !this.editingDelegate.createCell) { + if (!this.editingDelegate.createCell) { throw new Error('Notebook Insert Cell not implemented for Undo/Redo'); } @@ -291,7 +134,7 @@ export class SplitCellEdit implements IResourceUndoRedoElement { } if (lastCell) { - this.editingDelegate.setSelections([lastCell.handle]); + this.editingDelegate.emitSelections([lastCell.handle]); lastCell.focusMode = CellFocusMode.Editor; } } diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts index 60d16650af8..144c3ad17ca 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts @@ -7,9 +7,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import * as UUID from 'vs/base/common/uuid'; import * as editorCommon from 'vs/editor/common/editorCommon'; import * as model from 'vs/editor/common/model'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; -import { BOTTOM_CELL_TOOLBAR_HEIGHT, CELL_MARGIN, CELL_RUN_GUTTER, CELL_STATUSBAR_HEIGHT, EDITOR_BOTTOM_PADDING, EDITOR_TOOLBAR_HEIGHT, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING } from 'vs/workbench/contrib/notebook/browser/constants'; +import { BOTTOM_CELL_TOOLBAR_HEIGHT, CELL_MARGIN, CELL_RUN_GUTTER, CELL_STATUSBAR_HEIGHT, EDITOR_BOTTOM_PADDING, EDITOR_TOOLBAR_HEIGHT, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING, CELL_BOTTOM_MARGIN, CODE_CELL_LEFT_MARGIN } from 'vs/workbench/contrib/notebook/browser/constants'; import { CellEditState, CellFindMatch, CodeCellLayoutChangeEvent, CodeCellLayoutInfo, ICellViewModel, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { CellKind, NotebookCellOutputsSplice } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -69,8 +68,7 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod readonly viewType: string, readonly model: NotebookCellTextModel, initialNotebookLayoutInfo: NotebookLayoutInfo | null, - readonly eventDispatcher: NotebookEventDispatcher, - @ITextModelService private readonly _modelService: ITextModelService, + readonly eventDispatcher: NotebookEventDispatcher ) { super(viewType, model, UUID.generateUuid()); this._register(this.model.onDidChangeOutputs((splices) => { @@ -94,14 +92,14 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod } private computeEditorWidth(outerWidth: number): number { - return outerWidth - (CELL_MARGIN * 2 + CELL_RUN_GUTTER); + return outerWidth - (CODE_CELL_LEFT_MARGIN + (CELL_MARGIN * 2) + CELL_RUN_GUTTER); } layoutChange(state: CodeCellLayoutChangeEvent) { // recompute this._ensureOutputsTop(); const outputTotalHeight = this._outputsTop!.getTotalValue(); - const totalHeight = EDITOR_TOOLBAR_HEIGHT + this.editorHeight + EDITOR_TOP_MARGIN + outputTotalHeight + BOTTOM_CELL_TOOLBAR_HEIGHT + CELL_STATUSBAR_HEIGHT; + const totalHeight = EDITOR_TOOLBAR_HEIGHT + this.editorHeight + EDITOR_TOP_MARGIN + outputTotalHeight + BOTTOM_CELL_TOOLBAR_HEIGHT + CELL_STATUSBAR_HEIGHT + CELL_BOTTOM_MARGIN; const indicatorHeight = this.editorHeight + CELL_STATUSBAR_HEIGHT + outputTotalHeight; const outputContainerOffset = EDITOR_TOOLBAR_HEIGHT + EDITOR_TOP_MARGIN + this.editorHeight + CELL_STATUSBAR_HEIGHT; const bottomToolbarOffset = totalHeight - BOTTOM_CELL_TOOLBAR_HEIGHT; @@ -173,17 +171,17 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod * Text model is used for editing. */ async resolveTextModel(): Promise { - if (!this._textModel) { - const ref = await this._modelService.createModelReference(this.model.uri); - this._textModel = ref.object.textEditorModel; + if (!this.textModel) { + const ref = await this.model.resolveTextModelRef(); + this.textModel = ref.object.textEditorModel; this._register(ref); - this._register(this._textModel.onDidChangeContent(() => { + this._register(this.textModel.onDidChangeContent(() => { this.editState = CellEditState.Editing; this._onDidChangeState.fire({ contentChanged: true }); })); } - return this._textModel; + return this.textModel; } onDeselect() { @@ -201,15 +199,18 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod this.layoutChange({ outputHeight: true }); } - getOutputOffset(index: number): number { + getOutputOffsetInContainer(index: number) { this._ensureOutputsTop(); if (index >= this._outputCollection.length) { throw new Error('Output index out of range!'); } - const offset = this._outputsTop!.getAccumulatedValue(index - 1); - return this.layoutInfo.outputContainerOffset + offset; + return this._outputsTop!.getAccumulatedValue(index - 1); + } + + getOutputOffset(index: number): number { + return this.layoutInfo.outputContainerOffset + this.getOutputOffsetInContainer(index); } spliceOutputHeights(start: number, deleteCnt: number, heights: number[]) { @@ -254,4 +255,8 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod matches }; } + + dispose() { + super.dispose(); + } } diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts index 73f293399c3..7de9df96273 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import * as UUID from 'vs/base/common/uuid'; import * as editorCommon from 'vs/editor/common/editorCommon'; import * as model from 'vs/editor/common/model'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { BOTTOM_CELL_TOOLBAR_HEIGHT, CELL_MARGIN, CELL_RUN_GUTTER, CELL_STATUSBAR_HEIGHT } from 'vs/workbench/contrib/notebook/browser/constants'; +import { BOTTOM_CELL_TOOLBAR_HEIGHT, CELL_MARGIN, CELL_RUN_GUTTER, CELL_STATUSBAR_HEIGHT, EDITOR_TOP_MARGIN, CELL_BOTTOM_MARGIN } from 'vs/workbench/contrib/notebook/browser/constants'; import { CellFindMatch, ICellViewModel, MarkdownCellLayoutChangeEvent, MarkdownCellLayoutInfo, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { MarkdownRenderer } from 'vs/workbench/contrib/notebook/browser/view/renderers/mdRenderer'; import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel'; @@ -26,13 +26,18 @@ export class MarkdownCellViewModel extends BaseCellViewModel implements ICellVie return this._layoutInfo; } - set totalHeight(newHeight: number) { + set renderedMarkdownHeight(newHeight: number) { + const newTotalHeight = newHeight + BOTTOM_CELL_TOOLBAR_HEIGHT; + this.totalHeight = newTotalHeight; + } + + private set totalHeight(newHeight: number) { if (newHeight !== this.layoutInfo.totalHeight) { this.layoutChange({ totalHeight: newHeight }); } } - get totalHeight() { + private get totalHeight() { throw new Error('MarkdownCellViewModel.totalHeight is write only'); } @@ -40,7 +45,7 @@ export class MarkdownCellViewModel extends BaseCellViewModel implements ICellVie set editorHeight(newHeight: number) { this._editorHeight = newHeight; - this.totalHeight = this._editorHeight + BOTTOM_CELL_TOOLBAR_HEIGHT + CELL_STATUSBAR_HEIGHT; + this.totalHeight = this._editorHeight + EDITOR_TOP_MARGIN + CELL_BOTTOM_MARGIN + BOTTOM_CELL_TOOLBAR_HEIGHT + CELL_STATUSBAR_HEIGHT; } get editorHeight() { @@ -60,8 +65,8 @@ export class MarkdownCellViewModel extends BaseCellViewModel implements ICellVie initialNotebookLayoutInfo: NotebookLayoutInfo | null, readonly foldingDelegate: EditorFoldingStateDelegate, readonly eventDispatcher: NotebookEventDispatcher, - private readonly _mdRenderer: MarkdownRenderer, - @ITextModelService private readonly _modelService: ITextModelService) { + private readonly _mdRenderer: MarkdownRenderer + ) { super(viewType, model, UUID.generateUuid()); this._layoutInfo = { @@ -114,7 +119,7 @@ export class MarkdownCellViewModel extends BaseCellViewModel implements ICellVie } hasDynamicHeight() { - return true; + return false; } getHeight(lineHeight: number) { @@ -135,23 +140,33 @@ export class MarkdownCellViewModel extends BaseCellViewModel implements ICellVie return this._html; } let renderer = this.getMarkdownRenderer(); - this._html = renderer.render({ value: this.getText(), isTrusted: true }).element; + const text = this.getText(); + + if (text.length === 0) { + const el = document.createElement('p'); + el.className = 'emptyMarkdownPlaceholder'; + el.innerText = nls.localize('notebook.emptyMarkdownPlaceholder', "Empty markdown cell, double click or press enter to edit."); + this._html = el; + } else { + this._html = renderer.render({ value: this.getText(), isTrusted: true }).element; + } + return this._html; } return null; } async resolveTextModel(): Promise { - if (!this._textModel) { - const ref = await this._modelService.createModelReference(this.model.uri); - this._textModel = ref.object.textEditorModel; + if (!this.textModel) { + const ref = await this.model.resolveTextModelRef(); + this.textModel = ref.object.textEditorModel; this._register(ref); - this._register(this._textModel.onDidChangeContent(() => { + this._register(this.textModel.onDidChangeContent(() => { this._html = null; this._onDidChangeState.fire({ contentChanged: true }); })); } - return this._textModel; + return this.textModel; } onDeselect() { diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts index 6e9b0672769..7b63095557b 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts @@ -19,7 +19,6 @@ import { WorkspaceTextEdit } from 'vs/editor/common/modes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { CellEditState, CellFindMatch, ICellRange, ICellViewModel, NotebookLayoutInfo, IEditableCellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { DeleteCellEdit, InsertCellEdit, MoveCellEdit, SpliceCellsEdit, JoinCellEdit, SplitCellEdit } from 'vs/workbench/contrib/notebook/browser/viewModel/cellEdit'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { NotebookEventDispatcher, NotebookMetadataChangedEvent } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher'; import { CellFoldingState, EditorFoldingStateDelegate } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; @@ -31,6 +30,8 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { MarkdownRenderer } from 'vs/workbench/contrib/notebook/browser/view/renderers/mdRenderer'; import { dirname } from 'vs/base/common/resources'; import { IPosition, Position } from 'vs/editor/common/core/position'; +import { SplitCellEdit, JoinCellEdit } from 'vs/workbench/contrib/notebook/browser/viewModel/cellEdit'; +import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel'; import { PieceTreeTextBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer'; export interface INotebookEditorViewState { @@ -41,7 +42,7 @@ export interface INotebookEditorViewState { scrollPosition?: { left: number; top: number; }; focus?: number; editorFocused?: boolean; - contributionsState?: { [id: string]: any }; + contributionsState?: { [id: string]: unknown }; } export interface ICellModelDecorations { @@ -199,7 +200,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return this._notebook.metadata; } - private readonly _onDidChangeViewCells = new Emitter(); + private readonly _onDidChangeViewCells = this._register(new Emitter()); get onDidChangeViewCells(): Event { return this._onDidChangeViewCells.event; } private _lastNotebookEditResource: URI[] = []; @@ -215,7 +216,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return this._layoutInfo; } - private readonly _onDidChangeSelection = new Emitter(); + private readonly _onDidChangeSelection = this._register(new Emitter()); get onDidChangeSelection(): Event { return this._onDidChangeSelection.event; } private _selections: number[] = []; @@ -242,15 +243,20 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD public readonly id: string; private _foldingRanges: FoldingRegions | null = null; private _hiddenRanges: ICellRange[] = []; + private _focused: boolean = true; + + get focused() { + return this._focused; + } constructor( public viewType: string, private _notebook: NotebookTextModel, readonly eventDispatcher: NotebookEventDispatcher, private _layoutInfo: NotebookLayoutInfo | null, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IBulkEditService private readonly bulkEditService: IBulkEditService, - @IUndoRedoService private readonly undoService: IUndoRedoService + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IBulkEditService private readonly _bulkEditService: IBulkEditService, + @IUndoRedoService private readonly _undoService: IUndoRedoService ) { super(); @@ -259,23 +265,20 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD this._instanceId = strings.singleLetterHash(MODEL_ID); this._register(this._notebook.onDidChangeCells(e => { - const diffs = e.map(splice => { + const diffs = e.splices.map(splice => { return [splice[0], splice[1], splice[2].map(cell => { - return createCellViewModel(this.instantiationService, this, cell as NotebookCellTextModel); + return createCellViewModel(this._instantiationService, this, cell as NotebookCellTextModel); })] as [number, number, CellViewModel[]]; }); - const undoDiff = diffs.map(diff => { - const deletedCells = this.viewCells.slice(diff[0], diff[0] + diff[1]); - - return [diff[0], deletedCells, diff[2]] as [number, CellViewModel[], CellViewModel[]]; - }); - diffs.reverse().forEach(diff => { const deletedCells = this._viewCells.splice(diff[0], diff[1], ...diff[2]); + this._decorationsTree.acceptReplace(diff[0], diff[1], diff[2].length, true); deletedCells.forEach(cell => { this._handleToViewCellMapping.delete(cell.handle); + // dispsoe the cell to release ref to the cell text document + cell.dispose(); }); diff[2].forEach(cell => { @@ -285,7 +288,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD }); this._onDidChangeViewCells.fire({ - synchronous: true, + synchronous: e.synchronous, splices: diffs }); @@ -315,12 +318,6 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD } } - this.undoService.pushElement(new SpliceCellsEdit(this.uri, undoDiff, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - setSelections: this._setSelectionsDelegate.bind(this) - }, this.selectionHandles, endSelectionHandles)); - this.selectionHandles = endSelectionHandles; })); @@ -328,6 +325,13 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD this.eventDispatcher.emit([new NotebookMetadataChangedEvent(e)]); })); + this._register(this._notebook.emitSelections(selections => { + // text model emit selection change (for example, undo/redo) + // we should update the selection handle wisely + // TODO, if the editor is note selected, undo/redo should not change the focused element selection + this.updateSelectionsFromEdits(selections); + })); + this._register(this.eventDispatcher.onDidChangeLayout((e) => { this._layoutInfo = e.value; @@ -345,7 +349,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD })); this._viewCells = this._notebook!.cells.map(cell => { - return createCellViewModel(this.instantiationService, this, cell); + return createCellViewModel(this._instantiationService, this, cell); }); this._viewCells.forEach(cell => { @@ -353,6 +357,16 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD }); } + setFocus(focused: boolean) { + this._focused = focused; + } + + updateSelectionsFromEdits(selections: number[]) { + if (this._focused) { + this.selectionHandles = selections; + } + } + getFoldingStartIndex(index: number): number { if (!this._foldingRanges) { return -1; @@ -582,87 +596,20 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return result; } - private _createCellDelegate(index: number, source: string | string[], language: string, type: CellKind) { - const cell = this._notebook.createCellTextModel(source, language, type, [], undefined); - let newCell: CellViewModel = createCellViewModel(this.instantiationService, this, cell); - this._viewCells!.splice(index, 0, newCell); - this._handleToViewCellMapping.set(newCell.handle, newCell); - this._notebook.insertNewCell(index, [cell]); - this._localStore.add(newCell); - this._decorationsTree.acceptReplace(index, 0, 1, true); - this._onDidChangeViewCells.fire({ synchronous: true, splices: [[index, 0, [newCell]]] }); - return newCell; - } - - private _insertCellDelegate(insertIndex: number, insertCell: CellViewModel) { - this._viewCells!.splice(insertIndex, 0, insertCell); - this._handleToViewCellMapping.set(insertCell.handle, insertCell); - this._notebook.insertNewCell(insertIndex, [insertCell.model as NotebookCellTextModel]); - this._localStore.add(insertCell); - this._onDidChangeViewCells.fire({ synchronous: true, splices: [[insertIndex, 0, [insertCell]]] }); - } - - private _deleteCellDelegate(deleteIndex: number) { - const deleteCell = this._viewCells[deleteIndex]; - this._viewCells.splice(deleteIndex, 1); - this._handleToViewCellMapping.delete(deleteCell.handle); - - this._notebook.removeCell(deleteIndex, 1); - this._decorationsTree.acceptReplace(deleteIndex, 1, 0, true); - this._onDidChangeViewCells.fire({ synchronous: true, splices: [[deleteIndex, 1, []]] }); - } - - private _setSelectionsDelegate(selections: number[]) { - this.selectionHandles = selections; - } - createCell(index: number, source: string | string[], language: string, type: CellKind, metadata: NotebookCellMetadata | undefined, synchronous: boolean, pushUndoStop: boolean = true) { - const cell = this._notebook.createCellTextModel(source, language, type, [], metadata); - let newCell: CellViewModel = createCellViewModel(this.instantiationService, this, cell); - this._viewCells!.splice(index, 0, newCell); - this._handleToViewCellMapping.set(newCell.handle, newCell); - this._notebook.insertNewCell(index, [cell]); - this._localStore.add(newCell); - - if (pushUndoStop) { - this.undoService.pushElement(new InsertCellEdit(this.uri, index, newCell, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - setSelections: this._setSelectionsDelegate.bind(this) - }, this.selectionHandles, this.selectionHandles)); - } - - this._decorationsTree.acceptReplace(index, 0, 1, true); - this._onDidChangeViewCells.fire({ synchronous: synchronous, splices: [[index, 0, [newCell]]] }); - return newCell; + this._notebook.createCell2(index, source, language, type, metadata, synchronous, pushUndoStop, undefined, undefined); + // TODO, rely on createCell to be sync + return this.viewCells[index]; } - insertCell(index: number, cell: NotebookCellTextModel, synchronous: boolean): CellViewModel { - let newCell: CellViewModel = createCellViewModel(this.instantiationService, this, cell); - this._viewCells!.splice(index, 0, newCell); - this._handleToViewCellMapping.set(newCell.handle, newCell); - - this._notebook.insertNewCell(index, [newCell.model]); - this._localStore.add(newCell); - this.undoService.pushElement(new InsertCellEdit(this.uri, index, newCell, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - setSelections: this._setSelectionsDelegate.bind(this) - }, this.selectionHandles, this.selectionHandles)); - - this._decorationsTree.acceptReplace(index, 0, 1, true); - this._onDidChangeViewCells.fire({ synchronous: synchronous, splices: [[index, 0, [newCell]]] }); - return newCell; + insertCell(index: number, cell: NotebookCellTextModel, synchronous: boolean, pushUndoStop: boolean = true): CellViewModel { + this._notebook.insertCell2(index, cell, synchronous, pushUndoStop); + // TODO, rely on createCell to be sync // this will trigger it to synchronous update + return this._viewCells[index]; } deleteCell(index: number, synchronous: boolean, pushUndoStop: boolean = true) { const primarySelectionIndex = this.selectionHandles.length ? this._viewCells.indexOf(this.getCellByHandle(this.selectionHandles[0])!) : null; - - let viewCell = this._viewCells[index]; - this._viewCells.splice(index, 1); - this._handleToViewCellMapping.delete(viewCell.handle); - this._notebook.removeCell(index, 1); - let endSelections: number[] = []; if (this.selectionHandles.length) { const primarySelectionHandle = this.selectionHandles[0]; @@ -680,23 +627,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD } } - if (pushUndoStop) { - this.undoService.pushElement(new DeleteCellEdit(this.uri, index, viewCell, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - createCellViewModel: (cell: NotebookCellTextModel) => { - return createCellViewModel(this.instantiationService, this, cell); - }, - setSelections: this._setSelectionsDelegate.bind(this) - }, this.selectionHandles, endSelections)); - } - - this.selectionHandles = endSelections; - - this._decorationsTree.acceptReplace(index, 1, 0, true); - - this._onDidChangeViewCells.fire({ synchronous: synchronous, splices: [[index, 1, []]] }); - viewCell.dispose(); + this._notebook.deleteCell2(index, synchronous, pushUndoStop, this.selectionHandles, endSelections); } moveCellToIdx(index: number, newIdx: number, synchronous: boolean, pushedToUndoStack: boolean = true): boolean { @@ -705,28 +636,11 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return false; } - this.viewCells.splice(index, 1); - this.viewCells!.splice(newIdx, 0, viewCell); - this._notebook.moveCellToIdx(index, newIdx); - - if (pushedToUndoStack) { - this.undoService.pushElement(new MoveCellEdit(this.uri, index, newIdx, { - moveCell: (fromIndex: number, toIndex: number) => { - this.moveCellToIdx(fromIndex, toIndex, true, false); - }, - setSelections: this._setSelectionsDelegate.bind(this) - }, this.selectionHandles, this.selectionHandles)); - } - - this.selectionHandles = this.selectionHandles; - - this._onDidChangeViewCells.fire({ synchronous: synchronous, splices: [[index, 1, []]] }); - this._onDidChangeViewCells.fire({ synchronous: synchronous, splices: [[newIdx, 0, [viewCell]]] }); - + this._notebook.moveCellToIdx2(index, newIdx, synchronous, pushedToUndoStack, undefined, [viewCell.handle]); return true; } - private pushIfAbsent(positions: IPosition[], p: IPosition) { + private _pushIfAbsent(positions: IPosition[], p: IPosition) { const last = positions.length > 0 ? positions[positions.length - 1] : undefined; if (!last || last.lineNumber !== p.lineNumber || last.column !== p.column) { positions.push(p); @@ -738,7 +652,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD * Move end of line split points to the beginning of the next line; * Avoid duplicate split points */ - private splitPointsToBoundaries(splitPoints: IPosition[], textBuffer: IReadonlyTextBuffer): IPosition[] | null { + private _splitPointsToBoundaries(splitPoints: IPosition[], textBuffer: IReadonlyTextBuffer): IPosition[] | null { const boundaries: IPosition[] = []; const lineCnt = textBuffer.getLineCount(); const getLineLen = (lineNumber: number) => { @@ -753,24 +667,24 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD }); // eat-up any split point at the beginning, i.e. we ignore the split point at the very beginning - this.pushIfAbsent(boundaries, new Position(1, 1)); + this._pushIfAbsent(boundaries, new Position(1, 1)); for (let sp of splitPoints) { if (getLineLen(sp.lineNumber) + 1 === sp.column && sp.lineNumber < lineCnt) { sp = new Position(sp.lineNumber + 1, 1); } - this.pushIfAbsent(boundaries, sp); + this._pushIfAbsent(boundaries, sp); } // eat-up any split point at the beginning, i.e. we ignore the split point at the very end - this.pushIfAbsent(boundaries, new Position(lineCnt, getLineLen(lineCnt) + 1)); + this._pushIfAbsent(boundaries, new Position(lineCnt, getLineLen(lineCnt) + 1)); // if we only have two then they describe the whole range and nothing needs to be split return boundaries.length > 2 ? boundaries : null; } - private computeCellLinesContents(cell: IEditableCellViewModel, splitPoints: IPosition[]): string[] | null { - const rangeBoundaries = this.splitPointsToBoundaries(splitPoints, cell.textBuffer); + private _computeCellLinesContents(cell: IEditableCellViewModel, splitPoints: IPosition[]): string[] | null { + const rangeBoundaries = this._splitPointsToBoundaries(splitPoints, cell.textBuffer); if (!rangeBoundaries) { return null; } @@ -804,27 +718,14 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return null; } - let newLinesContents = this.computeCellLinesContents(cell, splitPoints); + let newLinesContents = this._computeCellLinesContents(cell, splitPoints); if (newLinesContents) { - const editorSelections = cell.getSelections(); - // update the contents of the first cell - cell.textModel.applyEdits([ - { range: cell.textModel.getFullModelRange(), text: newLinesContents[0] } - ], false); - - // create new cells based on the new text models - const language = cell.model.language; + this._notebook.splitNotebookCell(index, newLinesContents, this.selectionHandles); + const language = cell.language; const kind = cell.cellKind; - let insertIndex = this.getCellIndex(cell) + 1; - const newCells = []; - for (let j = 1; j < newLinesContents.length; j++, insertIndex++) { - newCells.push(this.createCell(insertIndex, newLinesContents[j], language, kind, undefined, true, false)); - } - this.selectionHandles = [cell.handle]; - - this.undoService.pushElement(new SplitCellEdit( + this._undoService.pushElement(new SplitCellEdit( this.uri, index, cell, @@ -833,16 +734,17 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD language, kind, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - createCellViewModel: (cell: NotebookCellTextModel) => { - return createCellViewModel(this.instantiationService, this, cell); + createCell: (index: number, source: string | string[], language: string, type: CellKind) => { + return this.createCell(index, source, language, type, undefined, true, false) as BaseCellViewModel; }, - createCell: this._createCellDelegate.bind(this), - setSelections: this._setSelectionsDelegate.bind(this) + deleteCell: (index: number) => { + this.deleteCell(index, true, false); + }, + emitSelections: (selections: number[]) => { + this.updateSelectionsFromEdits(selections); + } } )); - return newCells; } } @@ -898,7 +800,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD await this.deleteCell(index, true, false); - this.undoService.pushElement(new JoinCellEdit( + this._undoService.pushElement(new JoinCellEdit( this.uri, index, direction, @@ -908,12 +810,18 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD insertContent, cell, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - createCellViewModel: (cell: NotebookCellTextModel) => { - return createCellViewModel(this.instantiationService, this, cell); + insertCell: (index: number, cell: NotebookCellTextModel) => { + this.insertCell(index, cell, true, false); }, - setSelections: this._setSelectionsDelegate.bind(this) + deleteCell: (index: number) => { + this.deleteCell(index, true, false); + }, + createCellViewModel: (cell: NotebookCellTextModel) => { + return createCellViewModel(this._instantiationService, this, cell); + }, + emitSelections: (selections: number[]) => { + this.updateSelectionsFromEdits(selections); + } }) ); @@ -946,7 +854,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD await this.deleteCell(index + 1, true, false); - this.undoService.pushElement(new JoinCellEdit( + this._undoService.pushElement(new JoinCellEdit( this.uri, index + 1, direction, @@ -956,12 +864,18 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD insertContent, below, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - createCellViewModel: (cell: NotebookCellTextModel) => { - return createCellViewModel(this.instantiationService, this, cell); + insertCell: (index: number, cell: NotebookCellTextModel) => { + this.insertCell(index, cell, true, false); }, - setSelections: this._setSelectionsDelegate.bind(this) + deleteCell: (index: number) => { + this.deleteCell(index, true, false); + }, + createCellViewModel: (cell: NotebookCellTextModel) => { + return createCellViewModel(this._instantiationService, this, cell); + }, + emitSelections: (selections: number[]) => { + this.updateSelectionsFromEdits(selections); + } }) ); @@ -1092,7 +1006,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD const viewCell = cell as CellViewModel; this._lastNotebookEditResource.push(viewCell.uri); return viewCell.resolveTextModel().then(() => { - this.bulkEditService.apply({ edits: [{ edit: { range: range, text: text }, resource: cell.uri }] }, { quotableLabel: 'Notebook Replace' }); + this._bulkEditService.apply({ edits: [{ edit: { range: range, text: text }, resource: cell.uri }] }, { quotableLabel: 'Notebook Replace' }); }); } @@ -1116,21 +1030,17 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return Promise.all(matches.map(match => { return match.cell.resolveTextModel(); })).then(async () => { - this.bulkEditService.apply({ edits: textEdits }, { quotableLabel: 'Notebook Replace All' }); + this._bulkEditService.apply({ edits: textEdits }, { quotableLabel: 'Notebook Replace All' }); return; }); } - canUndo(): boolean { - return this.undoService.canUndo(this.uri); + async undo() { + await this._undoService.undo(this.uri); } - undo() { - this.undoService.undo(this.uri); - } - - redo() { - this.undoService.redo(this.uri); + async redo() { + await this._undoService.redo(this.uri); } equal(notebook: NotebookTextModel) { diff --git a/src/vs/workbench/contrib/notebook/common/model/cellEdit.ts b/src/vs/workbench/contrib/notebook/common/model/cellEdit.ts new file mode 100644 index 00000000000..2bf2293f03c --- /dev/null +++ b/src/vs/workbench/contrib/notebook/common/model/cellEdit.ts @@ -0,0 +1,184 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IResourceUndoRedoElement, UndoRedoElementType } from 'vs/platform/undoRedo/common/undoRedo'; +import { URI } from 'vs/base/common/uri'; +import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; + +/** + * It should not modify Undo/Redo stack + */ +export interface ITextCellEditingDelegate { + insertCell?(index: number, cell: NotebookCellTextModel): void; + deleteCell?(index: number): void; + moveCell?(fromIndex: number, toIndex: number, beforeSelections: number[] | undefined, endSelections: number[] | undefined): void; + emitSelections(selections: number[]): void; +} + + +export class InsertCellEdit implements IResourceUndoRedoElement { + type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; + label: string = 'Insert Cell'; + constructor( + public resource: URI, + private insertIndex: number, + private cell: NotebookCellTextModel, + private editingDelegate: ITextCellEditingDelegate, + private beforedSelections: number[] | undefined, + private endSelections: number[] | undefined + ) { + } + + undo(): void | Promise { + if (!this.editingDelegate.deleteCell) { + throw new Error('Notebook Delete Cell not implemented for Undo/Redo'); + } + + this.editingDelegate.deleteCell(this.insertIndex); + if (this.beforedSelections) { + this.editingDelegate.emitSelections(this.beforedSelections); + } + } + redo(): void | Promise { + if (!this.editingDelegate.insertCell) { + throw new Error('Notebook Insert Cell not implemented for Undo/Redo'); + } + + this.editingDelegate.insertCell(this.insertIndex, this.cell); + if (this.endSelections) { + this.editingDelegate.emitSelections(this.endSelections); + } + } +} + +export class DeleteCellEdit implements IResourceUndoRedoElement { + type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; + label: string = 'Delete Cell'; + constructor( + public resource: URI, + private insertIndex: number, + private _cell: NotebookCellTextModel, + private editingDelegate: ITextCellEditingDelegate, + private beforedSelections: number[] | undefined, + private endSelections: number[] | undefined + ) { + + // save inmem text to `ICell` + // no needed any more as the text buffer is transfered to `raw_cell` + // this._rawCell.source = [cell.getText()]; + } + + undo(): void | Promise { + if (!this.editingDelegate.insertCell) { + throw new Error('Notebook Insert Cell not implemented for Undo/Redo'); + } + + this.editingDelegate.insertCell(this.insertIndex, this._cell); + if (this.beforedSelections) { + this.editingDelegate.emitSelections(this.beforedSelections); + } + } + + redo(): void | Promise { + if (!this.editingDelegate.deleteCell) { + throw new Error('Notebook Delete Cell not implemented for Undo/Redo'); + } + + this.editingDelegate.deleteCell(this.insertIndex); + if (this.endSelections) { + this.editingDelegate.emitSelections(this.endSelections); + } + } +} + +export class MoveCellEdit implements IResourceUndoRedoElement { + type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; + label: string = 'Delete Cell'; + + constructor( + public resource: URI, + private fromIndex: number, + private toIndex: number, + private editingDelegate: ITextCellEditingDelegate, + private beforedSelections: number[] | undefined, + private endSelections: number[] | undefined + ) { + } + + undo(): void | Promise { + if (!this.editingDelegate.moveCell) { + throw new Error('Notebook Move Cell not implemented for Undo/Redo'); + } + + this.editingDelegate.moveCell(this.toIndex, this.fromIndex, this.endSelections, this.beforedSelections); + if (this.beforedSelections) { + this.editingDelegate.emitSelections(this.beforedSelections); + } + } + + redo(): void | Promise { + if (!this.editingDelegate.moveCell) { + throw new Error('Notebook Move Cell not implemented for Undo/Redo'); + } + + this.editingDelegate.moveCell(this.fromIndex, this.toIndex, this.beforedSelections, this.endSelections); + if (this.endSelections) { + this.editingDelegate.emitSelections(this.endSelections); + } + } +} + +export class SpliceCellsEdit implements IResourceUndoRedoElement { + type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; + label: string = 'Insert Cell'; + constructor( + public resource: URI, + private diffs: [number, NotebookCellTextModel[], NotebookCellTextModel[]][], + private editingDelegate: ITextCellEditingDelegate, + private beforeHandles: number[] | undefined, + private endHandles: number[] | undefined + ) { + } + + undo(): void | Promise { + if (!this.editingDelegate.deleteCell || !this.editingDelegate.insertCell) { + throw new Error('Notebook Insert/Delete Cell not implemented for Undo/Redo'); + } + + this.diffs.forEach(diff => { + for (let i = 0; i < diff[2].length; i++) { + this.editingDelegate.deleteCell!(diff[0]); + } + + diff[1].reverse().forEach(cell => { + this.editingDelegate.insertCell!(diff[0], cell); + }); + }); + + if (this.beforeHandles) { + this.editingDelegate.emitSelections(this.beforeHandles); + } + } + + redo(): void | Promise { + if (!this.editingDelegate.deleteCell || !this.editingDelegate.insertCell) { + throw new Error('Notebook Insert/Delete Cell not implemented for Undo/Redo'); + } + + this.diffs.reverse().forEach(diff => { + for (let i = 0; i < diff[1].length; i++) { + this.editingDelegate.deleteCell!(diff[0]); + } + + diff[2].reverse().forEach(cell => { + this.editingDelegate.insertCell!(diff[0], cell); + }); + }); + + if (this.endHandles) { + this.editingDelegate.emitSelections(this.endHandles); + } + } +} diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts index 94466d9fe03..0104f38fea1 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts @@ -4,12 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from 'vs/base/common/event'; -import { ICell, IProcessedOutput, NotebookCellOutputsSplice, CellKind, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { ICell, IProcessedOutput, NotebookCellOutputsSplice, CellKind, NotebookCellMetadata, NotebookDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; import { URI } from 'vs/base/common/uri'; import * as model from 'vs/editor/common/model'; import { Range } from 'vs/editor/common/core/range'; import { Disposable } from 'vs/base/common/lifecycle'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; export class NotebookCellTextModel extends Disposable implements ICell { private _onDidChangeOutputs = new Emitter(); @@ -69,6 +70,16 @@ export class NotebookCellTextModel extends Disposable implements ICell { return this._textBuffer; } + private _textModel?: model.ITextModel; + + get textModel(): model.ITextModel | undefined { + return this._textModel; + } + + set textModel(m: model.ITextModel | undefined) { + this._textModel = m; + } + constructor( readonly uri: URI, public handle: number, @@ -76,7 +87,8 @@ export class NotebookCellTextModel extends Disposable implements ICell { private _language: string, public cellKind: CellKind, outputs: IProcessedOutput[], - metadata: NotebookCellMetadata | undefined + metadata: NotebookCellMetadata | undefined, + private readonly _modelService: ITextModelService ) { super(); this._outputs = outputs; @@ -93,6 +105,10 @@ export class NotebookCellTextModel extends Disposable implements ICell { } } + getTextLength(): number { + return this.textBuffer.getLength(); + } + getFullModelRange() { const lineCount = this.textBuffer.getLineCount(); return new Range(1, 1, lineCount, this.textBuffer.getLineLength(lineCount) + 1); @@ -105,4 +121,37 @@ export class NotebookCellTextModel extends Disposable implements ICell { this._onDidChangeOutputs.fire(splices); } + + getEvaluatedMetadata(documentMetadata: NotebookDocumentMetadata): NotebookCellMetadata { + const editable = this.metadata?.editable ?? + documentMetadata.cellEditable; + + const runnable = this.metadata?.runnable ?? + documentMetadata.cellRunnable; + + const hasExecutionOrder = this.metadata?.hasExecutionOrder ?? + documentMetadata.cellHasExecutionOrder; + + return { + ...(this.metadata || {}), + ...{ + editable, + runnable, + hasExecutionOrder + } + }; + } + + async resolveTextModelRef() { + const ref = await this._modelService.createModelReference(this.uri); + + ref.object.textEditorModel.onWillDispose(() => { + this.textModel = undefined; + }); + return ref; + } + + dispose() { + super.dispose(); + } } diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts index 3a1ec8c6c1e..55887bdcf1b 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts @@ -9,6 +9,9 @@ import { URI } from 'vs/base/common/uri'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { INotebookTextModel, NotebookCellOutputsSplice, NotebookCellTextModelSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, CellEditType, CellUri, ICellInsertEdit, NotebookCellsChangedEvent, CellKind, IProcessedOutput, notebookDocumentMetadataDefaults, diff, ICellDeleteEdit, NotebookCellsChangeType, ICellDto2, IMainCellDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ITextSnapshot } from 'vs/editor/common/model'; +import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; +import { InsertCellEdit, DeleteCellEdit, MoveCellEdit, SpliceCellsEdit } from 'vs/workbench/contrib/notebook/common/model/cellEdit'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; function compareRangesUsingEnds(a: [number, number], b: [number, number]): number { if (a[1] === b[1]) { @@ -68,18 +71,18 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel private readonly _onWillDispose: Emitter = this._register(new Emitter()); readonly onWillDispose: Event = this._onWillDispose.event; - private readonly _onDidChangeCells = new Emitter(); - get onDidChangeCells(): Event { return this._onDidChangeCells.event; } - private _onDidModelChangeProxy = new Emitter(); + private readonly _onDidChangeCells = this._register(new Emitter<{ synchronous: boolean, splices: NotebookCellTextModelSplice[] }>()); + get onDidChangeCells() { return this._onDidChangeCells.event; } + private readonly _emitSelections = this._register(new Emitter()); + get emitSelections() { return this._emitSelections.event; } + private _onDidModelChangeProxy = this._register(new Emitter()); get onDidModelChangeProxy(): Event { return this._onDidModelChangeProxy.event; } - private _onDidSelectionChangeProxy = new Emitter(); + private _onDidSelectionChangeProxy = this._register(new Emitter()); get onDidSelectionChange(): Event { return this._onDidSelectionChangeProxy.event; } - private _onDidChangeContent = new Emitter(); + private _onDidChangeContent = this._register(new Emitter()); onDidChangeContent: Event = this._onDidChangeContent.event; - private _onDidChangeMetadata = new Emitter(); + private _onDidChangeMetadata = this._register(new Emitter()); onDidChangeMetadata: Event = this._onDidChangeMetadata.event; - private readonly _onDidChangeUnknown = new Emitter(); - readonly onDidChangeUnknown: Event = this._onDidChangeUnknown.event; private _mapping: Map = new Map(); private _cellListeners: Map = new Map(); cells: NotebookCellTextModel[]; @@ -104,15 +107,33 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel this._onDidSelectionChangeProxy.fire(this._selections); } + private _dirty = false; + protected readonly _onDidChangeDirty = this._register(new Emitter()); + readonly onDidChangeDirty = this._onDidChangeDirty.event; + constructor( public handle: number, public viewType: string, - public uri: URI + public supportBackup: boolean, + public uri: URI, + private _undoService: IUndoRedoService, + private _modelService: ITextModelService ) { super(); this.cells = []; } + get isDirty() { + return this._dirty; + } + + setDirty(newState: boolean) { + if (this._dirty !== newState) { + this._dirty = newState; + this._onDidChangeDirty.fire(); + } + } + createCellTextModel( source: string | string[], language: string, @@ -122,7 +143,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel ) { const cellHandle = this._cellhandlePool++; const cellUri = CellUri.generate(this.uri, cellHandle); - return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata); + return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata, this._modelService); } initialize(cells: ICellDto2[]) { @@ -132,12 +153,26 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel const mainCells = cells.map(cell => { const cellHandle = this._cellhandlePool++; const cellUri = CellUri.generate(this.uri, cellHandle); - return new NotebookCellTextModel(cellUri, cellHandle, cell.source, cell.language, cell.cellKind, cell.outputs || [], cell.metadata); + return new NotebookCellTextModel(cellUri, cellHandle, cell.source, cell.language, cell.cellKind, cell.outputs || [], cell.metadata, this._modelService); }); - this.insertNewCell(0, mainCells, false); + + this._isUntitled = false; + + for (let i = 0; i < mainCells.length; i++) { + this._mapping.set(mainCells[i].handle, mainCells[i]); + let dirtyStateListener = mainCells[i].onDidChangeContent(() => { + this.setDirty(true); + this._onDidChangeContent.fire(); + }); + + this._cellListeners.set(mainCells[i].handle, dirtyStateListener); + } + + this.cells.splice(0, 0, ...mainCells); + this._increaseVersionId(); } - $applyEdit(modelVersionId: number, rawEdits: ICellEditOperation[], emitToExtHost: boolean = true): boolean { + $applyEdit(modelVersionId: number, rawEdits: ICellEditOperation[], emitToExtHost: boolean, synchronous: boolean): boolean { if (modelVersionId !== this._versionId) { return false; } @@ -182,7 +217,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel const mainCells = insertEdit.cells.map(cell => { const cellHandle = this._cellhandlePool++; const cellUri = CellUri.generate(this.uri, cellHandle); - return new NotebookCellTextModel(cellUri, cellHandle, cell.source, cell.language, cell.cellKind, cell.outputs || [], cell.metadata); + return new NotebookCellTextModel(cellUri, cellHandle, cell.source, cell.language, cell.cellKind, cell.outputs || [], cell.metadata, this._modelService); }); this.insertNewCell(insertEdit.index, mainCells, false); break; @@ -214,7 +249,19 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel }); } - this._onDidChangeCells.fire(diffs); + const undoDiff = diffs.map(diff => { + const deletedCells = this.cells.slice(diff[0], diff[0] + diff[1]); + + return [diff[0], deletedCells, diff[2]] as [number, NotebookCellTextModel[], NotebookCellTextModel[]]; + }); + + this._undoService.pushElement(new SpliceCellsEdit(this.uri, undoDiff, { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + emitSelections: this._emitSelectionsDelegate.bind(this) + }, undefined, undefined)); + + this._onDidChangeCells.fire({ synchronous: synchronous, splices: diffs }); return true; } @@ -227,7 +274,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel } handleUnknownChange() { - this._onDidChangeUnknown.fire(); + this.setDirty(true); } updateLanguages(languages: string[]) { @@ -269,10 +316,12 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel let dirtyStateListener = cell.onDidChangeContent(() => { this._isUntitled = false; + this.setDirty(true); this._onDidChangeContent.fire(); }); this._cellListeners.set(cell.handle, dirtyStateListener); + this.setDirty(false); this._onDidChangeContent.fire(); this._onDidModelChangeProxy.fire({ @@ -302,6 +351,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel for (let i = 0; i < cells.length; i++) { this._mapping.set(cells[i].handle, cells[i]); let dirtyStateListener = cells[i].onDidChangeContent(() => { + this.setDirty(true); this._onDidChangeContent.fire(); }); @@ -309,7 +359,9 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel } this.cells.splice(index, 0, ...cells); + this.setDirty(true); this._onDidChangeContent.fire(); + this._increaseVersionId(); if (emitToExtHost) { @@ -344,6 +396,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel this._cellListeners.delete(cell.handle); } this.cells.splice(index, count); + this.setDirty(true); this._onDidChangeContent.fire(); this._increaseVersionId(); @@ -358,6 +411,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel const cells = this.cells.splice(index, 1); this.cells.splice(newIdx, 0, ...cells); + this.setDirty(true); this._onDidChangeContent.fire(); this._increaseVersionId(); @@ -411,9 +465,127 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel this._onDidModelChangeProxy.fire({ kind: NotebookCellsChangeType.CellsClearOutput, versionId: this._versionId }); } + //#region Notebook Text Model Edit API + + private _insertCellDelegate(insertIndex: number, insertCell: NotebookCellTextModel) { + this.insertNewCell(insertIndex, [insertCell]); + this._onDidChangeCells.fire({ synchronous: true, splices: [[insertIndex, 0, [insertCell]]] }); + } + + private _deleteCellDelegate(deleteIndex: number) { + this.removeCell(deleteIndex, 1); + this._onDidChangeCells.fire({ synchronous: true, splices: [[deleteIndex, 1, []]] }); + } + + private _emitSelectionsDelegate(selections: number[]) { + this._emitSelections.fire(selections); + } + + createCell2(index: number, source: string | string[], language: string, type: CellKind, metadata: NotebookCellMetadata | undefined, synchronous: boolean, pushUndoStop: boolean, beforeSelections: number[] | undefined, endSelections: number[] | undefined) { + const cell = this.createCellTextModel(source, language, type, [], metadata); + + if (pushUndoStop) { + this._undoService.pushElement(new InsertCellEdit(this.uri, index, cell, { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + emitSelections: this._emitSelectionsDelegate.bind(this) + }, beforeSelections, endSelections)); + } + + + this.insertNewCell(index, [cell]); + + this._onDidChangeCells.fire({ synchronous, splices: [[index, 0, [cell]]] }); + + if (endSelections) { + this._emitSelections.fire(endSelections); + } + return cell; + } + + insertCell2(index: number, cell: NotebookCellTextModel, synchronous: boolean, pushUndoStop: boolean): void { + if (pushUndoStop) { + this._undoService.pushElement(new InsertCellEdit(this.uri, index, cell, { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + emitSelections: this._emitSelectionsDelegate.bind(this) + }, undefined, undefined)); + } + + this.insertNewCell(index, [cell]); + this._onDidChangeCells.fire({ synchronous: synchronous, splices: [[index, 0, [cell]]] }); + } + + deleteCell2(index: number, synchronous: boolean, pushUndoStop: boolean, beforeSelections: number[] | undefined, endSelections: number[] | undefined) { + const cell = this.cells[index]; + if (pushUndoStop) { + this._undoService.pushElement(new DeleteCellEdit(this.uri, index, cell, { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + emitSelections: this._emitSelectionsDelegate.bind(this) + }, beforeSelections, endSelections)); + } + + this.removeCell(index, 1); + this._onDidChangeCells.fire({ synchronous: synchronous, splices: [[index, 1, []]] }); + if (endSelections) { + this._emitSelections.fire(endSelections); + } + } + + moveCellToIdx2(index: number, newIdx: number, synchronous: boolean, pushedToUndoStack: boolean, beforeSelections: number[] | undefined, endSelections: number[] | undefined): boolean { + const cell = this.cells[index]; + if (pushedToUndoStack) { + this._undoService.pushElement(new MoveCellEdit(this.uri, index, newIdx, { + moveCell: (fromIndex: number, toIndex: number, beforeSelections: number[] | undefined, endSelections: number[] | undefined) => { + this.moveCellToIdx2(fromIndex, toIndex, true, false, beforeSelections, endSelections); + }, + emitSelections: this._emitSelectionsDelegate.bind(this) + }, beforeSelections, endSelections)); + } + + this.moveCellToIdx(index, newIdx); + // todo, we can't emit this change as it will create a new view model and that will hold + // a new reference to the document, thus + this._onDidChangeCells.fire({ synchronous: synchronous, splices: [[index, 1, []]] }); + this._onDidChangeCells.fire({ synchronous: synchronous, splices: [[newIdx, 0, [cell]]] }); + if (endSelections) { + this._emitSelections.fire(endSelections); + } + + return true; + } + + async splitNotebookCell(index: number, newLinesContents: string[], endSelections: number[]) { + const cell = this.cells[index]; + + if (!cell.textModel) { + return; + } + + cell.textModel.applyEdits([ + { range: cell.textModel.getFullModelRange(), text: newLinesContents[0] } + ], false); + + // create new cells based on the new text models + const language = cell.language; + const kind = cell.cellKind; + let insertIndex = index + 1; + const newCells = []; + for (let j = 1; j < newLinesContents.length; j++, insertIndex++) { + newCells.push(this.createCell2(insertIndex, newLinesContents[j], language, kind, undefined, true, false, undefined, undefined)); + } + + if (endSelections) { + this._emitSelections.fire(endSelections); + } + } + //#endregion + dispose() { this._onWillDispose.fire(); this._cellListeners.forEach(val => val.dispose()); + this.cells.forEach(cell => cell.dispose()); super.dispose(); } } diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index 2a5b2337860..efaf1248a3d 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -70,7 +70,7 @@ export interface NotebookDocumentMetadata { cellRunnable: boolean; cellHasExecutionOrder: boolean; displayOrder?: GlobPattern[]; - custom?: { [key: string]: any }; + custom?: { [key: string]: unknown }; } export enum NotebookCellRunState { @@ -90,7 +90,7 @@ export interface NotebookCellMetadata { runState?: NotebookCellRunState; runStartTime?: number; lastRunDuration?: number; - custom?: { [key: string]: any }; + custom?: { [key: string]: unknown }; } export interface INotebookDisplayOrder { @@ -99,8 +99,7 @@ export interface INotebookDisplayOrder { } export interface INotebookMimeTypeSelector { - type: string; - subTypes?: string[]; + mimeTypes?: string[]; } export interface INotebookRendererInfo { @@ -158,7 +157,7 @@ export interface NotebookCellOutputMetadata { /** * Additional attributes of a cell metadata. */ - custom?: { [key: string]: any }; + custom?: { [key: string]: unknown }; } export interface IDisplayOutput { @@ -166,7 +165,7 @@ export interface IDisplayOutput { /** * { mime_type: value } */ - data: { [key: string]: any; } + data: { [key: string]: unknown; } metadata?: NotebookCellOutputMetadata; } @@ -186,7 +185,8 @@ export interface IOrderedMimeType { export interface ITransformedDisplayOutputDto { outputKind: CellOutputKind.Rich; - data: { [key: string]: any; } + outputId: string; + data: { [key: string]: unknown; } metadata?: NotebookCellOutputMetadata; orderedMimeTypes?: IOrderedMimeType[]; @@ -206,6 +206,7 @@ export type IRawOutput = IDisplayOutput | IStreamOutput | IErrorOutput; export interface IOutputRenderRequestOutputInfo { index: number; + outputId: string; handlerId: string; mimeType: string; output?: IRawOutput; @@ -222,6 +223,7 @@ export interface IOutputRenderRequest { export interface IOutputRenderResponseOutputInfo { index: number; + outputId: string; mimeType: string; handlerId: string; transformedOutput: string; @@ -267,9 +269,8 @@ export interface INotebookTextModel { languages: string[]; cells: ICell[]; renderers: Set; - onDidChangeCells?: Event; + onDidChangeCells?: Event<{ synchronous: boolean, splices: NotebookCellTextModelSplice[] }>; onDidChangeContent: Event; - onDidChangeUnknown: Event; onWillDispose(listener: () => void): IDisposable; } @@ -565,6 +566,7 @@ export interface INotebookEditorModel extends IEditorModel { readonly viewType: string; readonly notebook: NotebookTextModel; isDirty(): boolean; + isUntitled(): boolean; save(): Promise; saveAs(target: URI): Promise; revert(options?: IRevertOptions | undefined): Promise; @@ -579,6 +581,7 @@ export interface INotebookTextModelBackup { export interface NotebookDocumentBackupData { readonly viewType: string; readonly name: string; + readonly backupId?: string; } export interface IEditor extends editorCommon.ICompositeCodeEditor { diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts index 7288c991824..fb527c2fde1 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts @@ -7,12 +7,9 @@ import { EditorModel, IRevertOptions } from 'vs/workbench/common/editor'; import { Emitter, Event } from 'vs/base/common/event'; import { INotebookEditorModel, NotebookDocumentBackupData } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ResourceMap } from 'vs/base/common/map'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { URI } from 'vs/base/common/uri'; -import { IWorkingCopyService, IWorkingCopy, IWorkingCopyBackup } from 'vs/workbench/services/workingCopy/common/workingCopyService'; +import { IWorkingCopyService, IWorkingCopy, IWorkingCopyBackup, WorkingCopyCapabilities } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { basename } from 'vs/base/common/resources'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; @@ -38,7 +35,6 @@ export interface INotebookLoadOptions { export class NotebookEditorModel extends EditorModel implements IWorkingCopy, INotebookEditorModel { - private _dirty = false; protected readonly _onDidChangeDirty = this._register(new Emitter()); readonly onDidChangeDirty = this._onDidChangeDirty.event; private readonly _onDidChangeContent = this._register(new Emitter()); @@ -60,9 +56,9 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN constructor( public readonly resource: URI, public readonly viewType: string, - @INotebookService private readonly notebookService: INotebookService, - @IWorkingCopyService private readonly workingCopyService: IWorkingCopyService, - @IBackupFileService private readonly backupFileService: IBackupFileService + @INotebookService private readonly _notebookService: INotebookService, + @IWorkingCopyService private readonly _workingCopyService: IWorkingCopyService, + @IBackupFileService private readonly _backupFileService: IBackupFileService ) { super(); @@ -71,7 +67,7 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN const workingCopyAdapter = new class implements IWorkingCopy { readonly resource = input._workingCopyResource; get name() { return input.name; } - readonly capabilities = input.capabilities; + readonly capabilities = input.isUntitled() ? WorkingCopyCapabilities.Untitled : input.capabilities; readonly onDidChangeDirty = input.onDidChangeDirty; readonly onDidChangeContent = input.onDidChangeContent; isDirty(): boolean { return input.isDirty(); } @@ -80,48 +76,62 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN revert(options?: IRevertOptions): Promise { return input.revert(options); } }; - this._register(this.workingCopyService.registerWorkingCopy(workingCopyAdapter)); + this._register(this._workingCopyService.registerWorkingCopy(workingCopyAdapter)); } capabilities = 0; async backup(): Promise> { - return { - meta: { - name: this._name, - viewType: this._notebook.viewType - }, - content: this._notebook.createSnapshot(true) - }; + if (this._notebook.supportBackup) { + const tokenSource = new CancellationTokenSource(); + const backupId = await this._notebookService.backup(this.viewType, this.resource, tokenSource.token); + + return { + meta: { + name: this._name, + viewType: this._notebook.viewType, + backupId: backupId + } + }; + } else { + return { + meta: { + name: this._name, + viewType: this._notebook.viewType + }, + content: this._notebook.createSnapshot(true) + }; + } } async revert(options?: IRevertOptions | undefined): Promise { if (options?.soft) { - await this.backupFileService.discardBackup(this.resource); + await this._backupFileService.discardBackup(this.resource); return; } await this.load({ forceReadFromDisk: true }); - this._dirty = false; + + this._notebook.setDirty(false); this._onDidChangeDirty.fire(); - return; } async load(options?: INotebookLoadOptions): Promise { if (options?.forceReadFromDisk) { - return this.loadFromProvider(true); + return this.loadFromProvider(true, undefined, undefined); } + if (this.isResolved()) { return this; } - const backup = await this.backupFileService.resolve(this._workingCopyResource); + const backup = await this._backupFileService.resolve(this._workingCopyResource); if (this.isResolved()) { return this; // Make sure meanwhile someone else did not succeed in loading } - if (backup) { + if (backup && backup.meta?.backupId === undefined) { try { return await this.loadFromBackup(backup.value.create(DefaultEndOfLine.LF), options?.editorId); } catch (error) { @@ -129,46 +139,51 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN } } - return this.loadFromProvider(false, options?.editorId); + return this.loadFromProvider(false, options?.editorId, backup?.meta?.backupId); } private async loadFromBackup(content: ITextBuffer, editorId?: string): Promise { const fullRange = content.getRangeAt(0, content.getLength()); const data = JSON.parse(content.getValueInRange(fullRange, EndOfLinePreference.LF)); - const notebook = await this.notebookService.createNotebookFromBackup(this.viewType!, this.resource, data.metadata, data.languages, data.cells, editorId); + const notebook = await this._notebookService.createNotebookFromBackup(this.viewType!, this.resource, data.metadata, data.languages, data.cells, editorId); this._notebook = notebook!; + this._register(this._notebook); this._name = basename(this._notebook!.uri); this._register(this._notebook.onDidChangeContent(() => { - this.setDirty(true); this._onDidChangeContent.fire(); })); - this._register(this._notebook.onDidChangeUnknown(() => { - this.setDirty(true); + this._register(this._notebook.onDidChangeDirty(() => { + this._onDidChangeDirty.fire(); })); - await this.backupFileService.discardBackup(this._workingCopyResource); - this.setDirty(true); + await this._backupFileService.discardBackup(this._workingCopyResource); + this._notebook.setDirty(true); return this; } - private async loadFromProvider(forceReloadFromDisk: boolean, editorId?: string) { - const notebook = await this.notebookService.resolveNotebook(this.viewType!, this.resource, forceReloadFromDisk, editorId); + private async loadFromProvider(forceReloadFromDisk: boolean, editorId: string | undefined, backupId: string | undefined) { + const notebook = await this._notebookService.resolveNotebook(this.viewType!, this.resource, forceReloadFromDisk, editorId, backupId); this._notebook = notebook!; + this._register(this._notebook); this._name = basename(this._notebook!.uri); this._register(this._notebook.onDidChangeContent(() => { - this.setDirty(true); this._onDidChangeContent.fire(); })); - this._register(this._notebook.onDidChangeUnknown(() => { - this.setDirty(true); + this._register(this._notebook.onDidChangeDirty(() => { + this._onDidChangeDirty.fire(); })); + if (backupId) { + await this._backupFileService.discardBackup(this._workingCopyResource); + this._notebook.setDirty(true); + } + return this; } @@ -176,146 +191,29 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN return !!this._notebook; } - setDirty(newState: boolean) { - if (this._dirty !== newState) { - this._dirty = newState; - this._onDidChangeDirty.fire(); - } + isDirty() { + return this._notebook?.isDirty; } - isDirty() { - return this._dirty; + isUntitled() { + return this.resource.scheme === Schemas.untitled; } async save(): Promise { const tokenSource = new CancellationTokenSource(); - await this.notebookService.save(this.notebook.viewType, this.notebook.uri, tokenSource.token); - this._dirty = false; - this._onDidChangeDirty.fire(); + await this._notebookService.save(this.notebook.viewType, this.notebook.uri, tokenSource.token); + this._notebook.setDirty(false); return true; } async saveAs(targetResource: URI): Promise { const tokenSource = new CancellationTokenSource(); - await this.notebookService.saveAs(this.notebook.viewType, this.notebook.uri, targetResource, tokenSource.token); - this._dirty = false; - this._onDidChangeDirty.fire(); + await this._notebookService.saveAs(this.notebook.viewType, this.notebook.uri, targetResource, tokenSource.token); + this._notebook.setDirty(false); return true; } -} -export class NotebookEditorModelManager extends Disposable implements INotebookEditorModelManager { - - private readonly mapResourceToModel = new ResourceMap(); - private readonly mapResourceToModelListeners = new ResourceMap(); - private readonly mapResourceToDisposeListener = new ResourceMap(); - private readonly mapResourceToPendingModelLoaders = new ResourceMap>(); - - // private readonly modelLoadQueue = this._register(new ResourceQueue()); - - get models(): NotebookEditorModel[] { - return [...this.mapResourceToModel.values()]; - } - constructor( - @IInstantiationService readonly instantiationService: IInstantiationService - ) { - super(); - } - - async resolve(resource: URI, viewType: string, editorId?: string): Promise { - // Return early if model is currently being loaded - const pendingLoad = this.mapResourceToPendingModelLoaders.get(resource); - if (pendingLoad) { - return pendingLoad; - } - - let modelPromise: Promise; - let model = this.get(resource); - // let didCreateModel = false; - - // Model exists - if (model) { - // if (options?.reload) { - // } else { - modelPromise = Promise.resolve(model); - // } - } - - // Model does not exist - else { - // didCreateModel = true; - const newModel = model = this.instantiationService.createInstance(NotebookEditorModel, resource, viewType); - modelPromise = model.load({ editorId }); - - this.registerModel(newModel); - } - - // Store pending loads to avoid race conditions - this.mapResourceToPendingModelLoaders.set(resource, modelPromise); - - // Make known to manager (if not already known) - this.add(resource, model); - - // dispose and bind new listeners - - try { - const resolvedModel = await modelPromise; - - // Remove from pending loads - this.mapResourceToPendingModelLoaders.delete(resource); - return resolvedModel; - } catch (error) { - // Free resources of this invalid model - if (model) { - model.dispose(); - } - - // Remove from pending loads - this.mapResourceToPendingModelLoaders.delete(resource); - - throw error; - } - } - - add(resource: URI, model: NotebookEditorModel): void { - const knownModel = this.mapResourceToModel.get(resource); - if (knownModel === model) { - return; // already cached - } - - // dispose any previously stored dispose listener for this resource - const disposeListener = this.mapResourceToDisposeListener.get(resource); - if (disposeListener) { - disposeListener.dispose(); - } - - // store in cache but remove when model gets disposed - this.mapResourceToModel.set(resource, model); - this.mapResourceToDisposeListener.set(resource, model.onDispose(() => this.remove(resource))); - } - - remove(resource: URI): void { - this.mapResourceToModel.delete(resource); - - const disposeListener = this.mapResourceToDisposeListener.get(resource); - if (disposeListener) { - dispose(disposeListener); - this.mapResourceToDisposeListener.delete(resource); - } - - const modelListener = this.mapResourceToModelListeners.get(resource); - if (modelListener) { - dispose(modelListener); - this.mapResourceToModelListeners.delete(resource); - } - } - - - private registerModel(model: NotebookEditorModel): void { - - } - - get(resource: URI): NotebookEditorModel | undefined { - return this.mapResourceToModel.get(resource); + dispose() { + super.dispose(); } } diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 06e223a2e48..dc8b486b467 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -12,25 +12,25 @@ import { INotebookTextModel, INotebookRendererInfo, NotebookDocumentMetadata, IC import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CancellationToken } from 'vs/base/common/cancellation'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; -import { INotebookEditorModelManager } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; export const INotebookService = createDecorator('notebookService'); export interface IMainNotebookController { kernel: INotebookKernelInfoDto | undefined; - createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string): Promise; + createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string, backupId?: string): Promise; + resolveNotebookEditor(viewType: string, uri: URI, editorId: string): Promise; executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise; - onDidReceiveMessage(editorId: string, message: any): void; + onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: any): void; executeNotebookCell(uri: URI, handle: number, useAttachedKernel: boolean, token: CancellationToken): Promise; removeNotebookDocument(notebook: INotebookTextModel): Promise; save(uri: URI, token: CancellationToken): Promise; saveAs(uri: URI, target: URI, token: CancellationToken): Promise; + backup(uri: URI, token: CancellationToken): Promise; } export interface INotebookService { readonly _serviceBrand: undefined; - modelManager: INotebookEditorModelManager; canResolve(viewType: string): Promise; onDidChangeActiveEditor: Event; onDidChangeVisibleEditors: Event; @@ -50,7 +50,7 @@ export interface INotebookService { unregisterNotebookKernel(id: string): void; getContributedNotebookKernels(viewType: string, resource: URI): readonly INotebookKernelInfo[]; getRendererInfo(id: string): INotebookRendererInfo | undefined; - resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string): Promise; + resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string, backupId?: string): Promise; createNotebookFromBackup(viewType: string, uri: URI, metadata: NotebookDocumentMetadata, languages: string[], cells: ICellDto2[], editorId?: string): Promise; executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise; executeNotebookCell(viewType: string, uri: URI, handle: number, useAttachedKernel: boolean, token: CancellationToken): Promise; @@ -64,13 +64,15 @@ export interface INotebookService { updateVisibleNotebookEditor(editors: string[]): void; save(viewType: string, resource: URI, token: CancellationToken): Promise; saveAs(viewType: string, resource: URI, target: URI, token: CancellationToken): Promise; - onDidReceiveMessage(viewType: string, editorId: string, message: any): void; + backup(viewType: string, uri: URI, token: CancellationToken): Promise; + onDidReceiveMessage(viewType: string, editorId: string, rendererType: string | undefined, message: unknown): void; setToCopy(items: NotebookCellTextModel[]): void; getToCopy(): NotebookCellTextModel[] | undefined; // editor events addNotebookEditor(editor: IEditor): void; removeNotebookEditor(editor: IEditor): void; + getNotebookEditor(editorId: string): IEditor | undefined; listNotebookEditors(): readonly IEditor[]; listVisibleNotebookEditors(): readonly IEditor[]; listNotebookDocuments(): readonly NotebookTextModel[]; diff --git a/src/vs/workbench/contrib/notebook/electron-browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/electron-browser/notebook.contribution.ts index 9c6734c9afe..d0e8f6b32f5 100644 --- a/src/vs/workbench/contrib/notebook/electron-browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/electron-browser/notebook.contribution.ts @@ -4,40 +4,56 @@ *--------------------------------------------------------------------------------------------*/ import { isMacintosh } from 'vs/base/common/platform'; -import { registerAction2 } from 'vs/platform/actions/common/actions'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import * as webviewCommands from 'vs/workbench/contrib/webview/electron-browser/webviewCommands'; -import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEditor'; +import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/clipboard'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { getActiveNotebookEditor } from 'vs/workbench/contrib/notebook/browser/contrib/coreActions'; import { ElectronWebviewBasedWebview } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { getActiveNotebookEditor } from 'vs/workbench/contrib/notebook/browser/contrib/coreActions'; - -function getActiveElectronBasedWebviewDelegate(accessor: ServicesAccessor): ElectronWebviewBasedWebview | undefined { +import { UndoCommand, RedoCommand } from 'vs/editor/browser/editorExtensions'; +function getFocusedElectronBasedWebviewDelegate(accessor: ServicesAccessor): ElectronWebviewBasedWebview | undefined { const editorService = accessor.get(IEditorService); const editor = getActiveNotebookEditor(editorService); + if (!editor?.hasFocus()) { + return; + } const webview = editor?.getInnerWebview(); - if (webview && webview instanceof ElectronWebviewBasedWebview) { return webview; } - return; } -function registerNotebookCommands(editorId: string): void { - const contextKeyExpr = ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', editorId), ContextKeyExpr.not('editorFocus') /* https://github.com/Microsoft/vscode/issues/58668 */)!; - - // These commands are only needed on MacOS where we have to disable the menu bar commands - if (isMacintosh) { - registerAction2(class extends webviewCommands.CopyWebviewEditorCommand { constructor() { super(contextKeyExpr, getActiveElectronBasedWebviewDelegate); } }); - registerAction2(class extends webviewCommands.PasteWebviewEditorCommand { constructor() { super(contextKeyExpr, getActiveElectronBasedWebviewDelegate); } }); - registerAction2(class extends webviewCommands.CutWebviewEditorCommand { constructor() { super(contextKeyExpr, getActiveElectronBasedWebviewDelegate); } }); - registerAction2(class extends webviewCommands.UndoWebviewEditorCommand { constructor() { super(contextKeyExpr, getActiveElectronBasedWebviewDelegate); } }); - registerAction2(class extends webviewCommands.RedoWebviewEditorCommand { constructor() { super(contextKeyExpr, getActiveElectronBasedWebviewDelegate); } }); +if (isMacintosh) { + function withWebview(accessor: ServicesAccessor, f: (webviewe: ElectronWebviewBasedWebview) => void) { + const webview = getFocusedElectronBasedWebviewDelegate(accessor); + if (webview) { + f(webview); + return true; + } + return false; } -} -registerNotebookCommands(NotebookEditor.ID); + const PRIORITY = 100; + + UndoCommand.addImplementation(PRIORITY, accessor => { + return withWebview(accessor, webview => webview.undo()); + }); + + RedoCommand.addImplementation(PRIORITY, accessor => { + return withWebview(accessor, webview => webview.redo()); + }); + + CopyAction?.addImplementation(PRIORITY, accessor => { + return withWebview(accessor, webview => webview.copy()); + }); + + PasteAction?.addImplementation(PRIORITY, accessor => { + return withWebview(accessor, webview => webview.paste()); + }); + + CutAction?.addImplementation(PRIORITY, accessor => { + return withWebview(accessor, webview => webview.cut()); + }); +} diff --git a/src/vs/workbench/contrib/notebook/test/notebookCommon.test.ts b/src/vs/workbench/contrib/notebook/test/notebookCommon.test.ts index e58e2b687db..d092389a66e 100644 --- a/src/vs/workbench/contrib/notebook/test/notebookCommon.test.ts +++ b/src/vs/workbench/contrib/notebook/test/notebookCommon.test.ts @@ -5,10 +5,14 @@ import * as assert from 'assert'; import { NOTEBOOK_DISPLAY_ORDER, sortMimeTypes, CellKind, diff, CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { TestCell } from 'vs/workbench/contrib/notebook/test/testNotebookEditor'; +import { TestCell, setupInstantiationService } from 'vs/workbench/contrib/notebook/test/testNotebookEditor'; import { URI } from 'vs/base/common/uri'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; suite('NotebookCommon', () => { + const instantiationService = setupInstantiationService(); + const textModelService = instantiationService.get(ITextModelService); + test('sortMimeTypes default orders', function () { const defaultDisplayOrder = NOTEBOOK_DISPLAY_ORDER; @@ -265,7 +269,7 @@ suite('NotebookCommon', () => { for (let i = 0; i < 5; i++) { cells.push( - new TestCell('notebook', i, [`var a = ${i};`], 'javascript', CellKind.Code, []) + new TestCell('notebook', i, [`var a = ${i};`], 'javascript', CellKind.Code, [], textModelService) ); } @@ -291,8 +295,8 @@ suite('NotebookCommon', () => { ] ); - const cellA = new TestCell('notebook', 6, ['var a = 6;'], 'javascript', CellKind.Code, []); - const cellB = new TestCell('notebook', 7, ['var a = 7;'], 'javascript', CellKind.Code, []); + const cellA = new TestCell('notebook', 6, ['var a = 6;'], 'javascript', CellKind.Code, [], textModelService); + const cellB = new TestCell('notebook', 7, ['var a = 7;'], 'javascript', CellKind.Code, [], textModelService); const modifiedCells = [ cells[0], diff --git a/src/vs/workbench/contrib/notebook/test/notebookTextModel.test.ts b/src/vs/workbench/contrib/notebook/test/notebookTextModel.test.ts index 2bad51a304a..a5e5a19039c 100644 --- a/src/vs/workbench/contrib/notebook/test/notebookTextModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/notebookTextModel.test.ts @@ -4,14 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { CellKind, CellEditType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { withTestNotebook, TestCell } from 'vs/workbench/contrib/notebook/test/testNotebookEditor'; +import { withTestNotebook, TestCell, setupInstantiationService } from 'vs/workbench/contrib/notebook/test/testNotebookEditor'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; suite('NotebookTextModel', () => { - const instantiationService = new TestInstantiationService(); + const instantiationService = setupInstantiationService(); + const textModelService = instantiationService.get(ITextModelService); const blukEditService = instantiationService.get(IBulkEditService); const undoRedoService = instantiationService.stub(IUndoRedoService, () => { }); instantiationService.spy(IUndoRedoService, 'pushElement'); @@ -29,9 +30,9 @@ suite('NotebookTextModel', () => { ], (editor, viewModel, textModel) => { textModel.$applyEdit(textModel.versionId, [ - { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [])] }, - { editType: CellEditType.Insert, index: 3, cells: [new TestCell(viewModel.viewType, 6, ['var f = 6;'], 'javascript', CellKind.Code, [])] }, - ]); + { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [], textModelService)] }, + { editType: CellEditType.Insert, index: 3, cells: [new TestCell(viewModel.viewType, 6, ['var f = 6;'], 'javascript', CellKind.Code, [], textModelService)] }, + ], true, true); assert.equal(textModel.cells.length, 6); @@ -54,9 +55,9 @@ suite('NotebookTextModel', () => { ], (editor, viewModel, textModel) => { textModel.$applyEdit(textModel.versionId, [ - { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [])] }, - { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 6, ['var f = 6;'], 'javascript', CellKind.Code, [])] }, - ]); + { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [], textModelService)] }, + { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 6, ['var f = 6;'], 'javascript', CellKind.Code, [], textModelService)] }, + ], true, true); assert.equal(textModel.cells.length, 6); @@ -81,7 +82,7 @@ suite('NotebookTextModel', () => { textModel.$applyEdit(textModel.versionId, [ { editType: CellEditType.Delete, index: 1, count: 1 }, { editType: CellEditType.Delete, index: 3, count: 1 }, - ]); + ], true, true); assert.equal(textModel.cells[0].getValue(), 'var a = 1;'); assert.equal(textModel.cells[1].getValue(), 'var c = 3;'); @@ -103,8 +104,8 @@ suite('NotebookTextModel', () => { (editor, viewModel, textModel) => { textModel.$applyEdit(textModel.versionId, [ { editType: CellEditType.Delete, index: 1, count: 1 }, - { editType: CellEditType.Insert, index: 3, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [])] }, - ]); + { editType: CellEditType.Insert, index: 3, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [], textModelService)] }, + ], true, true); assert.equal(textModel.cells.length, 4); @@ -128,8 +129,8 @@ suite('NotebookTextModel', () => { (editor, viewModel, textModel) => { textModel.$applyEdit(textModel.versionId, [ { editType: CellEditType.Delete, index: 1, count: 1 }, - { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [])] }, - ]); + { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [], textModelService)] }, + ], true, true); assert.equal(textModel.cells.length, 4); assert.equal(textModel.cells[0].getValue(), 'var a = 1;'); diff --git a/src/vs/workbench/contrib/notebook/test/notebookViewModel.test.ts b/src/vs/workbench/contrib/notebook/test/notebookViewModel.test.ts index 74800bdcf0b..f979f53344a 100644 --- a/src/vs/workbench/contrib/notebook/test/notebookViewModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/notebookViewModel.test.ts @@ -5,25 +5,25 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; -import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { CellKind, NotebookCellMetadata, diff } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { withTestNotebook, TestCell, NotebookEditorTestModel } from 'vs/workbench/contrib/notebook/test/testNotebookEditor'; +import { withTestNotebook, TestCell, NotebookEditorTestModel, setupInstantiationService } from 'vs/workbench/contrib/notebook/test/testNotebookEditor'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { NotebookEventDispatcher } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher'; import { TrackedRangeStickiness } from 'vs/editor/common/model'; import { reduceCellRanges, ICellRange } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; suite('NotebookViewModel', () => { - const instantiationService = new TestInstantiationService(); + const instantiationService = setupInstantiationService(); + const textModelService = instantiationService.get(ITextModelService); const blukEditService = instantiationService.get(IBulkEditService); - const undoRedoService = instantiationService.stub(IUndoRedoService, () => { }); - instantiationService.spy(IUndoRedoService, 'pushElement'); + const undoRedoService = instantiationService.get(IUndoRedoService); test('ctor', function () { - const notebook = new NotebookTextModel(0, 'notebook', URI.parse('test')); + const notebook = new NotebookTextModel(0, 'notebook', false, URI.parse('test'), undoRedoService, textModelService); const model = new NotebookEditorTestModel(notebook); const eventDispatcher = new NotebookEventDispatcher(); const viewModel = new NotebookViewModel('notebook', model.notebook, eventDispatcher, null, instantiationService, blukEditService, undoRedoService); @@ -43,7 +43,7 @@ suite('NotebookViewModel', () => { assert.equal(viewModel.viewCells[0].metadata?.editable, true); assert.equal(viewModel.viewCells[1].metadata?.editable, false); - const cell = viewModel.insertCell(1, new TestCell(viewModel.viewType, 0, ['var c = 3;'], 'javascript', CellKind.Code, []), true); + const cell = viewModel.insertCell(1, new TestCell(viewModel.viewType, 0, ['var c = 3;'], 'javascript', CellKind.Code, [], textModelService), true); assert.equal(viewModel.viewCells.length, 3); assert.equal(viewModel.notebookDocument.cells.length, 3); assert.equal(viewModel.getCellIndex(cell), 1); @@ -126,13 +126,13 @@ suite('NotebookViewModel', () => { const lastViewCell = viewModel.viewCells[viewModel.viewCells.length - 1]; const insertIndex = viewModel.getCellIndex(firstViewCell) + 1; - const cell = viewModel.insertCell(insertIndex, new TestCell(viewModel.viewType, 3, ['var c = 3;'], 'javascript', CellKind.Code, []), true); + const cell = viewModel.insertCell(insertIndex, new TestCell(viewModel.viewType, 3, ['var c = 3;'], 'javascript', CellKind.Code, [], textModelService), true); const addedCellIndex = viewModel.getCellIndex(cell); viewModel.deleteCell(addedCellIndex, true); const secondInsertIndex = viewModel.getCellIndex(lastViewCell) + 1; - const cell2 = viewModel.insertCell(secondInsertIndex, new TestCell(viewModel.viewType, 4, ['var d = 4;'], 'javascript', CellKind.Code, []), true); + const cell2 = viewModel.insertCell(secondInsertIndex, new TestCell(viewModel.viewType, 4, ['var d = 4;'], 'javascript', CellKind.Code, [], textModelService), true); assert.equal(viewModel.viewCells.length, 3); assert.equal(viewModel.notebookDocument.cells.length, 3); @@ -232,14 +232,14 @@ suite('NotebookViewModel', () => { }); }); -function getVisibleCells(cells: any[], hiddenRanges: ICellRange[]) { +function getVisibleCells(cells: T[], hiddenRanges: ICellRange[]) { if (!hiddenRanges.length) { return cells; } let start = 0; let hiddenRangeIndex = 0; - let result: any[] = []; + let result: T[] = []; while (start < cells.length && hiddenRangeIndex < hiddenRanges.length) { if (start < hiddenRanges[hiddenRangeIndex].start) { @@ -258,10 +258,10 @@ function getVisibleCells(cells: any[], hiddenRanges: ICellRange[]) { } suite('NotebookViewModel Decorations', () => { - const instantiationService = new TestInstantiationService(); + const instantiationService = setupInstantiationService(); + const textModelService = instantiationService.get(ITextModelService); const blukEditService = instantiationService.get(IBulkEditService); - const undoRedoService = instantiationService.stub(IUndoRedoService, () => { }); - instantiationService.spy(IUndoRedoService, 'pushElement'); + const undoRedoService = instantiationService.get(IUndoRedoService); test('tracking range', function () { withTestNotebook( @@ -283,7 +283,7 @@ suite('NotebookViewModel Decorations', () => { end: 2, }); - viewModel.insertCell(0, new TestCell(viewModel.viewType, 5, ['var d = 6;'], 'javascript', CellKind.Code, []), true); + viewModel.insertCell(0, new TestCell(viewModel.viewType, 5, ['var d = 6;'], 'javascript', CellKind.Code, [], textModelService), true); assert.deepEqual(viewModel.getTrackedRange(trackedId!), { start: 2, @@ -297,7 +297,7 @@ suite('NotebookViewModel Decorations', () => { end: 2 }); - viewModel.insertCell(3, new TestCell(viewModel.viewType, 6, ['var d = 7;'], 'javascript', CellKind.Code, []), true); + viewModel.insertCell(3, new TestCell(viewModel.viewType, 6, ['var d = 7;'], 'javascript', CellKind.Code, [], textModelService), true); assert.deepEqual(viewModel.getTrackedRange(trackedId!), { start: 1, @@ -343,14 +343,14 @@ suite('NotebookViewModel Decorations', () => { end: 3 }); - viewModel.insertCell(5, new TestCell(viewModel.viewType, 8, ['var d = 9;'], 'javascript', CellKind.Code, []), true); + viewModel.insertCell(5, new TestCell(viewModel.viewType, 8, ['var d = 9;'], 'javascript', CellKind.Code, [], textModelService), true); assert.deepEqual(viewModel.getTrackedRange(trackedId!), { start: 1, end: 3 }); - viewModel.insertCell(4, new TestCell(viewModel.viewType, 9, ['var d = 10;'], 'javascript', CellKind.Code, []), true); + viewModel.insertCell(4, new TestCell(viewModel.viewType, 9, ['var d = 10;'], 'javascript', CellKind.Code, [], textModelService), true); assert.deepEqual(viewModel.getTrackedRange(trackedId!), { start: 1, @@ -380,10 +380,10 @@ suite('NotebookViewModel Decorations', () => { }); test('diff hidden ranges', function () { - assert.deepEqual(getVisibleCells([1, 2, 3, 4, 5], []), [1, 2, 3, 4, 5]); + assert.deepEqual(getVisibleCells([1, 2, 3, 4, 5], []), [1, 2, 3, 4, 5]); assert.deepEqual( - getVisibleCells( + getVisibleCells( [1, 2, 3, 4, 5], [{ start: 1, end: 2 }] ), @@ -391,7 +391,7 @@ suite('NotebookViewModel Decorations', () => { ); assert.deepEqual( - getVisibleCells( + getVisibleCells( [1, 2, 3, 4, 5, 6, 7, 8, 9], [ { start: 1, end: 2 }, @@ -401,7 +401,7 @@ suite('NotebookViewModel Decorations', () => { [1, 4, 7, 8, 9] ); - const original = getVisibleCells( + const original = getVisibleCells( [1, 2, 3, 4, 5, 6, 7, 8, 9], [ { start: 1, end: 2 }, @@ -409,7 +409,7 @@ suite('NotebookViewModel Decorations', () => { ] ); - const modified = getVisibleCells( + const modified = getVisibleCells( [1, 2, 3, 4, 5, 6, 7, 8, 9], [ { start: 2, end: 4 } diff --git a/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts index c263fc9deb7..ed38f7366c5 100644 --- a/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts @@ -10,7 +10,6 @@ import { URI } from 'vs/base/common/uri'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { Range } from 'vs/editor/common/core/range'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { EditorModel } from 'vs/workbench/common/editor'; import { ICellRange, ICellViewModel, INotebookEditor, INotebookEditorContribution, INotebookEditorMouseEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; @@ -23,6 +22,17 @@ import { CellKind, CellUri, INotebookEditorModel, IProcessedOutput, NotebookCell import { Webview } from 'vs/workbench/contrib/webview/browser/webview'; import { ICompositeCodeEditor, IEditor } from 'vs/editor/common/editorCommon'; import { NotImplementedError } from 'vs/base/common/errors'; +import { Schemas } from 'vs/base/common/network'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; +import { UndoRedoService } from 'vs/platform/undoRedo/common/undoRedoService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; export class TestCell extends NotebookCellTextModel { constructor( @@ -31,9 +41,10 @@ export class TestCell extends NotebookCellTextModel { public source: string[], language: string, cellKind: CellKind, - outputs: IProcessedOutput[] + outputs: IProcessedOutput[], + modelService: ITextModelService ) { - super(CellUri.generate(URI.parse('test:///fake/notebook'), handle), handle, source, language, cellKind, outputs, undefined); + super(CellUri.generate(URI.parse('test:///fake/notebook'), handle), handle, source, language, cellKind, outputs, undefined, modelService); } } @@ -51,6 +62,9 @@ export class TestNotebookEditor implements INotebookEditor { constructor( ) { } + uri?: URI | undefined; + textModel?: NotebookTextModel | undefined; + hasModel(): boolean { return true; } @@ -109,7 +123,19 @@ export class TestNotebookEditor implements INotebookEditor { isNotebookEditor = true; - postMessage(message: any): void { + postMessage(): void { + throw new Error('Method not implemented.'); + } + + toggleClassName(className: string): void { + throw new Error('Method not implemented.'); + } + + addClassName(className: string): void { + throw new Error('Method not implemented.'); + } + + removeClassName(className: string): void { throw new Error('Method not implemented.'); } @@ -121,15 +147,15 @@ export class TestNotebookEditor implements INotebookEditor { throw new Error('Method not implemented.'); } - moveCellDown(cell: CellViewModel): Promise { + moveCellDown(cell: CellViewModel): Promise { throw new Error('Method not implemented.'); } - moveCellUp(cell: CellViewModel): Promise { + moveCellUp(cell: CellViewModel): Promise { throw new Error('Method not implemented.'); } - moveCell(cell: ICellViewModel, relativeToCell: ICellViewModel, direction: 'above' | 'below'): Promise { + moveCell(cell: ICellViewModel, relativeToCell: ICellViewModel, direction: 'above' | 'below'): Promise { throw new Error('Method not implemented.'); } @@ -201,8 +227,8 @@ export class TestNotebookEditor implements INotebookEditor { // throw new Error('Method not implemented.'); return; } - createInset(cell: CellViewModel, output: IProcessedOutput, shadowContent: string, offset: number): void { - // throw new Error('Method not implemented.'); + createInset(cell: CellViewModel, output: IProcessedOutput, shadowContent: string, offset: number): Promise { + return Promise.resolve(); } removeInset(output: IProcessedOutput): void { // throw new Error('Method not implemented.'); @@ -219,7 +245,7 @@ export class TestNotebookEditor implements INotebookEditor { throw new Error('Method not implemented.'); } - changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any { + changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => T): T | null { throw new Error('Method not implemented.'); } @@ -273,6 +299,10 @@ export class NotebookEditorTestModel extends EditorModel implements INotebookEdi return this._dirty; } + isUntitled() { + return this._notebook.uri.scheme === Schemas.untitled; + } + getNotebook(): NotebookTextModel { return this._notebook; } @@ -297,12 +327,26 @@ export class NotebookEditorTestModel extends EditorModel implements INotebookEdi } } -export function withTestNotebook(instantiationService: IInstantiationService, blukEditService: IBulkEditService, undoRedoService: IUndoRedoService, cells: [string[], string, CellKind, IProcessedOutput[], NotebookCellMetadata][], callback: (editor: TestNotebookEditor, viewModel: NotebookViewModel, textModel: NotebookTextModel) => void) { +export function setupInstantiationService() { + const instantiationService = new TestInstantiationService(); + + instantiationService.stub(IUndoRedoService, instantiationService.createInstance(UndoRedoService)); + instantiationService.stub(IConfigurationService, new TestConfigurationService()); + instantiationService.stub(IThemeService, new TestThemeService()); + instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); + instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); + + return instantiationService; +} + +export function withTestNotebook(instantiationService: TestInstantiationService, blukEditService: IBulkEditService, undoRedoService: IUndoRedoService, cells: [string[], string, CellKind, IProcessedOutput[], NotebookCellMetadata][], callback: (editor: TestNotebookEditor, viewModel: NotebookViewModel, textModel: NotebookTextModel) => void) { + const textModelService = instantiationService.get(ITextModelService); + const viewType = 'notebook'; const editor = new TestNotebookEditor(); - const notebook = new NotebookTextModel(0, viewType, URI.parse('test')); + const notebook = new NotebookTextModel(0, viewType, false, URI.parse('test'), undoRedoService, textModelService); notebook.cells = cells.map((cell, index) => { - return new NotebookCellTextModel(notebook.uri, index, cell[0], cell[1], cell[2], cell[3], cell[4]); + return new NotebookCellTextModel(notebook.uri, index, cell[0], cell[1], cell[2], cell[3], cell[4], textModelService); }); const model = new NotebookEditorTestModel(notebook); const eventDispatcher = new NotebookEventDispatcher(); diff --git a/src/vs/workbench/contrib/outline/browser/outlinePane.ts b/src/vs/workbench/contrib/outline/browser/outlinePane.ts index c09de9ec1a9..091ef988506 100644 --- a/src/vs/workbench/contrib/outline/browser/outlinePane.ts +++ b/src/vs/workbench/contrib/outline/browser/outlinePane.ts @@ -42,7 +42,6 @@ import { OutlineConfigKeys, OutlineViewFocused, OutlineViewFiltered } from 'vs/e import { FuzzyScore } from 'vs/base/common/filters'; import { OutlineDataSource, OutlineItemComparator, OutlineSortOrder, OutlineVirtualDelegate, OutlineGroupRenderer, OutlineElementRenderer, OutlineItem, OutlineIdentityProvider, OutlineNavigationLabelProvider, OutlineFilter, OutlineAccessibilityProvider } from 'vs/editor/contrib/documentSymbols/outlineTree'; import { IDataTreeViewState } from 'vs/base/browser/ui/tree/dataTree'; -import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { basename } from 'vs/base/common/resources'; import { IDataSource } from 'vs/base/browser/ui/tree/tree'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markersDecorationService'; @@ -344,7 +343,8 @@ export class OutlinePane extends ViewPane { hideTwistiesOfChildlessElements: true, overrideStyles: { listBackground: this.getBackgroundColor() - } + }, + openOnSingleClick: true } ); @@ -560,26 +560,11 @@ export class OutlinePane extends ViewPane { // feature: reveal outline selection in editor // on change -> reveal/select defining range this._editorDisposables.add(this._tree.onDidOpen(e => { - - let [first] = e.elements; - if (!(first instanceof OutlineElement)) { + if (!(e.element instanceof OutlineElement)) { return; } - let focus = false; - let aside = false; - // todo@Joh - if (e.browserEvent) { - if (e.browserEvent.type === 'keydown') { - focus = true; - } else if (e.browserEvent.type === 'click') { - const event = new StandardMouseEvent(e.browserEvent as MouseEvent); - focus = e.browserEvent.detail === 2; - aside = (!this._tree.useAltAsMultipleSelectionModifier && event.altKey) - || (this._tree.useAltAsMultipleSelectionModifier && (event.ctrlKey || event.metaKey)); - } - } - this._revealTreeSelection(newModel, first, focus, aside); + this._revealTreeSelection(newModel, e.element, !!e.editorOptions.preserveFocus || !e.editorOptions.pinned, e.sideBySide); })); // feature: reveal editor selection in outline @@ -633,12 +618,12 @@ export class OutlinePane extends ViewPane { })); } - private async _revealTreeSelection(model: OutlineModel, element: OutlineElement, focus: boolean, aside: boolean): Promise { + private async _revealTreeSelection(model: OutlineModel, element: OutlineElement, preserveFocus: boolean, aside: boolean): Promise { await this._editorService.openCodeEditor( { resource: model.uri, options: { - preserveFocus: !focus, + preserveFocus, selection: Range.collapseToStart(element.symbol.selectionRange), selectionRevealType: TextEditorSelectionRevealType.NearTopIfOutsideViewport, } diff --git a/src/vs/workbench/contrib/output/browser/output.contribution.ts b/src/vs/workbench/contrib/output/browser/output.contribution.ts index da7cd3b026c..ad427f0da42 100644 --- a/src/vs/workbench/contrib/output/browser/output.contribution.ts +++ b/src/vs/workbench/contrib/output/browser/output.contribution.ts @@ -243,7 +243,7 @@ registerAction2(class extends Action2 { } }); -const devCategory = { value: nls.localize('developer', "Developer"), original: 'Developer' }; +const devCategory = { value: nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"), original: 'Developer' }; registerAction2(class extends Action2 { constructor() { super({ diff --git a/src/vs/workbench/contrib/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/contrib/performance/electron-browser/performance.contribution.ts index 23be35fff85..1e2e837e13d 100644 --- a/src/vs/workbench/contrib/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/performance.contribution.ts @@ -46,7 +46,7 @@ CommandsRegistry.registerCommand('perfview.show', accessor => { MenuRegistry.addCommand({ id: 'perfview.show', - category: localize('show.cat', "Developer"), + category: localize({ key: 'show.cat', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"), title: localize('show.label', "Startup Performance") }); diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index a10b42b22cf..f2e21d347cb 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -46,6 +46,7 @@ import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { preferencesEditIcon } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; import { Color, RGBA } from 'vs/base/common/color'; import { WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; +import { ThemableCheckboxActionViewItem } from 'vs/platform/browser/checkbox'; const $ = DOM.$; @@ -376,13 +377,17 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditorP const actionBar = this._register(new ActionBar(this.actionsContainer, { animated: false, actionViewItemProvider: (action: IAction) => { + let checkboxViewItem: CheckboxActionViewItem | undefined; if (action.id === this.sortByPrecedenceAction.id) { - return new CheckboxActionViewItem(null, action); + checkboxViewItem = new ThemableCheckboxActionViewItem(null, action, undefined, this.themeService); } - if (action.id === this.recordKeysAction.id) { - return new CheckboxActionViewItem(null, action); + else if (action.id === this.recordKeysAction.id) { + checkboxViewItem = new ThemableCheckboxActionViewItem(null, action, undefined, this.themeService); } - return undefined; + if (checkboxViewItem) { + + } + return checkboxViewItem; } })); diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index f12c473cc9f..11c89f0b660 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -42,7 +42,8 @@ .settings-editor > .settings-header > .search-container > .settings-count-widget { position: absolute; right: 35px; - top: 6px; + top: 0px; + margin: 6px 0px; } .settings-editor > .settings-header > .search-container > .settings-count-widget:empty { diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css index 7e9e6b9b5b3..ccbcc852cbe 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css @@ -17,7 +17,6 @@ .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-value, .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-sibling, .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-connector, .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { white-space: pre; overflow: hidden; @@ -30,14 +29,26 @@ max-width: 10%; } .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key { + margin-left: 4px; + min-width: 40%; +} +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key { + margin-left: 0; +} +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-value, .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { - max-width: 50%; + width: 100%; +} +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row:hover .setting-list-object-value, +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row:focus .setting-list-object-value, +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row.selected .setting-list-object-value { + margin-right: 44px; } .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-value, .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-sibling, .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-connector, .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { display: inline-block; line-height: 24px; @@ -63,11 +74,28 @@ top: 0px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row { +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row, +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row-header { position: relative; max-height: 24px; } +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row-header { + font-weight: bold; +} + +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row, +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row-header { + display: flex; + padding-right: 4px; +} + +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row-header, +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-row:nth-child(odd):not(:hover):not(:focus):not(.selected), +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-edit-row.setting-list-object-row:nth-child(odd):hover { + background-color: rgba(130, 130, 130, 0.04); +} + .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row:focus { outline: none; } @@ -96,14 +124,14 @@ padding: 2px 14px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-item-control.setting-list-new-mode .setting-list-new-row { +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-item-control.setting-list-hide-add-button .setting-list-new-row { display: none; } .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .monaco-text-button.setting-list-addButton { display: inline-block; margin-top: 4px; - margin-right: 10px; + margin-right: 4px; } .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-edit-row { @@ -115,12 +143,17 @@ .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input { height: 24px; max-width: 320px; - flex: 1; - margin-right: 10px; + margin-right: 4px; +} +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input { + max-width: unset; +} +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value-container .setting-list-object-input { + margin-right: 0; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-okButton { - margin-right: 10px; +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-ok-button { + margin: 0 4px; } .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-widget, @@ -130,6 +163,7 @@ padding: 1px; } +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value-container, .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input select { width: 100%; height: 24px; diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index 68d03cbb441..5bfbe8133ab 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -93,8 +93,8 @@ Registry.as(EditorExtensions.Editors).registerEditor( // Register Preferences Editor Input Factory class PreferencesEditorInputFactory extends AbstractSideBySideEditorInputFactory { - protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput { - return new PreferencesEditorInput(name, description, detailsInput, masterInput); + protected createEditorInput(name: string, description: string | undefined, secondaryInput: EditorInput, primaryInput: EditorInput): EditorInput { + return new PreferencesEditorInput(name, description, secondaryInput, primaryInput); } } diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts index 6b866bfa1c9..9ace126eef3 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts @@ -206,7 +206,7 @@ export class PreferencesEditor extends BaseEditor { } private updateInput(newInput: PreferencesEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise { - return this.sideBySidePreferencesWidget.setInput(newInput.details, newInput.master, options, token).then(({ defaultPreferencesRenderer, editablePreferencesRenderer }) => { + return this.sideBySidePreferencesWidget.setInput(newInput.secondary, newInput.primary, options, token).then(({ defaultPreferencesRenderer, editablePreferencesRenderer }) => { if (token.isCancellationRequested) { return; } diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts index 4292cab7ccb..da898adea82 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts @@ -651,7 +651,7 @@ class EditSettingRenderer extends Disposable { private readonly _onUpdateSetting: Emitter<{ key: string, value: any, source: IIndexedSetting }> = new Emitter<{ key: string, value: any, source: IIndexedSetting }>(); readonly onUpdateSetting: Event<{ key: string, value: any, source: IIndexedSetting }> = this._onUpdateSetting.event; - constructor(private editor: ICodeEditor, private masterSettingsModel: ISettingsEditorModel, + constructor(private editor: ICodeEditor, private primarySettingsModel: ISettingsEditorModel, private settingHighlighter: SettingHighlighter, @IInstantiationService private readonly instantiationService: IInstantiationService, @IContextMenuService private readonly contextMenuService: IContextMenuService @@ -683,7 +683,7 @@ class EditSettingRenderer extends Disposable { } private isDefaultSettings(): boolean { - return this.masterSettingsModel instanceof DefaultSettingsEditorModel; + return this.primarySettingsModel instanceof DefaultSettingsEditorModel; } private onConfigurationChanged(): void { @@ -769,7 +769,7 @@ class EditSettingRenderer extends Disposable { return true; } if (configurationNode.type === 'boolean' || configurationNode.enum) { - if ((this.masterSettingsModel).configurationTarget !== ConfigurationTarget.WORKSPACE_FOLDER) { + if ((this.primarySettingsModel).configurationTarget !== ConfigurationTarget.WORKSPACE_FOLDER) { return true; } if (configurationNode.scope === ConfigurationScope.RESOURCE || configurationNode.scope === ConfigurationScope.LANGUAGE_OVERRIDABLE) { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index 7863899f58e..afec9c45d3c 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -35,10 +35,10 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { badgeBackground, badgeForeground, contrastBorder, editorForeground } from 'vs/platform/theme/common/colorRegistry'; -import { attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { attachStylerCallback, attachButtonStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { getUserDataSyncStore, IUserDataSyncService, SyncStatus, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { getUserDataSyncStore, IUserDataSyncService, SyncStatus, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IEditorMemento, IEditorPane } from 'vs/workbench/common/editor'; import { attachSuggestEnabledInputBoxStyler, SuggestEnabledInput } from 'vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput'; @@ -49,7 +49,7 @@ import { ISettingsEditorViewState, parseQuery, SearchResultIdx, SearchResultMode import { settingsTextInputBorder } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; import { createTOCIterator, TOCTree, TOCTreeModel } from 'vs/workbench/contrib/preferences/browser/tocTree'; import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, EXTENSION_SETTING_TAG, IPreferencesSearchService, ISearchProvider, MODIFIED_SETTING_TAG, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS } from 'vs/workbench/contrib/preferences/common/preferences'; -import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IPreferencesService, ISearchResult, ISettingsEditorModel, ISettingsEditorOptions, SettingsEditorOptions, SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { Settings2EditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; @@ -169,7 +169,7 @@ export class SettingsEditor2 extends BaseEditor { @IKeybindingService private readonly keybindingService: IKeybindingService, @IStorageKeysSyncRegistryService storageKeysSyncRegistryService: IStorageKeysSyncRegistryService, @IProductService private readonly productService: IProductService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService ) { super(SettingsEditor2.ID, telemetryService, themeService, storageService); this.delayedFilterLogging = new Delayer(1000); @@ -340,8 +340,12 @@ export class SettingsEditor2 extends BaseEditor { this.focusSearch(); } - onDidHide(): void { - this.searchWidget.onHide(); + protected setEditorVisible(visible: boolean, group: IEditorGroup | undefined): void { + super.setEditorVisible(visible, group); + + if (!visible) { + this.searchWidget.onHide(); + } } focusSettings(): void { @@ -469,7 +473,7 @@ export class SettingsEditor2 extends BaseEditor { this.settingsTargetsWidget.settingsTarget = ConfigurationTarget.USER_LOCAL; this.settingsTargetsWidget.onDidTargetChange(target => this.onDidSettingsTargetChange(target)); - if (syncAllowed(this.productService, this.configurationService) && this.userDataSyncEnablementService.canToggleEnablement()) { + if (syncAllowed(this.productService, this.configurationService) && this.userDataAutoSyncService.canToggleEnablement()) { const syncControls = this._register(this.instantiationService.createInstance(SyncControls, headerControlsContainer)); this._register(syncControls.onDidChangeLastSyncedLabel(lastSyncedLabel => this.updateInputAriaLabel(lastSyncedLabel))); } @@ -1402,13 +1406,15 @@ class SyncControls extends Disposable { container: HTMLElement, @ICommandService private readonly commandService: ICommandService, @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, + @IThemeService themeService: IThemeService, ) { super(); const headerRightControlsContainer = DOM.append(container, $('.settings-right-controls')); const turnOnSyncButtonContainer = DOM.append(headerRightControlsContainer, $('.turn-on-sync')); this.turnOnSyncButton = this._register(new Button(turnOnSyncButtonContainer, { title: true })); + this._register(attachButtonStyler(this.turnOnSyncButton, themeService)); this.lastSyncedLabel = DOM.append(headerRightControlsContainer, $('.last-synced-label')); DOM.hide(this.lastSyncedLabel); @@ -1433,7 +1439,7 @@ class SyncControls extends Disposable { this.update(); })); - this._register(this.userDataSyncEnablementService.onDidChangeEnablement(() => { + this._register(this.userDataAutoSyncService.onDidChangeEnablement(() => { this.update(); })); } @@ -1457,7 +1463,7 @@ class SyncControls extends Disposable { return; } - if (this.userDataSyncEnablementService.isEnabled()) { + if (this.userDataAutoSyncService.isEnabled()) { DOM.show(this.lastSyncedLabel); DOM.hide(this.turnOnSyncButton.element); } else { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 31295db0800..24f9042e00c 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -28,9 +28,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { isIOS } from 'vs/base/common/platform'; -import { ISpliceable } from 'vs/base/common/sequence'; import { escapeRegExpCharacters, startsWith } from 'vs/base/common/strings'; -import { isArray, isDefined } from 'vs/base/common/types'; +import { isArray, isDefined, isUndefinedOrNull } from 'vs/base/common/types'; import { localize } from 'vs/nls'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -45,15 +44,16 @@ import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticip import { getIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge'; import { ITOCEntry } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; import { ISettingsEditorViewState, settingKeyToDisplayFormat, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; -import { ExcludeSettingWidget, ISettingListChangeEvent, IListDataItem, ListSettingWidget, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground, ObjectSettingWidget, IObjectDataItem, IObjectEnumOption } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; +import { ExcludeSettingWidget, ISettingListChangeEvent, IListDataItem, ListSettingWidget, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground, ObjectSettingWidget, IObjectDataItem, IObjectEnumOption, ObjectValue, IObjectValueSuggester, IObjectKeySuggester } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; import { SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/preferences/common/preferences'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ISetting, ISettingsGroup, SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; -import { IUserDataSyncEnablementService, getDefaultIgnoredSettings } from 'vs/platform/userDataSync/common/userDataSync'; +import { getDefaultIgnoredSettings, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { getInvalidTypeError } from 'vs/workbench/services/preferences/common/preferencesValidation'; import { Codicon } from 'vs/base/common/codicons'; import { CodiconLabel } from 'vs/base/browser/ui/codicons/codiconLabel'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; +import { IList } from 'vs/base/browser/ui/tree/indexTreeModel'; const $ = DOM.$; @@ -76,6 +76,12 @@ function getExcludeDisplayValue(element: SettingsTreeSettingElement): IListDataI }); } +function areAllPropertiesDefined(properties: string[], itemsToDisplay: IObjectDataItem[]): boolean { + const staticProperties = new Set(properties); + itemsToDisplay.forEach(({ key }) => staticProperties.delete(key.data)); + return staticProperties.size === 0; +} + function getEnumOptionsFromSchema(schema: IJSONSchema): IObjectEnumOption[] { const enumDescriptions = schema.enumDescriptions ?? []; @@ -88,13 +94,107 @@ function getEnumOptionsFromSchema(schema: IJSONSchema): IObjectEnumOption[] { }); } +function getObjectValueType(schema: IJSONSchema): ObjectValue['type'] { + if (schema.type === 'boolean') { + return 'boolean'; + } else if (schema.type === 'string' && isDefined(schema.enum) && schema.enum.length > 0) { + return 'enum'; + } else { + return 'string'; + } +} + function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectDataItem[] { const data = element.isConfigured ? { ...element.defaultValue, ...element.scopeValue } : element.defaultValue; - const items: IObjectDataItem[] = []; + const { objectProperties, objectPatternProperties, objectAdditionalProperties } = element.setting; + const patternsAndSchemas = Object + .entries(objectPatternProperties ?? {}) + .map(([pattern, schema]) => ({ + pattern: new RegExp(pattern), + schema + })); + const additionalValueEnums = getEnumOptionsFromSchema( + typeof objectAdditionalProperties === 'boolean' + ? {} + : objectAdditionalProperties ?? {} + ); + + const wellDefinedKeyEnumOptions = Object.entries(objectProperties ?? {}).map( + ([key, schema]) => ({ value: key, description: schema.description }) + ); + + return Object.keys(data).map(key => { + if (isDefined(objectProperties) && key in objectProperties) { + const defaultValue = element.defaultValue[key]; + const valueEnumOptions = getEnumOptionsFromSchema(objectProperties[key]); + + return { + key: { + type: 'enum', + data: key, + options: wellDefinedKeyEnumOptions, + }, + value: { + type: getObjectValueType(objectProperties[key]), + data: data[key], + options: valueEnumOptions, + }, + removable: isUndefinedOrNull(defaultValue), + }; + } + + const schema = patternsAndSchemas.find(({ pattern }) => pattern.test(key))?.schema; + + if (schema) { + const valueEnumOptions = getEnumOptionsFromSchema(schema); + return { + key: { type: 'string', data: key }, + value: { + type: getObjectValueType(schema), + data: data[key], + options: valueEnumOptions, + }, + removable: true, + }; + } + + return { + key: { type: 'string', data: key }, + value: { + type: typeof objectAdditionalProperties === 'object' ? getObjectValueType(objectAdditionalProperties) : 'string', + data: data[key], + options: additionalValueEnums, + }, + removable: true, + }; + }); +} + +function createObjectKeySuggester(element: SettingsTreeSettingElement): IObjectKeySuggester { + const { objectProperties } = element.setting; + const allStaticKeys = Object.keys(objectProperties ?? {}); + + return keys => { + const existingKeys = new Set(keys); + const enumOptions: IObjectEnumOption[] = []; + + allStaticKeys.forEach(staticKey => { + if (!existingKeys.has(staticKey)) { + enumOptions.push({ value: staticKey, description: objectProperties![staticKey].description }); + } + }); + + return enumOptions.length > 0 + ? { type: 'enum', data: enumOptions[0].value, options: enumOptions } + : undefined; + }; +} + +function createObjectValueSuggester(element: SettingsTreeSettingElement): IObjectValueSuggester { const { objectProperties, objectPatternProperties, objectAdditionalProperties } = element.setting; const patternsAndSchemas = Object @@ -104,73 +204,36 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData schema })); - const allKeys = new Set(Object.keys(data).concat(Object.keys(objectProperties ?? {}))); - const wellDefinedKeys: { key: string, description?: string }[] = []; - const patternKeysWithSchema = new Map(); - const additionalKeys: string[] = []; - const additionalValueEnums = getEnumOptionsFromSchema( - typeof objectAdditionalProperties === 'boolean' - ? {} - : objectAdditionalProperties ?? {} - ); + return (key: string) => { + let suggestedSchema: IJSONSchema | undefined; - // copy the keys into appropriate buckets - allKeys.forEach(key => { - if (key in (objectProperties ?? {})) { - wellDefinedKeys.push({ key, description: objectProperties![key].description }); - return; + if (isDefined(objectProperties) && key in objectProperties) { + suggestedSchema = objectProperties[key]; } - const schema = patternsAndSchemas.find(({ pattern }) => pattern.test(key))?.schema; + const patternSchema = suggestedSchema ?? patternsAndSchemas.find(({ pattern }) => pattern.test(key))?.schema; - if (isDefined(schema)) { - patternKeysWithSchema.set(key, schema); - } else { - additionalKeys.push(key); + if (isDefined(patternSchema)) { + suggestedSchema = patternSchema; + } else if (isDefined(objectAdditionalProperties) && typeof objectAdditionalProperties === 'object') { + suggestedSchema = objectAdditionalProperties; } - }); - const wellDefinedKeyEnumOptions = wellDefinedKeys.map(({ key, description }) => ({ value: key, description })); - wellDefinedKeys.forEach(({ key }) => { - const valueEnumOptions = getEnumOptionsFromSchema(objectProperties![key]); - items.push({ - key: { - type: 'enum', - data: key, - options: wellDefinedKeyEnumOptions, - }, - value: { - type: valueEnumOptions.length > 0 ? 'enum' : 'string', - data: data[key] ?? objectProperties![key].default, - options: valueEnumOptions, - }, - }); - }); + if (isDefined(suggestedSchema)) { + const type = getObjectValueType(suggestedSchema); - patternKeysWithSchema.forEach((schema, key) => { - const valueEnumOptions = getEnumOptionsFromSchema(schema); - items.push({ - key: { type: 'string', data: key }, - value: { - type: valueEnumOptions.length > 0 ? 'enum' : 'string', - data: data[key], - options: valueEnumOptions, - }, - }); - }); + if (type === 'boolean') { + return { type, data: suggestedSchema.default ?? true }; + } else if (type === 'enum') { + const options = getEnumOptionsFromSchema(suggestedSchema); + return { type, data: suggestedSchema.default ?? options[0].value, options }; + } else { + return { type, data: suggestedSchema.default ?? '' }; + } + } - additionalKeys.forEach(key => { - items.push({ - key: { type: 'string', data: key }, - value: { - type: additionalValueEnums.length > 0 ? 'enum' : 'string', - data: data[key], - options: additionalValueEnums, - }, - }); - }); - - return items; + return; + }; } function getListDisplayValue(element: SettingsTreeSettingElement): IListDataItem[] { @@ -550,7 +613,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre template.toolbar.context = element; const actions = this.disposableActionFactory(element.setting); actions.forEach(a => template.elementDisposables?.add(a)); - template.toolbar.setActions([], [...this.settingActions, ...actions])(); + template.toolbar.setActions([], [...this.settingActions, ...actions]); this.fixToolbarIcon(template.toolbar); const setting = element.setting; @@ -638,7 +701,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre // Rewrite `#editor.fontSize#` to link format text = fixSettingLinks(text); - const renderedMarkdown = renderMarkdown({ value: text }, { + const renderedMarkdown = renderMarkdown({ value: text, isTrusted: true }, { actionHandler: { callback: (content: string) => { if (startsWith(content, '#')) { @@ -699,6 +762,11 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre itemElement.setAttribute('role', 'combobox'); label += modifiedText; } + } else if (templateId === SETTINGS_OBJECT_TEMPLATE_ID) { + if (itemElement = (template).objectWidget.domNode) { + itemElement.setAttribute('role', 'list'); + label += modifiedText; + } } else { // Don't change attributes if we don't know what we areFunctions return ''; @@ -980,30 +1048,65 @@ export class SettingObjectRenderer extends AbstractSettingRenderer implements IT this.addSettingElementFocusHandler(template); - common.toDispose.add(objectWidget.onDidChangeList(e => this.onDidChangeMap(template, e))); + common.toDispose.add(objectWidget.onDidChangeList(e => this.onDidChangeObject(template, e))); return template; } - private onDidChangeMap(template: ISettingObjectItemTemplate, e: ISettingListChangeEvent): void { + private onDidChangeObject(template: ISettingObjectItemTemplate, e: ISettingListChangeEvent): void { if (template.context) { - const newValue = { ...template.context.scopeValue }; + const defaultValue: Record = template.context.defaultValue; + const scopeValue: Record = template.context.scopeValue; + const newValue: Record = {}; + let newItems: IObjectDataItem[] = []; - // first delete the existing entry, if present - if (e.originalItem.key.data) { + template.objectWidget.items.forEach((item, idx) => { + // Item was updated + if (isDefined(e.item) && e.targetIndex === idx) { + newValue[e.item.key.data] = e.item.value.data; + newItems.push(e.item); + } + // All remaining items, but skip the one that we just updated + else if (isUndefinedOrNull(e.item) || e.item.key.data !== item.key.data) { + newValue[item.key.data] = item.value.data; + newItems.push(item); + } + }); + + // Item was deleted + if (isUndefinedOrNull(e.item)) { delete newValue[e.originalItem.key.data]; + + const itemToDelete = newItems.findIndex(item => item.key.data === e.originalItem.key.data); + const defaultItemValue = defaultValue[e.originalItem.key.data] as string | boolean; + + // Item does not have a default + if (isUndefinedOrNull(defaultValue[e.originalItem.key.data]) && itemToDelete > -1) { + newItems.splice(itemToDelete, 1); + } else if (itemToDelete > -1) { + newItems[itemToDelete].value.data = defaultItemValue; + } + } + // New item was added + else if (template.objectWidget.isItemNew(e.originalItem)) { + newValue[e.item.key.data] = e.item.value.data; + newItems.push(e.item); } - // then add the new or updated entry, if present - if (e.item?.key.data && e.item.value.data) { - newValue[e.item.key.data] = e.item.value.data; - } + Object.entries(newValue).forEach(([key, value]) => { + // value from the scope has changed back to the default + if (scopeValue[key] !== value && defaultValue[key] === value) { + delete newValue[key]; + } + }); this._onDidChangeSetting.fire({ key: template.context.setting.key, value: Object.keys(newValue).length === 0 ? undefined : newValue, type: template.context.valueType }); + + template.objectWidget.setValue(newItems); } } @@ -1012,8 +1115,20 @@ export class SettingObjectRenderer extends AbstractSettingRenderer implements IT } protected renderValue(dataElement: SettingsTreeSettingElement, template: ISettingObjectItemTemplate, onChange: (value: string) => void): void { - const value = getObjectDisplayValue(dataElement); - template.objectWidget.setValue(value); + const items = getObjectDisplayValue(dataElement); + + template.objectWidget.setValue(items, { + showAddButton: ( + typeof dataElement.setting.objectAdditionalProperties === 'object' || + isDefined(dataElement.setting.objectPatternProperties) || + !areAllPropertiesDefined(Object.keys(dataElement.setting.objectProperties ?? {}), items) + ), + keySuggester: createObjectKeySuggester(dataElement), + valueSuggester: createObjectValueSuggester(dataElement), + }); + + this.setElementAriaLabels(dataElement, this.templateId, template); + template.context = dataElement; } } @@ -1419,7 +1534,7 @@ export class SettingTreeRenderers { @IInstantiationService private readonly _instantiationService: IInstantiationService, @IContextMenuService private readonly _contextMenuService: IContextMenuService, @IContextViewService private readonly _contextViewService: IContextViewService, - @IUserDataSyncEnablementService private readonly _userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataAutoSyncService private readonly _userDataAutoSyncService: IUserDataAutoSyncService, ) { this.settingActions = [ new Action('settings.resetSetting', localize('resetSettingLabel', "Reset Setting"), undefined, undefined, (context: SettingsTreeSettingElement) => { @@ -1464,7 +1579,7 @@ export class SettingTreeRenderers { } private getActionsForSetting(setting: ISetting): IAction[] { - const enableSync = this._userDataSyncEnablementService.isEnabled(); + const enableSync = this._userDataAutoSyncService.isEnabled(); return enableSync && !setting.disallowSyncIgnore ? [ new Separator(), @@ -1730,6 +1845,7 @@ export class SettingsTree extends ObjectTree { viewState: ISettingsEditorViewState, renderers: ITreeRenderer[], @IThemeService themeService: IThemeService, + @IConfigurationService configurationService: IConfigurationService, @IInstantiationService instantiationService: IInstantiationService, ) { super('SettingsTree', container, @@ -1755,7 +1871,8 @@ export class SettingsTree extends ObjectTree { } }, styleController: id => new DefaultStyleController(DOM.createStyleSheet(container), id), - filter: instantiationService.createInstance(SettingsTreeFilter, viewState) + filter: instantiationService.createInstance(SettingsTreeFilter, viewState), + smoothScrolling: configurationService.getValue('workbench.list.smoothScrolling'), }); this.disposables.clear(); @@ -1830,9 +1947,17 @@ export class SettingsTree extends ObjectTree { }, colors => { this.style(colors); })); + + this.disposables.add(configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('workbench.list.smoothScrolling')) { + this.updateOptions({ + smoothScrolling: configurationService.getValue('workbench.list.smoothScrolling') + }); + } + })); } - protected createModel(user: string, view: ISpliceable>, options: IObjectTreeOptions): ITreeModel { + protected createModel(user: string, view: IList>, options: IObjectTreeOptions): ITreeModel { return new NonCollapsibleObjectTreeModel(user, view, options); } } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts index 429ec670b5d..63a4da5c0aa 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts @@ -469,7 +469,7 @@ export function isExcludeSetting(setting: ISetting): boolean { } function isObjectRenderableSchema({ type }: IJSONSchema): boolean { - return type === 'string'; + return type === 'string' || type === 'boolean'; } function isObjectSetting({ @@ -496,13 +496,14 @@ function isObjectSetting({ return false; } - return Object.values(objectProperties ?? {}).every(isObjectRenderableSchema) && - Object.values(objectPatternProperties ?? {}).every(isObjectRenderableSchema) && - ( - typeof objectAdditionalProperties === 'object' - ? isObjectRenderableSchema(objectAdditionalProperties) - : true - ); + const schemas = [...Object.values(objectProperties ?? {}), ...Object.values(objectPatternProperties ?? {})]; + + if (typeof objectAdditionalProperties === 'object') { + schemas.push(objectAdditionalProperties); + } + + // This should not render boolean only objects + return schemas.every(isObjectRenderableSchema) && schemas.some(({ type }) => type === 'string'); } function settingTypeEnumRenderable(_type: string | string[]) { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index 8d661d51bc6..392af889998 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { Button } from 'vs/base/browser/ui/button/button'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; @@ -20,11 +20,12 @@ import { foreground, inputBackground, inputBorder, inputForeground, listActiveSe import { attachButtonStyler, attachInputBoxStyler, attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { disposableTimeout } from 'vs/base/common/async'; -import { isUndefinedOrNull } from 'vs/base/common/types'; +import { isUndefinedOrNull, isDefined } from 'vs/base/common/types'; import { preferencesEditIcon } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; import { isIOS } from 'vs/base/common/platform'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; +import { debounce } from 'vs/base/common/decorators'; const $ = DOM.$; export const settingsHeaderForeground = registerColor('settings.headerForeground', { light: '#444444', dark: '#e7e7e7', hc: '#ffffff' }, localize('headerForeground', "The foreground color for a section header or active title.")); @@ -218,16 +219,11 @@ export interface ISettingListChangeEvent { targetIndex?: number; } -interface IEditHandlers { - onKeydown(event: IKeyboardEvent, updatedItem: TDataItem): void - onSubmit(updatedItem: TDataItem): void - onCancel(): void -} - abstract class AbstractListSettingWidget extends Disposable { private listElement: HTMLElement; - private readonly _onDidChangeList = this._register(new Emitter>()); + private rowElements: HTMLElement[] = []; + protected readonly _onDidChangeList = this._register(new Emitter>()); protected readonly model = new ListSettingListModel(this.getEmptyItem()); protected readonly listDisposables = this._register(new DisposableStore()); @@ -237,6 +233,10 @@ abstract class AbstractListSettingWidget extends Dispo return this.listElement; } + get items(): TDataItem[] { + return this.model.items; + } + constructor( private container: HTMLElement, @IThemeService protected readonly themeService: IThemeService, @@ -253,24 +253,17 @@ abstract class AbstractListSettingWidget extends Dispo this._register(DOM.addDisposableListener(this.listElement, DOM.EventType.CLICK, e => this.onListClick(e))); this._register(DOM.addDisposableListener(this.listElement, DOM.EventType.DBLCLICK, e => this.onListDoubleClick(e))); - this._register(DOM.addStandardDisposableListener(this.listElement, 'keydown', (e: KeyboardEvent) => { - if (e.keyCode === KeyCode.UpArrow) { - const selectedIndex = this.model.getSelected(); - this.model.selectPrevious(); - if (this.model.getSelected() !== selectedIndex) { - this.renderList(); - } - e.preventDefault(); - e.stopPropagation(); - } else if (e.keyCode === KeyCode.DownArrow) { - const selectedIndex = this.model.getSelected(); - this.model.selectNext(); - if (this.model.getSelected() !== selectedIndex) { - this.renderList(); - } - e.preventDefault(); - e.stopPropagation(); + this._register(DOM.addStandardDisposableListener(this.listElement, 'keydown', (e: StandardKeyboardEvent) => { + if (e.equals(KeyCode.UpArrow)) { + this.selectPreviousRow(); + } else if (e.equals(KeyCode.DownArrow)) { + this.selectNextRow(); + } else { + return; } + + e.preventDefault(); + e.stopPropagation(); })); } @@ -281,17 +274,25 @@ abstract class AbstractListSettingWidget extends Dispo protected abstract getEmptyItem(): TDataItem; protected abstract getContainerClasses(): string[]; + protected abstract getActionsForItem(item: TDataItem, idx: number): IAction[]; protected abstract renderItem(item: TDataItem): HTMLElement; - protected abstract renderEdit(item: TDataItem, handlers: IEditHandlers): HTMLElement; + protected abstract renderEdit(item: TDataItem, idx: number): HTMLElement; protected abstract isItemNew(item: TDataItem): boolean; protected abstract getLocalizedRowTitle(item: TDataItem): string; protected abstract getLocalizedStrings(): { deleteActionTooltip: string editActionTooltip: string - complexEditActionTooltip: string addButtonLabel: string }; + protected renderHeader(): HTMLElement | undefined { + return; + } + + protected isAddButtonVisible(): boolean { + return true; + } + protected renderList(): void { const focused = DOM.isAncestor(document.activeElement, this.listElement); @@ -299,20 +300,53 @@ abstract class AbstractListSettingWidget extends Dispo this.listDisposables.clear(); const newMode = this.model.items.some(item => !!(item.editing && this.isItemNew(item))); - DOM.toggleClass(this.container, 'setting-list-new-mode', newMode); + DOM.toggleClass(this.container, 'setting-list-hide-add-button', !this.isAddButtonVisible() || newMode); - this.model.items - .map((item, i) => this.renderDataOrEditItem(item, i, focused)) - .forEach(itemElement => this.listElement.appendChild(itemElement)); + const header = this.renderHeader(); + const ITEM_HEIGHT = 24; + let listHeight = ITEM_HEIGHT * this.model.items.length; + + if (header) { + listHeight += ITEM_HEIGHT; + this.listElement.appendChild(header); + } + + this.rowElements = this.model.items.map((item, i) => this.renderDataOrEditItem(item, i, focused)); + this.rowElements.forEach(rowElement => this.listElement.appendChild(rowElement)); - const listHeight = 24 * this.model.items.length; this.listElement.style.height = listHeight + 'px'; } + protected editSetting(idx: number): void { + this.model.setEditKey(idx); + this.renderList(); + } + + protected cancelEdit(): void { + this.model.setEditKey('none'); + this.renderList(); + } + + protected handleItemChange(originalItem: TDataItem, changedItem: TDataItem, idx: number) { + this.model.setEditKey('none'); + + this._onDidChangeList.fire({ + originalItem, + item: changedItem, + targetIndex: idx, + }); + + this.renderList(); + } + private renderDataOrEditItem(item: IListViewItem, idx: number, listFocused: boolean): HTMLElement { - return item.editing ? - this.renderEditItem(item, idx) : + const rowElement = item.editing ? + this.renderEdit(item, idx) : this.renderDataItem(item, idx, listFocused); + + rowElement.setAttribute('role', 'listitem'); + + return rowElement; } private renderDataItem(item: IListViewItem, idx: number, listFocused: boolean): HTMLElement { @@ -325,83 +359,16 @@ abstract class AbstractListSettingWidget extends Dispo const actionBar = new ActionBar(rowElement); this.listDisposables.add(actionBar); - actionBar.push([ - this.createEditAction(idx), - this.createDeleteAction(item, idx) - ], { icon: true, label: false }); - + actionBar.push(this.getActionsForItem(item, idx), { icon: true, label: true }); rowElement.title = this.getLocalizedRowTitle(item); - if (item.selected) { - if (listFocused) { - setTimeout(() => { - rowElement.focus(); - }, 10); - } + if (item.selected && listFocused) { + this.listDisposables.add(disposableTimeout(() => rowElement.focus())); } return rowElement; } - private renderEditItem(item: IListViewItem, idx: number): HTMLElement { - let rowElement: HTMLElement | undefined; - - const onCancel = () => { - this.model.setEditKey('none'); - this.renderList(); - }; - - const onSubmit = (updatedItem: TDataItem) => { - this.model.setEditKey('none'); - - if (!isUndefinedOrNull(updatedItem)) { - this._onDidChangeList.fire({ - originalItem: item, - item: updatedItem, - targetIndex: idx, - }); - } - - this.renderList(); - }; - - const onKeydown = (e: StandardKeyboardEvent, updatedItem: TDataItem) => { - if (e.equals(KeyCode.Enter)) { - onSubmit(updatedItem); - } else if (e.equals(KeyCode.Escape)) { - onCancel(); - e.preventDefault(); - } - rowElement?.focus(); - }; - - rowElement = this.renderEdit(item, { onSubmit, onKeydown, onCancel }); - - return rowElement; - } - - private createDeleteAction(item: TDataItem, idx: number): IAction { - return { - class: 'codicon-close', - enabled: true, - id: 'workbench.action.removeListItem', - tooltip: this.getLocalizedStrings().deleteActionTooltip, - run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) - }; - } - - private createEditAction(idx: number): IAction { - return { - class: preferencesEditIcon.classNames, - enabled: true, - id: 'workbench.action.editListItem', - tooltip: this.getLocalizedStrings().editActionTooltip, - run: () => { - this.editSetting(idx); - } - }; - } - private renderAddButton(): HTMLElement { const rowElement = $('.setting-list-new-row'); @@ -428,8 +395,7 @@ abstract class AbstractListSettingWidget extends Dispo return; } - this.model.select(targetIdx); - this.renderList(); + this.selectRow(targetIdx); e.preventDefault(); e.stopPropagation(); } @@ -473,9 +439,24 @@ abstract class AbstractListSettingWidget extends Dispo return targetIdx; } - private editSetting(idx: number): void { - this.model.setEditKey(idx); - this.renderList(); + private selectRow(idx: number): void { + this.model.select(idx); + this.rowElements.forEach(row => row.classList.remove('selected')); + + const selectedRow = this.rowElements[this.model.getSelected()!]; + + selectedRow.classList.add('selected'); + selectedRow.focus(); + } + + private selectNextRow(): void { + this.model.selectNext(); + this.selectRow(this.model.getSelected()!); + } + + private selectPreviousRow(): void { + this.model.selectPrevious(); + this.selectRow(this.model.getSelected()!); } } @@ -493,9 +474,27 @@ export class ListSettingWidget extends AbstractListSettingWidget return ['setting-list-widget']; } + protected getActionsForItem(item: IListDataItem, idx: number): IAction[] { + return [ + { + class: preferencesEditIcon.classNames, + enabled: true, + id: 'workbench.action.editListItem', + tooltip: this.getLocalizedStrings().editActionTooltip, + run: () => this.editSetting(idx) + }, + { + class: 'codicon-close', + enabled: true, + id: 'workbench.action.removeListItem', + tooltip: this.getLocalizedStrings().deleteActionTooltip, + run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) + } + ] as IAction[]; + } + protected renderItem(item: IListDataItem): HTMLElement { const rowElement = $('.setting-list-row'); - const valueElement = DOM.append(rowElement, $('.setting-list-value')); const siblingElement = DOM.append(rowElement, $('.setting-list-sibling')); @@ -505,7 +504,7 @@ export class ListSettingWidget extends AbstractListSettingWidget return rowElement; } - protected renderEdit(item: IListDataItem, { onKeydown, onSubmit, onCancel }: IEditHandlers): HTMLElement { + protected renderEdit(item: IListDataItem, idx: number): HTMLElement { const rowElement = $('.setting-list-edit-row'); const updatedItem = () => ({ @@ -513,6 +512,16 @@ export class ListSettingWidget extends AbstractListSettingWidget sibling: siblingInput?.value }); + const onKeyDown = (e: StandardKeyboardEvent) => { + if (e.equals(KeyCode.Enter)) { + this.handleItemChange(item, updatedItem(), idx); + } else if (e.equals(KeyCode.Escape)) { + this.cancelEdit(); + e.preventDefault(); + } + rowElement?.focus(); + }; + const valueInput = new InputBox(rowElement, this.contextViewService, { placeholder: this.getLocalizedStrings().inputPlaceholder }); @@ -526,7 +535,9 @@ export class ListSettingWidget extends AbstractListSettingWidget this.listDisposables.add(valueInput); valueInput.value = item.value; - this.listDisposables.add(DOM.addStandardDisposableListener(valueInput.inputElement, DOM.EventType.KEY_DOWN, e => onKeydown(e, updatedItem()))); + this.listDisposables.add( + DOM.addStandardDisposableListener(valueInput.inputElement, DOM.EventType.KEY_DOWN, onKeyDown) + ); let siblingInput: InputBox | undefined; if (!isUndefinedOrNull(item.sibling)) { @@ -542,20 +553,24 @@ export class ListSettingWidget extends AbstractListSettingWidget })); siblingInput.value = item.sibling; - this.listDisposables.add(DOM.addStandardDisposableListener(siblingInput.inputElement, DOM.EventType.KEY_DOWN, e => onKeydown(e, updatedItem()))); + this.listDisposables.add( + DOM.addStandardDisposableListener(siblingInput.inputElement, DOM.EventType.KEY_DOWN, onKeyDown) + ); } const okButton = this._register(new Button(rowElement)); okButton.label = localize('okButton', "OK"); - okButton.element.classList.add('setting-list-okButton'); + okButton.element.classList.add('setting-list-ok-button'); + this.listDisposables.add(attachButtonStyler(okButton, this.themeService)); - this.listDisposables.add(okButton.onDidClick(() => onSubmit(updatedItem()))); + this.listDisposables.add(okButton.onDidClick(() => this.handleItemChange(item, updatedItem(), idx))); const cancelButton = this._register(new Button(rowElement)); cancelButton.label = localize('cancelButton', "Cancel"); - cancelButton.element.classList.add('setting-list-okButton'); + cancelButton.element.classList.add('setting-list-cancel-button'); + this.listDisposables.add(attachButtonStyler(cancelButton, this.themeService)); - this.listDisposables.add(cancelButton.onDidClick(onCancel)); + this.listDisposables.add(cancelButton.onDidClick(() => this.cancelEdit())); this.listDisposables.add( disposableTimeout(() => { @@ -581,7 +596,6 @@ export class ListSettingWidget extends AbstractListSettingWidget return { deleteActionTooltip: localize('removeItem', "Remove Item"), editActionTooltip: localize('editItem', "Edit Item"), - complexEditActionTooltip: localize('editItemInSettingsJson', "Edit Item in settings.json"), addButtonLabel: localize('addItem', "Add Item"), inputPlaceholder: localize('itemInputPlaceholder', "String Item..."), siblingInputPlaceholder: localize('listSiblingInputPlaceholder', "Sibling..."), @@ -604,7 +618,6 @@ export class ExcludeSettingWidget extends ListSettingWidget { return { deleteActionTooltip: localize('removeExcludeItem', "Remove Exclude Item"), editActionTooltip: localize('editExcludeItem', "Edit Exclude Item"), - complexEditActionTooltip: localize('editExcludeItemInSettingsJson', "Edit Exclude Item in settings.json"), addButtonLabel: localize('addPattern', "Add Pattern"), inputPlaceholder: localize('excludePatternInputPlaceholder', "Exclude Pattern..."), siblingInputPlaceholder: localize('excludeSiblingInputPlaceholder', "When Pattern Is Present..."), @@ -613,33 +626,82 @@ export class ExcludeSettingWidget extends ListSettingWidget { } interface IObjectStringData { - type: 'string' - data: string + type: 'string'; + data: string; } export interface IObjectEnumOption { - value: string + value: string; description?: string } interface IObjectEnumData { - type: 'enum' - data: string - options: IObjectEnumOption[] + type: 'enum'; + data: string; + options: IObjectEnumOption[]; } -type ObjectKeyOrValue = IObjectStringData | IObjectEnumData; +interface IObjectBoolData { + type: 'boolean'; + data: boolean; +} + +type ObjectKey = IObjectStringData | IObjectEnumData; +export type ObjectValue = IObjectStringData | IObjectEnumData | IObjectBoolData; export interface IObjectDataItem { - key: ObjectKeyOrValue; - value: ObjectKeyOrValue; + key: ObjectKey; + value: ObjectValue; + removable: boolean; +} + +export interface IObjectValueSuggester { + (key: string): ObjectValue | undefined; +} + +export interface IObjectKeySuggester { + (existingKeys: string[]): IObjectEnumData | undefined; +} + +interface IObjectSetValueOptions { + showAddButton: boolean; + keySuggester: IObjectKeySuggester; + valueSuggester: IObjectValueSuggester; +} + +interface IObjectRenderEditWidgetOptions { + isKey: boolean; + idx: number; + readonly originalItem: IObjectDataItem; + readonly changedItem: IObjectDataItem; + update(keyOrValue: ObjectKey | ObjectValue): void; } export class ObjectSettingWidget extends AbstractListSettingWidget { + private showAddButton: boolean = true; + private keySuggester: IObjectKeySuggester = () => undefined; + private valueSuggester: IObjectValueSuggester = () => undefined; + + setValue(listData: IObjectDataItem[], options?: IObjectSetValueOptions): void { + this.showAddButton = options?.showAddButton ?? this.showAddButton; + this.keySuggester = options?.keySuggester ?? this.keySuggester; + this.valueSuggester = options?.valueSuggester ?? this.valueSuggester; + super.setValue(listData); + } + + isItemNew(item: IObjectDataItem): boolean { + return item.key.data === '' && item.value.data === ''; + } + + protected isAddButtonVisible(): boolean { + return this.showAddButton; + } + protected getEmptyItem(): IObjectDataItem { return { key: { type: 'string', data: '' }, value: { type: 'string', data: '' }, + removable: true, }; } @@ -647,88 +709,152 @@ export class ObjectSettingWidget extends AbstractListSettingWidget this.editSetting(idx) + }, + ] as IAction[]; + + if (item.removable) { + actions.push({ + class: 'codicon-close', + enabled: true, + id: 'workbench.action.removeListItem', + tooltip: this.getLocalizedStrings().deleteActionTooltip, + run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) + } as IAction); + } else { + actions.push({ + class: 'codicon-discard', + enabled: true, + id: 'workbench.action.resetListItem', + tooltip: this.getLocalizedStrings().resetActionTooltip, + run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) + } as IAction); + } + + return actions; + } + + protected renderHeader() { + const header = $('.setting-list-row-header'); + const keyHeader = DOM.append(header, $('.setting-list-object-key')); + const valueHeader = DOM.append(header, $('.setting-list-object-value')); + const { keyHeaderText, valueHeaderText } = this.getLocalizedStrings(); + + keyHeader.textContent = keyHeaderText; + valueHeader.textContent = valueHeaderText; + + return header; + } + protected renderItem(item: IObjectDataItem): HTMLElement { const rowElement = $('.setting-list-row'); + rowElement.classList.add('setting-list-object-row'); const keyElement = DOM.append(rowElement, $('.setting-list-object-key')); - const connector = DOM.append(rowElement, $('.setting-list-object-connector')); const valueElement = DOM.append(rowElement, $('.setting-list-object-value')); keyElement.textContent = item.key.data; - connector.textContent = this.getLocalizedStrings().connector; - valueElement.textContent = item.value.data; + valueElement.textContent = item.value.data.toString(); return rowElement; } - protected renderEdit(item: IObjectDataItem, { onSubmit, onKeydown, onCancel }: IEditHandlers): HTMLElement { - const rowElement = $('.setting-list-edit-row'); + protected renderEdit(item: IObjectDataItem, idx: number): HTMLElement { + const rowElement = $('.setting-list-edit-row.setting-list-object-row'); - const keyWidget = this.renderEditWidget(item.key, rowElement); - const valueWidget = this.renderEditWidget(item.value, rowElement); - - const updatedItem = () => { - const newItem = { ...item }; - - if (keyWidget instanceof InputBox) { - newItem.key = { type: 'string', data: keyWidget.value }; - } - - if (valueWidget instanceof InputBox) { - newItem.value = { type: 'string', data: valueWidget.value }; - } - - return newItem; + const changedItem = { ...item }; + const onKeyChange = (key: ObjectKey) => { + changedItem.key = key; + this.updateValueUsingSuggestion(key.data, item.value, newValue => { + if (this.shouldUseSuggestion(item.value, changedItem.value, newValue)) { + onValueChange(newValue); + renderLatestValue(); + } + }); + }; + const onValueChange = (value: ObjectValue) => { + changedItem.value = value; }; - if (keyWidget instanceof InputBox) { - keyWidget.setPlaceHolder(this.getLocalizedStrings().keyInputPlaceholder); - this.listDisposables.add(DOM.addStandardDisposableListener(keyWidget.inputElement, DOM.EventType.KEY_DOWN, e => onKeydown(e, updatedItem()))); - } else if (keyWidget instanceof SelectBox) { - this.listDisposables.add( - keyWidget.onDidSelect(({ selected }) => { - const editKey = this.model.items.findIndex(({ key }) => selected === key.data); + let keyWidget: InputBox | SelectBox | undefined; + let keyElement: HTMLElement; - if (editKey >= 0) { - this.model.select(editKey); - this.model.setEditKey(editKey); - this.renderList(); - } else { - onSubmit({ ...item, key: { ...item.key, data: selected } }); - } - }) - ); + if (this.showAddButton) { + if (this.isItemNew(item)) { + const suggestedKey = this.keySuggester(this.model.items.map(({ key: { data } }) => data)); + + if (isDefined(suggestedKey)) { + changedItem.key = suggestedKey; + const suggestedValue = this.valueSuggester(changedItem.key.data); + onValueChange(suggestedValue ?? changedItem.value); + } + } + + const { widget, element } = this.renderEditWidget(changedItem.key, { + idx, + isKey: true, + originalItem: item, + changedItem, + update: onKeyChange, + }); + keyWidget = widget; + keyElement = element; + } else { + keyElement = $('.setting-list-object-key'); + keyElement.textContent = item.key.data; } - if (valueWidget instanceof InputBox) { - valueWidget.setPlaceHolder(this.getLocalizedStrings().valueInputPlaceholder); - this.listDisposables.add(DOM.addStandardDisposableListener(valueWidget.inputElement, DOM.EventType.KEY_DOWN, e => onKeydown(e, updatedItem()))); - } else if (valueWidget instanceof SelectBox) { - this.listDisposables.add( - valueWidget.onDidSelect(({ selected }) => { - onSubmit({ ...item, value: { ...item.value, data: selected } }); - }) - ); - } + let valueWidget: InputBox | SelectBox; + const valueContainer = $('.setting-list-object-value-container'); + + const renderLatestValue = () => { + const { widget, element } = this.renderEditWidget(changedItem.value, { + idx, + isKey: false, + originalItem: item, + changedItem, + update: onValueChange, + }); + + valueWidget = widget; + + DOM.clearNode(valueContainer); + valueContainer.append(element); + }; + + renderLatestValue(); + + rowElement.append(keyElement, valueContainer); const okButton = this._register(new Button(rowElement)); okButton.label = localize('okButton', "OK"); - okButton.element.classList.add('setting-list-okButton'); + okButton.element.classList.add('setting-list-ok-button'); + this.listDisposables.add(attachButtonStyler(okButton, this.themeService)); - this.listDisposables.add(okButton.onDidClick(() => onSubmit(updatedItem()))); + this.listDisposables.add(okButton.onDidClick(() => this.handleItemChange(item, changedItem, idx))); const cancelButton = this._register(new Button(rowElement)); cancelButton.label = localize('cancelButton', "Cancel"); - cancelButton.element.classList.add('setting-list-okButton'); + cancelButton.element.classList.add('setting-list-cancel-button'); + this.listDisposables.add(attachButtonStyler(cancelButton, this.themeService)); - this.listDisposables.add(cancelButton.onDidClick(onCancel)); + this.listDisposables.add(cancelButton.onDidClick(() => this.cancelEdit())); this.listDisposables.add( disposableTimeout(() => { - keyWidget.focus(); + const widget = keyWidget ?? valueWidget; - if (keyWidget instanceof InputBox) { - keyWidget.select(); + widget.focus(); + + if (widget instanceof InputBox) { + widget.select(); } }) ); @@ -736,43 +862,40 @@ export class ObjectSettingWidget extends AbstractListSettingWidget item.key.data === value)?.description - : undefined; - - return enumDescription ?? localize('objectPairHintLabel', "The key `{0}` maps to `{1}`", item.key.data, item.value.data); - } - - protected getLocalizedStrings() { - return { - deleteActionTooltip: localize('removeItem', "Remove Item"), - editActionTooltip: localize('editItem', "Edit Item"), - complexEditActionTooltip: localize('editItemInSettingsJson', "Edit Item in settings.json"), - addButtonLabel: localize('addItem', "Add Item"), - keyInputPlaceholder: localize('objectKeyInputPlaceholder', "Key"), - valueInputPlaceholder: localize('objectValueInputPlaceholder', "Value"), - connector: ' → ', - }; - } - - private renderEditWidget(keyOrValue: ObjectKeyOrValue, rowElement: HTMLElement) { + private renderEditWidget( + keyOrValue: ObjectKey | ObjectValue, + options: IObjectRenderEditWidgetOptions, + ) { switch (keyOrValue.type) { case 'string': - return this.renderStringEditWidget(keyOrValue, rowElement); + return this.renderStringEditWidget(keyOrValue, options); case 'enum': - return this.renderEnumEditWidget(keyOrValue, rowElement); + return this.renderEnumEditWidget(keyOrValue, options); + case 'boolean': + return this.renderEnumEditWidget( + { + type: 'enum', + data: keyOrValue.data.toString(), + options: [{ value: 'true' }, { value: 'false' }], + }, + options, + ); } } - private renderStringEditWidget(keyOrValue: IObjectStringData, rowElement: HTMLElement) { - const inputBox = new InputBox(rowElement, this.contextViewService); + private renderStringEditWidget( + keyOrValue: IObjectStringData, + { idx, isKey, originalItem, changedItem, update }: IObjectRenderEditWidgetOptions, + ) { + const wrapper = $(isKey ? '.setting-list-object-input-key' : '.setting-list-object-input-value'); + const inputBox = new InputBox(wrapper, this.contextViewService, { + placeholder: isKey + ? localize('objectKeyInputPlaceholder', "Key") + : localize('objectValueInputPlaceholder', "Value"), + }); inputBox.element.classList.add('setting-list-object-input'); + this.listDisposables.add(attachInputBoxStyler(inputBox, this.themeService, { inputBackground: settingsTextInputBackground, inputForeground: settingsTextInputForeground, @@ -781,13 +904,30 @@ export class ObjectSettingWidget extends AbstractListSettingWidget update({ ...keyOrValue, data: value }))); + + const onKeyDown = (e: StandardKeyboardEvent) => { + if (e.equals(KeyCode.Enter)) { + this.handleItemChange(originalItem, changedItem, idx); + } else if (e.equals(KeyCode.Escape)) { + this.cancelEdit(); + e.preventDefault(); + } + }; + + this.listDisposables.add( + DOM.addStandardDisposableListener(inputBox.inputElement, DOM.EventType.KEY_DOWN, onKeyDown) + ); + + return { widget: inputBox, element: wrapper }; } - private renderEnumEditWidget(keyOrValue: IObjectEnumData, rowElement: HTMLElement) { + private renderEnumEditWidget( + keyOrValue: IObjectEnumData, + { isKey, originalItem, update }: IObjectRenderEditWidgetOptions, + ) { const selectBoxOptions = keyOrValue.options.map(({ value, description }) => ({ text: value, description })); - const dataIndex = keyOrValue.options.findIndex(option => keyOrValue.data === option.value); - const selected = dataIndex >= 0 ? dataIndex : 0; + const selected = keyOrValue.options.findIndex(option => keyOrValue.data === option.value); const selectBox = new SelectBox(selectBoxOptions, selected, this.contextViewService, undefined, { useCustomDrawn: !(isIOS && BrowserFeatures.pointerEvents) @@ -800,11 +940,85 @@ export class ObjectSettingWidget extends AbstractListSettingWidget + update( + originalKeyOrValue.type === 'boolean' + ? { ...originalKeyOrValue, data: selected === 'true' ? true : false } + : { ...originalKeyOrValue, data: selected }, + ) + ) + ); + const wrapper = $('.setting-list-object-input'); + wrapper.classList.add( + isKey ? 'setting-list-object-input-key' : 'setting-list-object-input-value', + ); selectBox.render(wrapper); - rowElement.append(wrapper); - return selectBox; + return { widget: selectBox, element: wrapper }; + } + + @debounce(300) + private updateValueUsingSuggestion(key: string, defaultValue: ObjectValue, onUpdate: (value: ObjectValue) => void) { + const suggestion = this.valueSuggester(key); + onUpdate(suggestion ?? defaultValue); + } + + private shouldUseSuggestion(originalValue: ObjectValue, previousValue: ObjectValue, newValue: ObjectValue): boolean { + if (previousValue === newValue) { + return false; + } + + // item is new, use suggestion + if (originalValue.data === '') { + return true; + } + + if (previousValue.type === newValue.type && newValue.type !== 'enum') { + return false; + } + + // check if all enum options are the same + if (previousValue.type === 'enum' && newValue.type === 'enum') { + const previousEnums = new Set(previousValue.options.map(({ value }) => value)); + newValue.options.forEach(({ value }) => previousEnums.delete(value)); + + // all options are the same + if (previousEnums.size === 0) { + return false; + } + } + + return true; + } + + protected getLocalizedRowTitle(item: IObjectDataItem): string { + let enumDescription = item.key.type === 'enum' + ? item.key.options.find(({ value }) => item.key.data === value)?.description + : undefined; + + // avoid rendering double '.' + if (isDefined(enumDescription) && enumDescription.endsWith('.')) { + enumDescription = enumDescription.slice(0, enumDescription.length - 1); + } + + return isDefined(enumDescription) + ? `${enumDescription}. Currently set to ${item.value.data}.` + : localize('objectPairHintLabel', "The property `{0}` is set to `{1}`.", item.key.data, item.value.data); + } + + protected getLocalizedStrings() { + return { + deleteActionTooltip: localize('removeItem', "Remove Item"), + resetActionTooltip: localize('resetItem', "Reset Item"), + editActionTooltip: localize('editItem', "Edit Item"), + addButtonLabel: localize('addItem', "Add Item"), + keyHeaderText: localize('objectKeyHeader', "Item"), + valueHeaderText: localize('objectValueHeader', "Value"), + }; } } diff --git a/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts b/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts index 1ad8a3fac37..abde9a4b078 100644 --- a/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts +++ b/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts @@ -9,9 +9,8 @@ import * as dom from 'vs/base/browser/dom'; import { IAction, Action } from 'vs/base/common/actions'; import { SelectActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { selectBorder } from 'vs/platform/theme/common/colorRegistry'; import { IRemoteExplorerService, REMOTE_EXPLORER_TYPE_KEY } from 'vs/workbench/services/remote/common/remoteExplorerService'; import { ISelectOptionItem } from 'vs/base/browser/ui/selectBox/selectBox'; import { IViewDescriptor } from 'vs/workbench/common/views'; @@ -30,7 +29,7 @@ export class SwitchRemoteViewItem extends SelectActionViewItem { constructor( action: IAction, private readonly optionsItems: IRemoteSelectItem[], - @IThemeService private readonly themeService: IThemeService, + @IThemeService themeService: IThemeService, @IContextViewService contextViewService: IContextViewService, @IRemoteExplorerService remoteExplorerService: IRemoteExplorerService, @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, @@ -75,9 +74,6 @@ export class SwitchRemoteViewItem extends SelectActionViewItem { if (this.optionsItems.length > 1) { super.render(container); dom.addClass(container, 'switch-remote'); - this._register(attachStylerCallback(this.themeService, { selectBorder }, colors => { - container.style.border = colors.selectBorder ? `1px solid ${colors.selectBorder}` : ''; - })); } } diff --git a/src/vs/workbench/contrib/remote/browser/remote.ts b/src/vs/workbench/contrib/remote/browser/remote.ts index e337f914393..d0fc0b65af4 100644 --- a/src/vs/workbench/contrib/remote/browser/remote.ts +++ b/src/vs/workbench/contrib/remote/browser/remote.ts @@ -49,7 +49,7 @@ import { TunnelPanelDescriptor, TunnelViewModel, forwardedPortsViewEnabled } fro import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ITreeRenderer, ITreeNode, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree'; -import { WorkbenchAsyncDataTree, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Event } from 'vs/base/common/event'; import { ExtensionsRegistry, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; @@ -74,19 +74,19 @@ const remoteHelpExtPoint = ExtensionsRegistry.registerExtensionPoint ({ - extensionDescription: info.extensionDescription, - url: info.getStarted!, - remoteAuthority: (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName - })), + getStarted.map((info: HelpInformation) => (new HelpItemValue(commandService, + info.extensionDescription, + (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, + info.getStarted!) + )), quickInputService, environmentService, openerService, @@ -200,11 +200,11 @@ class HelpModel { helpItems.push(new HelpItem( documentationIcon, nls.localize('remote.help.documentation', "Read Documentation"), - documentation.map((info: HelpInformation) => ({ - extensionDescription: info.extensionDescription, - url: info.documentation!, - remoteAuthority: (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName - })), + documentation.map((info: HelpInformation) => (new HelpItemValue(commandService, + info.extensionDescription, + (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, + info.documentation!) + )), quickInputService, environmentService, openerService, @@ -218,11 +218,11 @@ class HelpModel { helpItems.push(new HelpItem( feedbackIcon, nls.localize('remote.help.feedback', "Provide Feedback"), - feedback.map((info: HelpInformation) => ({ - extensionDescription: info.extensionDescription, - url: info.feedback!, - remoteAuthority: (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName - })), + feedback.map((info: HelpInformation) => (new HelpItemValue(commandService, + info.extensionDescription, + (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, + info.feedback!) + )), quickInputService, environmentService, openerService, @@ -236,11 +236,11 @@ class HelpModel { helpItems.push(new HelpItem( reviewIssuesIcon, nls.localize('remote.help.issues', "Review Issues"), - issues.map((info: HelpInformation) => ({ - extensionDescription: info.extensionDescription, - url: info.issues!, - remoteAuthority: (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName - })), + issues.map((info: HelpInformation) => (new HelpItemValue(commandService, + info.extensionDescription, + (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, + info.issues!) + )), quickInputService, environmentService, openerService, @@ -252,10 +252,10 @@ class HelpModel { helpItems.push(new IssueReporterItem( reportIssuesIcon, nls.localize('remote.help.report', "Report Issue"), - viewModel.helpInformation.map(info => ({ - extensionDescription: info.extensionDescription, - remoteAuthority: (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName - })), + viewModel.helpInformation.map(info => (new HelpItemValue(commandService, + info.extensionDescription, + (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName + ))), quickInputService, environmentService, commandService, @@ -269,12 +269,35 @@ class HelpModel { } } +class HelpItemValue { + private _url: string | undefined; + constructor(private commandService: ICommandService, public extensionDescription: IExtensionDescription, public remoteAuthority: string[] | undefined, private urlOrCommand?: string) { } + + get url(): Promise { + return new Promise(async (resolve) => { + if (this._url === undefined) { + if (this.urlOrCommand) { + let url = URI.parse(this.urlOrCommand); + if (url.authority) { + this._url = this.urlOrCommand; + } else { + this._url = await this.commandService.executeCommand(this.urlOrCommand); + } + } else { + this._url = ''; + } + } + resolve(this._url); + }); + } +} + abstract class HelpItemBase implements IHelpItem { public iconClasses: string[] = []; constructor( public icon: Codicon, public label: string, - public values: { extensionDescription: IExtensionDescription, url?: string, remoteAuthority: string[] | undefined }[], + public values: HelpItemValue[], private quickInputService: IQuickInputService, private environmentService: IWorkbenchEnvironmentService, private remoteExplorerService: IRemoteExplorerService @@ -285,17 +308,16 @@ abstract class HelpItemBase implements IHelpItem { async handleClick() { const remoteAuthority = this.environmentService.configuration.remoteAuthority; - if (!remoteAuthority) { - return; - } - for (let i = 0; i < this.remoteExplorerService.targetType.length; i++) { - if (startsWith(remoteAuthority, this.remoteExplorerService.targetType[i])) { - for (let value of this.values) { - if (value.remoteAuthority) { - for (let authority of value.remoteAuthority) { - if (startsWith(remoteAuthority, authority)) { - await this.takeAction(value.extensionDescription, value.url); - return; + if (remoteAuthority) { + for (let i = 0; i < this.remoteExplorerService.targetType.length; i++) { + if (startsWith(remoteAuthority, this.remoteExplorerService.targetType[i])) { + for (let value of this.values) { + if (value.remoteAuthority) { + for (let authority of value.remoteAuthority) { + if (startsWith(remoteAuthority, authority)) { + await this.takeAction(value.extensionDescription, await value.url); + return; + } } } } @@ -304,13 +326,13 @@ abstract class HelpItemBase implements IHelpItem { } if (this.values.length > 1) { - let actions = this.values.map(value => { + let actions = await Promise.all(this.values.map(async (value) => { return { label: value.extensionDescription.displayName || value.extensionDescription.identifier.value, - description: value.url, + description: await value.url, extensionDescription: value.extensionDescription }; - }); + })); const action = await this.quickInputService.pick(actions, { placeHolder: nls.localize('pickRemoteExtension', "Select url to open") }); @@ -318,7 +340,7 @@ abstract class HelpItemBase implements IHelpItem { await this.takeAction(action.extensionDescription, action.description); } } else { - await this.takeAction(this.values[0].extensionDescription, this.values[0].url); + await this.takeAction(this.values[0].extensionDescription, await this.values[0].url); } } @@ -329,7 +351,7 @@ class HelpItem extends HelpItemBase { constructor( icon: Codicon, label: string, - values: { extensionDescription: IExtensionDescription; url: string, remoteAuthority: string[] | undefined }[], + values: HelpItemValue[], quickInputService: IQuickInputService, environmentService: IWorkbenchEnvironmentService, private openerService: IOpenerService, @@ -347,7 +369,7 @@ class IssueReporterItem extends HelpItemBase { constructor( icon: Codicon, label: string, - values: { extensionDescription: IExtensionDescription; remoteAuthority: string[] | undefined }[], + values: HelpItemValue[], quickInputService: IQuickInputService, environmentService: IWorkbenchEnvironmentService, private commandService: ICommandService, @@ -415,9 +437,7 @@ class HelpPanel extends ViewPane { this.tree.setInput(model); - const helpItemNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false })); - - this._register(Event.debounce(helpItemNavigator.onDidOpenResource, (last, event) => event, 75, true)(e => { + this._register(Event.debounce(this.tree.onDidOpen, (last, event) => event, 75, true)(e => { e.element.handleClick(); })); } diff --git a/src/vs/workbench/contrib/remote/browser/tunnelView.ts b/src/vs/workbench/contrib/remote/browser/tunnelView.ts index a9cbf589a7a..e235864eb3e 100644 --- a/src/vs/workbench/contrib/remote/browser/tunnelView.ts +++ b/src/vs/workbench/contrib/remote/browser/tunnelView.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/tunnelView'; import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; import { IViewDescriptor, IEditableData, IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; -import { WorkbenchAsyncDataTree, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService, IContextKey, RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -538,9 +538,7 @@ export class TunnelPanel extends ViewPane { this.tree.updateChildren(undefined, true); })); - const navigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false })); - - this._register(Event.debounce(navigator.onDidOpenResource, (last, event) => event, 75, true)(e => { + this._register(Event.debounce(this.tree.onDidOpen, (last, event) => event, 75, true)(e => { if (e.element && (e.element.tunnelType === TunnelType.Add)) { this.commandService.executeCommand(ForwardPortAction.INLINE_ID); } diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index d93238046a2..c422287b3c8 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -92,7 +92,7 @@ export class SCMStatusController implements IWorkbenchContribution { } private onDidAddRepository(repository: ISCMRepository): void { - const focusDisposable = repository.onDidFocus(() => this.focusRepository(repository)); + const selectedDisposable = Event.filter(repository.onDidChangeSelection, selected => selected)(() => this.focusRepository(repository)); const onDidChange = Event.any(repository.provider.onDidChange, repository.provider.onDidChangeResources); const changeDisposable = onDidChange(() => this.renderActivityCount()); @@ -104,14 +104,12 @@ export class SCMStatusController implements IWorkbenchContribution { if (this.scmService.repositories.length === 0) { this.focusRepository(undefined); - } else if (this.focusedRepository === repository) { - this.scmService.repositories[0].focus(); } this.renderActivityCount(); }); - const disposable = combinedDisposable(focusDisposable, changeDisposable, removeDisposable); + const disposable = combinedDisposable(selectedDisposable, changeDisposable, removeDisposable); this.disposables.push(disposable); if (this.focusedRepository) { diff --git a/src/vs/workbench/contrib/scm/browser/mainPane.ts b/src/vs/workbench/contrib/scm/browser/mainPane.ts deleted file mode 100644 index 3eb3627812f..00000000000 --- a/src/vs/workbench/contrib/scm/browser/mainPane.ts +++ /dev/null @@ -1,362 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import 'vs/css!./media/scmViewlet'; -import { localize } from 'vs/nls'; -import { Event, Emitter } from 'vs/base/common/event'; -import { basename } from 'vs/base/common/resources'; -import { IDisposable, dispose, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; -import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; -import { append, $, toggleClass } from 'vs/base/browser/dom'; -import { IListVirtualDelegate, IListRenderer, IListContextMenuEvent, IListEvent } from 'vs/base/browser/ui/list/list'; -import { ISCMRepository } from 'vs/workbench/contrib/scm/common/scm'; -import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; -import { IAction, Action } from 'vs/base/common/actions'; -import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { ActionBar, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; -import { Command } from 'vs/editor/common/modes'; -import { renderCodicons, Codicon } from 'vs/base/common/codicons'; -import { escape } from 'vs/base/common/strings'; -import { WorkbenchList } from 'vs/platform/list/browser/listService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IViewDescriptor, IViewDescriptorService } from 'vs/workbench/common/views'; -import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; -import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; - -export interface ISpliceEvent { - index: number; - deleteCount: number; - elements: T[]; -} - -export interface IViewModel { - readonly repositories: ISCMRepository[]; - readonly onDidSplice: Event>; - - readonly visibleRepositories: ISCMRepository[]; - readonly onDidChangeVisibleRepositories: Event; - setVisibleRepositories(repositories: ISCMRepository[]): void; - - isVisible(): boolean; - readonly onDidChangeVisibility: Event; -} - -class ProvidersListDelegate implements IListVirtualDelegate { - - getHeight(): number { - return 22; - } - - getTemplateId(): string { - return 'provider'; - } -} - -class StatusBarAction extends Action { - - constructor( - private command: Command, - private commandService: ICommandService - ) { - super(`statusbaraction{${command.id}}`, command.title, '', true); - this.tooltip = command.tooltip || ''; - } - - run(): Promise { - return this.commandService.executeCommand(this.command.id, ...(this.command.arguments || [])); - } -} - -class StatusBarActionViewItem extends ActionViewItem { - - constructor(action: StatusBarAction) { - super(null, action, {}); - } - - updateLabel(): void { - if (this.options.label && this.label) { - this.label.innerHTML = renderCodicons(escape(this.getAction().label)); - } - } -} - -interface RepositoryTemplateData { - title: HTMLElement; - type: HTMLElement; - countContainer: HTMLElement; - count: CountBadge; - actionBar: ActionBar; - disposable: IDisposable; - templateDisposable: IDisposable; -} - -class ProviderRenderer implements IListRenderer { - - readonly templateId = 'provider'; - - private readonly _onDidRenderElement = new Emitter(); - readonly onDidRenderElement = this._onDidRenderElement.event; - - constructor( - @ICommandService protected commandService: ICommandService, - @IThemeService protected themeService: IThemeService - ) { } - - renderTemplate(container: HTMLElement): RepositoryTemplateData { - const provider = append(container, $('.scm-provider')); - const name = append(provider, $('.name')); - const title = append(name, $('span.title')); - const type = append(name, $('span.type')); - const countContainer = append(provider, $('.count')); - const count = new CountBadge(countContainer); - const badgeStyler = attachBadgeStyler(count, this.themeService); - const actionBar = new ActionBar(provider, { actionViewItemProvider: a => new StatusBarActionViewItem(a as StatusBarAction) }); - const disposable = Disposable.None; - const templateDisposable = combinedDisposable(actionBar, badgeStyler); - - return { title, type, countContainer, count, actionBar, disposable, templateDisposable }; - } - - renderElement(repository: ISCMRepository, index: number, templateData: RepositoryTemplateData): void { - templateData.disposable.dispose(); - const disposables = new DisposableStore(); - - if (repository.provider.rootUri) { - templateData.title.textContent = basename(repository.provider.rootUri); - templateData.type.textContent = repository.provider.label; - } else { - templateData.title.textContent = repository.provider.label; - templateData.type.textContent = ''; - } - - const actions: IAction[] = []; - const disposeActions = () => dispose(actions); - disposables.add({ dispose: disposeActions }); - - const update = () => { - disposeActions(); - - const commands = repository.provider.statusBarCommands || []; - actions.splice(0, actions.length, ...commands.map(c => new StatusBarAction(c, this.commandService))); - templateData.actionBar.clear(); - templateData.actionBar.push(actions); - - const count = repository.provider.count || 0; - toggleClass(templateData.countContainer, 'hidden', count === 0); - templateData.count.setCount(count); - - this._onDidRenderElement.fire(repository); - }; - - disposables.add(repository.provider.onDidChange(update, null)); - update(); - - templateData.disposable = disposables; - } - - disposeTemplate(templateData: RepositoryTemplateData): void { - templateData.disposable.dispose(); - templateData.templateDisposable.dispose(); - } -} - -export class MainPane extends ViewPane { - - static readonly ID = 'scm.mainPane'; - static readonly TITLE = localize('scm providers', "Source Control Providers"); - - private list!: WorkbenchList; - - constructor( - protected viewModel: IViewModel, - options: IViewPaneOptions, - @IKeybindingService protected keybindingService: IKeybindingService, - @IContextMenuService protected contextMenuService: IContextMenuService, - @IInstantiationService instantiationService: IInstantiationService, - @IViewDescriptorService viewDescriptorService: IViewDescriptorService, - @IContextKeyService contextKeyService: IContextKeyService, - @IMenuService private readonly menuService: IMenuService, - @IConfigurationService configurationService: IConfigurationService, - @IOpenerService openerService: IOpenerService, - @IThemeService themeService: IThemeService, - @ITelemetryService telemetryService: ITelemetryService, - @ICommandService private readonly commandService: ICommandService - ) { - super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); - } - - protected renderBody(container: HTMLElement): void { - super.renderBody(container); - - const delegate = new ProvidersListDelegate(); - const renderer = this.instantiationService.createInstance(ProviderRenderer); - const identityProvider = { getId: (r: ISCMRepository) => r.provider.id }; - - this.list = this.instantiationService.createInstance(WorkbenchList, `SCM Main`, container, delegate, [renderer], { - identityProvider, - horizontalScrolling: false, - overrideStyles: { - listBackground: SIDE_BAR_BACKGROUND - }, - accessibilityProvider: { - getAriaLabel(r: ISCMRepository) { - return r.provider.label; - }, - getWidgetAriaLabel() { - return MainPane.TITLE; - } - } - }) as WorkbenchList; - - this._register(renderer.onDidRenderElement(e => this.list.updateWidth(this.viewModel.repositories.indexOf(e)), null)); - this._register(this.list.onDidChangeSelection(this.onListSelectionChange, this)); - this._register(this.list.onDidChangeFocus(this.onListFocusChange, this)); - this._register(this.list.onContextMenu(this.onListContextMenu, this)); - - this._register(this.viewModel.onDidChangeVisibleRepositories(this.updateListSelection, this)); - - this._register(this.viewModel.onDidSplice(({ index, deleteCount, elements }) => this.splice(index, deleteCount, elements), null)); - this.splice(0, 0, this.viewModel.repositories); - - this._register(this.list); - - this._register(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('scm.providers.visible')) { - this.updateBodySize(); - } - })); - - this.updateListSelection(); - } - - private splice(index: number, deleteCount: number, repositories: ISCMRepository[] = []): void { - this.list.splice(index, deleteCount, repositories); - - const empty = this.list.length === 0; - toggleClass(this.element, 'empty', empty); - - this.updateBodySize(); - } - - focus(): void { - this.list.domFocus(); - } - - protected layoutBody(height: number, width: number): void { - super.layoutBody(height, width); - this.list.layout(height, width); - } - - private updateBodySize(): void { - const visibleCount = this.configurationService.getValue('scm.providers.visible'); - const empty = this.list.length === 0; - const size = Math.min(this.viewModel.repositories.length, visibleCount) * 22; - - this.minimumBodySize = visibleCount === 0 ? 22 : size; - this.maximumBodySize = visibleCount === 0 ? Number.POSITIVE_INFINITY : empty ? Number.POSITIVE_INFINITY : size; - } - - private onListContextMenu(e: IListContextMenuEvent): void { - if (!e.element) { - return; - } - - const repository = e.element; - const contextKeyService = this.contextKeyService.createScoped(); - const scmProviderKey = contextKeyService.createKey('scmProvider', undefined); - scmProviderKey.set(repository.provider.contextValue); - - const menu = this.menuService.createMenu(MenuId.SCMSourceControl, contextKeyService); - const primary: IAction[] = []; - const secondary: IAction[] = []; - const result = { primary, secondary }; - - const disposable = createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => g === 'inline'); - - menu.dispose(); - contextKeyService.dispose(); - - if (repository.provider.rootUri) { - secondary.push(new Action('_openInTerminal', localize('open in terminal', "Open In Terminal"), undefined, true, async () => { - await this.commandService.executeCommand('openInTerminal', repository.provider.rootUri); - })); - } - - if (secondary.length === 0) { - return; - } - - this.contextMenuService.showContextMenu({ - getAnchor: () => e.anchor, - getActions: () => secondary, - getActionsContext: () => repository.provider - }); - - disposable.dispose(); - } - - private onListSelectionChange(e: IListEvent): void { - if (e.browserEvent && e.elements.length > 0) { - const scrollTop = this.list.scrollTop; - this.viewModel.setVisibleRepositories(e.elements); - this.list.scrollTop = scrollTop; - } - } - - private onListFocusChange(e: IListEvent): void { - if (e.browserEvent && e.elements.length > 0) { - e.elements[0].focus(); - } - } - - private updateListSelection(): void { - const set = new Set(); - - for (const repository of this.viewModel.visibleRepositories) { - set.add(repository); - } - - const selection: number[] = []; - - for (let i = 0; i < this.list.length; i++) { - if (set.has(this.list.element(i))) { - selection.push(i); - } - } - - this.list.setSelection(selection); - - if (selection.length > 0) { - this.list.setFocus([selection[0]]); - } - } -} - -export class MainPaneDescriptor implements IViewDescriptor { - - readonly id = MainPane.ID; - readonly name = MainPane.TITLE; - readonly containerIcon = Codicon.sourceControl.classNames; - readonly ctorDescriptor: SyncDescriptor; - readonly canToggleVisibility = true; - readonly hideByDefault = false; - readonly order = -1000; - readonly workspace = true; - readonly when = ContextKeyExpr.or(ContextKeyExpr.equals('config.scm.alwaysShowProviders', true), ContextKeyExpr.and(ContextKeyExpr.notEquals('scm.providerCount', 0), ContextKeyExpr.notEquals('scm.providerCount', 1))); - - constructor(viewModel: IViewModel) { - this.ctorDescriptor = new SyncDescriptor(MainPane, [viewModel]); - } -} diff --git a/src/vs/workbench/contrib/scm/browser/media/scm.css b/src/vs/workbench/contrib/scm/browser/media/scm.css new file mode 100644 index 00000000000..867f31d6f12 --- /dev/null +++ b/src/vs/workbench/contrib/scm/browser/media/scm.css @@ -0,0 +1,231 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.scm-view { + height: 100%; + position: relative; +} + +.scm-view .monaco-tl-contents > div { + margin-right: 12px; + overflow: hidden; +} + +.scm-view .count { + display: flex; + margin-left: 6px; +} + +.scm-view .count.hidden { + display: none; +} + +.scm-view .scm-provider { + display: flex; + flex-direction: column; + height: 100%; + align-items: center; + flex-flow: nowrap; +} + +.scm-view.hide-provider-counts .scm-provider > .count, +.scm-view.auto-provider-counts .scm-provider > .count[data-count="0"] { + display: none; +} + +.scm-view .scm-provider > .label { + display: flex; + flex-shrink: 1; + overflow: hidden; +} + +.scm-view .scm-provider > .label > .name { + font-weight: bold; +} + +.scm-view .scm-provider > .label > .description { + opacity: 0.7; + margin-left: 0.5em; + font-size: 0.9em; +} + +.scm-view .scm-provider > .actions { + flex: 1; + padding-left: 10px; + overflow: hidden; + justify-content: flex-end; +} + +/** + * The following rules are very specific because of inline drop down menus + * https://github.com/microsoft/vscode/issues/101410 + */ +.scm-view .scm-provider > .actions > .monaco-toolbar > .monaco-action-bar > .actions-container > .action-item { + padding-left: 4px; + display: flex; + align-items: center; + min-width: 16px; +} + +.scm-view .scm-provider > .actions > .monaco-toolbar > .monaco-action-bar > .actions-container > .action-item > .action-label, +.scm-view .scm-provider > .actions > .monaco-toolbar > .monaco-action-bar > .actions-container > .action-item > .monaco-dropdown > .dropdown-label > .action-label { + display: flex; + align-items: center; + overflow: hidden; + min-width: 16px; /* for flex */ + height: 100%; + margin: 0; + background-repeat: no-repeat; + background-position: center; +} + +.scm-view .scm-provider > .actions > .monaco-toolbar > .monaco-action-bar > .actions-container > .action-item:last-of-type { + padding-right: 0; +} + +.scm-view .scm-provider > .body { + flex-grow: 1; +} + +.scm-view .monaco-list-row { + line-height: 22px; +} + +.scm-view .monaco-list-row .resource-group { + display: flex; + height: 100%; + align-items: center; +} + +.scm-view .monaco-list-row .resource-group > .name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; +} + +.scm-view .monaco-list-row .resource { + display: flex; + height: 100%; +} + +.scm-view .monaco-list-row .resource.faded { + opacity: 0.7; +} + +.scm-view .monaco-list-row .resource > .name { + flex: 1; + overflow: hidden; +} + +.scm-view .monaco-list-row .resource > .name > .monaco-icon-label::after { + padding-right: 3px; +} + +.scm-view .monaco-list-row .resource > .name.strike-through > .monaco-icon-label > .monaco-icon-label-container > .monaco-icon-name-container > .label-name { + text-decoration: line-through; +} + +.scm-view .monaco-list-row .resource > .decoration-icon { + width: 16px; + height: 100%; + background-repeat: no-repeat; + background-position: 50% 50%; + margin-right: 8px; +} + +.scm-view .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { + flex-grow: 100; +} + +.scm-view .monaco-list .monaco-list-row .resource-group > .actions, +.scm-view .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { + display: none; + max-width: fit-content; +} + +.scm-view .monaco-list .monaco-list-row:hover .resource-group > .actions, +.scm-view .monaco-list .monaco-list-row.selected .resource-group > .actions, +.scm-view .monaco-list .monaco-list-row.focused .resource-group > .actions, +.scm-view .monaco-list .monaco-list-row:hover .resource > .name > .monaco-icon-label > .actions, +.scm-view .monaco-list .monaco-list-row.selected .resource > .name > .monaco-icon-label > .actions, +.scm-view .monaco-list .monaco-list-row.focused .resource > .name > .monaco-icon-label > .actions, +.scm-view .monaco-list:not(.selection-multiple) .monaco-list-row .resource:hover > .actions { + display: block; +} + +.scm-view.show-actions .scm-provider > .actions, +.scm-view.show-actions > .monaco-list .monaco-list-row .resource-group > .actions, +.scm-view.show-actions > .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { + display: block; +} + +.scm-view .monaco-list-row .resource > .name > .monaco-icon-label > .actions .action-label, +.scm-view .monaco-list-row .resource-group > .actions .action-label { + width: 16px; + height: 100%; + background-position: 50% 50%; + background-repeat: no-repeat; +} + +.scm-view .monaco-list-row .resource > .name > .monaco-icon-label > .actions .action-label.codicon { + line-height: 22px; +} + +.scm-view .scm-input { + height: 100%; + margin-left: 9px; +} + +.scm-view .scm-editor { + box-sizing: border-box; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; +} + +.scm-view .scm-editor.hidden { + display: none; +} + +.scm-view .scm-editor-container { + position: relative; + box-sizing: border-box; + padding: 1px; + outline-offset: -1px; +} + +.scm-editor-validation { + box-sizing: border-box; + font-size: 0.9em; + padding: 1px 3px; + display: block; + border-width: 1px; + border-style: solid; + border-top: none; +} + +.scm-view .scm-editor-placeholder { + position: absolute; + pointer-events: none; + z-index: 1; + padding: 2px 4px 3px 4px; + box-sizing: border-box; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.scm-view .scm-editor-placeholder.hidden { + display: none; +} + +.scm-view .scm-editor-container .monaco-editor-background, +.scm-view .scm-editor-container .monaco-editor, +.scm-view .scm-editor-container .mtk1 { + color: inherit; +} diff --git a/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css b/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css deleted file mode 100644 index d07684c843d..00000000000 --- a/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css +++ /dev/null @@ -1,215 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.monaco-workbench .viewlet.scm-viewlet .collapsible.header .actions { - width: initial; - flex: 1; -} - -.scm-viewlet .scm-status { - height: 100%; - position: relative; -} - -.scm-viewlet .monaco-list-row > .scm-provider { - display: flex; - align-items: center; - flex-wrap: wrap; - height: 100%; - padding: 0 12px 0 20px; -} - -.scm-viewlet .monaco-list-row > .scm-provider > .monaco-action-bar { - flex: 1; -} - -.scm-viewlet .monaco-list-row > .scm-provider > .monaco-action-bar .action-item { - padding: 0 4px; - overflow: hidden; - text-overflow: ellipsis; - display: flex; - align-items: center; - min-width: 14px; -} - -.scm-viewlet .monaco-list-row > .scm-provider > .monaco-action-bar .action-label { - text-overflow: ellipsis; - overflow: hidden; - min-width: 14px; /* minimum size of icons */ -} - -.scm-viewlet .monaco-list-row > .scm-provider > .monaco-action-bar .action-label .codicon { - font-size: 14px; - vertical-align: sub; - display: inline-flex; -} - -.scm-viewlet .monaco-list-row > .scm-provider > .monaco-action-bar .action-item:last-of-type { - padding-right: 0; -} - -.scm-viewlet .scm-provider > .name, -.scm-viewlet .scm-provider > .count { - display: flex; - align-items: center; -} - -.scm-viewlet .scm-provider > .count { - margin: 0 0.5em; -} - -.scm-viewlet .scm-provider > .count.hidden { - display: none; -} - -.scm-viewlet .scm-provider > .type, -.scm-viewlet .scm-provider > .name > .type { - opacity: 0.7; - margin-left: 0.5em; - font-size: 0.9em; -} - -.scm-viewlet .monaco-list-row { - line-height: 22px; -} - -.scm-viewlet .monaco-list-row .resource-group { - display: flex; - height: 100%; - align-items: center; -} - -.scm-viewlet .monaco-list-row .resource-group > .name { - flex: 1; - font-size: 11px; - font-weight: bold; - overflow: hidden; - text-overflow: ellipsis; -} - -.scm-viewlet .monaco-list-row .resource { - display: flex; - height: 100%; -} - -.scm-viewlet .monaco-list-row .resource.faded { - opacity: 0.7; -} - -.scm-viewlet .monaco-list-row .resource > .name { - flex: 1; - overflow: hidden; -} - -.scm-viewlet .monaco-list-row .resource > .name.strike-through > .monaco-icon-label > .monaco-icon-label-container > .monaco-icon-name-container > .label-name { - text-decoration: line-through; -} - -.scm-viewlet .monaco-list-row .resource-group > .count { - padding: 0 12px 0 8px; - display: flex; -} - -.scm-viewlet .monaco-list-row .resource > .decoration-icon { - width: 16px; - height: 100%; - background-repeat: no-repeat; - background-position: 50% 50%; - margin-right: 8px; -} - -.scm-viewlet .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { - flex-grow: 100; -} - -.scm-viewlet .monaco-list .monaco-list-row .resource-group > .actions, -.scm-viewlet .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { - display: none; - max-width: fit-content; -} - -.scm-viewlet .monaco-list .monaco-list-row:hover .resource-group > .actions, -.scm-viewlet .monaco-list .monaco-list-row:hover .resource > .name > .monaco-icon-label > .actions, -.scm-viewlet .monaco-list .monaco-list-row.selected .resource-group > .actions, -.scm-viewlet .monaco-list .monaco-list-row.focused .resource-group > .actions, -.scm-viewlet .monaco-list .monaco-list-row.selected .resource > .name > .monaco-icon-label > .actions, -.scm-viewlet .monaco-list .monaco-list-row.focused .resource > .name > .monaco-icon-label > .actions, -.scm-viewlet .monaco-list:not(.selection-multiple) .monaco-list-row .resource:hover > .actions { - display: block; -} - -.scm-viewlet .scm-status.show-actions > .monaco-list .monaco-list-row .resource-group > .actions, -.scm-viewlet .scm-status.show-actions > .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { - display: block; -} - -.scm-viewlet .monaco-list-row .resource > .name > .monaco-icon-label > .actions .action-label, -.scm-viewlet .monaco-list-row .resource-group > .actions .action-label { - width: 16px; - height: 100%; - background-position: 50% 50%; - background-repeat: no-repeat; -} - -.scm-viewlet .monaco-list-row .resource > .name > .monaco-icon-label > .actions .action-label.codicon { - line-height: 22px; -} - -.scm-viewlet .scm-editor { - box-sizing: border-box; - padding: 5px 12px 5px 16px; -} - -.scm-viewlet .scm-editor.hidden { - display: none; -} - -.scm-viewlet .scm-editor-container { - padding: 1px; - position: relative; - outline-offset: -1px; -} - -.scm-viewlet .scm-editor-container > .scm-editor-validation { - position: absolute; - width: 100%; - z-index: 10; - left: 0px; - box-sizing: border-box; - font-size: 0.9em; - padding: 1px 3px; - display: none; -} - -.scm-viewlet .scm-editor-container.synthetic-focus > .scm-editor-validation { - display: block; -} - -.scm-viewlet .scm-editor-placeholder { - position: absolute; - pointer-events: none; - z-index: 1; - margin: 1px; - padding: 3px 4px; - box-sizing: border-box; - width: 100%; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.scm-viewlet .scm-editor-placeholder.hidden { - display: none; -} - -.scm-viewlet .scm-editor-container .monaco-editor-background, -.scm-viewlet .scm-editor-container .monaco-editor, -.scm-viewlet .scm-editor-container .mtk1 { - color: inherit; -} - -.scm-viewlet .scm-status.show-file-icons.hide-arrows.tree-view-mode .monaco-tl-indent .indent-guide:first-child { - border: none; -} diff --git a/src/vs/workbench/contrib/scm/browser/menus.ts b/src/vs/workbench/contrib/scm/browser/menus.ts index 327801803c2..6f1eebbe641 100644 --- a/src/vs/workbench/contrib/scm/browser/menus.ts +++ b/src/vs/workbench/contrib/scm/browser/menus.ts @@ -3,18 +3,21 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./media/scmViewlet'; +import 'vs/css!./media/scm'; import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; -import { IAction } from 'vs/base/common/actions'; +import { IAction, Action } from 'vs/base/common/actions'; import { createAndFillInContextMenuActions, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { ISCMProvider, ISCMResource, ISCMResourceGroup } from 'vs/workbench/contrib/scm/common/scm'; +import { ISCMResource, ISCMResourceGroup, ISCMProvider, ISCMRepository } from 'vs/workbench/contrib/scm/common/scm'; import { isSCMResource } from './util'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { equals } from 'vs/base/common/arrays'; -import { ISplice } from 'vs/base/common/sequence'; +import { ISplice, ISequence } from 'vs/base/common/sequence'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { localize } from 'vs/nls'; +import { ICommandService } from 'vs/platform/commands/common/commands'; function actionEquals(a: IAction, b: IAction): boolean { return a.id === b.id; @@ -35,11 +38,11 @@ export function getSCMResourceContextKey(resource: ISCMResourceGroup | ISCMResou return isSCMResource(resource) ? resource.resourceGroup.id : resource.id; } -export class SCMMenus implements IDisposable { +export class SCMRepositoryMenus implements IDisposable { private contextKeyService: IContextKeyService; - private titleMenu: IMenu; + readonly titleMenu: IMenu; private titleActionDisposable: IDisposable = Disposable.None; private titleActions: IAction[] = []; private titleSecondaryActions: IAction[] = []; @@ -53,8 +56,9 @@ export class SCMMenus implements IDisposable { private readonly disposables = new DisposableStore(); constructor( - provider: ISCMProvider | undefined, + readonly provider: ISCMProvider | undefined, @IContextKeyService contextKeyService: IContextKeyService, + @ICommandService private readonly commandService: ICommandService, @IMenuService private readonly menuService: IMenuService, @IContextMenuService private readonly contextMenuService: IContextMenuService ) { @@ -63,15 +67,14 @@ export class SCMMenus implements IDisposable { if (provider) { scmProviderKey.set(provider.contextValue); - this.onDidSpliceGroups({ start: 0, deleteCount: 0, toInsert: provider.groups.elements }); provider.groups.onDidSplice(this.onDidSpliceGroups, this, this.disposables); + this.onDidSpliceGroups({ start: 0, deleteCount: 0, toInsert: provider.groups.elements }); } else { scmProviderKey.set(''); } this.titleMenu = this.menuService.createMenu(MenuId.SCMTitle, this.contextKeyService); this.disposables.add(this.titleMenu); - this.titleMenu.onDidChange(this.updateTitleActions, this, this.disposables); this.updateTitleActions(); } @@ -103,6 +106,34 @@ export class SCMMenus implements IDisposable { return this.titleSecondaryActions; } + getRepositoryContextActions(): IAction[] { + if (!this.provider) { + return []; + } + + const contextKeyService = this.contextKeyService.createScoped(); + const scmProviderKey = contextKeyService.createKey('scmProvider', undefined); + scmProviderKey.set(this.provider.contextValue); + + const menu = this.menuService.createMenu(MenuId.SCMSourceControl, contextKeyService); + const primary: IAction[] = []; + const secondary: IAction[] = []; + const result = { primary, secondary }; + const disposable = createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => g === 'inline'); + + disposable.dispose(); + menu.dispose(); + contextKeyService.dispose(); + + if (this.provider.rootUri) { + secondary.push(new Action('_openInTerminal', localize('open in terminal', "Open In Terminal"), undefined, true, async () => { + await this.commandService.executeCommand('openInTerminal', this.provider!.rootUri); + })); + } + + return secondary; + } + getResourceGroupContextActions(group: ISCMResourceGroup): IAction[] { return this.getActions(MenuId.SCMResourceGroupContext, group).secondary; } @@ -183,3 +214,49 @@ export class SCMMenus implements IDisposable { this.resourceGroupMenuEntries.forEach(e => e.disposable.dispose()); } } + +export class SCMMenus { + + private readonly disposables = new DisposableStore(); + private readonly entries: { repository: ISCMRepository, dispose: () => void }[] = []; + private readonly menus = new Map(); + + constructor( + repositories: ISequence, + @IInstantiationService private instantiationService: IInstantiationService + ) { + repositories.onDidSplice(this.onDidSplice, this, this.disposables); + this.onDidSplice({ start: 0, deleteCount: 0, toInsert: repositories.elements }); + } + + getRepositoryMenus(provider: ISCMProvider): SCMRepositoryMenus { + if (!this.menus.has(provider)) { + throw new Error('SCM Repository menu not found'); + } + + return this.menus.get(provider)!; + } + + private onDidSplice({ start, deleteCount, toInsert }: ISplice): void { + const entriesToInsert = toInsert.map(repository => { + const menus = this.instantiationService.createInstance(SCMRepositoryMenus, repository.provider); + const dispose = () => { + menus.dispose(); + this.menus.delete(repository.provider); + }; + + this.menus.set(repository.provider, menus); + return { repository, dispose }; + }); + + const deletedEntries = this.entries.splice(start, deleteCount, ...entriesToInsert); + + for (const entry of deletedEntries) { + entry.dispose(); + } + } + + dispose(): void { + this.disposables.dispose(); + } +} diff --git a/src/vs/workbench/contrib/scm/browser/repositoryPane.ts b/src/vs/workbench/contrib/scm/browser/repositoryPane.ts deleted file mode 100644 index 85a9090f68f..00000000000 --- a/src/vs/workbench/contrib/scm/browser/repositoryPane.ts +++ /dev/null @@ -1,1406 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import 'vs/css!./media/scmViewlet'; -import { Event, Emitter } from 'vs/base/common/event'; -import { basename, dirname, isEqual } from 'vs/base/common/resources'; -import { IDisposable, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; -import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; -import { append, $, addClass, toggleClass, trackFocus, removeClass } from 'vs/base/browser/dom'; -import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { ISCMRepository, ISCMResourceGroup, ISCMResource, InputValidationType } from 'vs/workbench/contrib/scm/common/scm'; -import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels'; -import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { MenuItemAction, IMenuService } from 'vs/platform/actions/common/actions'; -import { IAction, IActionViewItem, ActionRunner, Action, RadioGroup } from 'vs/base/common/actions'; -import { ContextAwareMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { SCMMenus } from './menus'; -import { ActionBar, IActionViewItemProvider, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { IThemeService, LIGHT, registerThemingParticipant, IFileIconTheme } from 'vs/platform/theme/common/themeService'; -import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar } from './util'; -import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; -import { WorkbenchCompressibleObjectTree, TreeResourceNavigator, IOpenEvent } from 'vs/platform/list/browser/listService'; -import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -import { disposableTimeout, ThrottledDelayer } from 'vs/base/common/async'; -import { INotificationService } from 'vs/platform/notification/common/notification'; -import { ITreeNode, ITreeFilter, ITreeSorter, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; -import { ResourceTree, IResourceNode } from 'vs/base/common/resourceTree'; -import { ISequence, ISplice } from 'vs/base/common/sequence'; -import { ICompressibleTreeRenderer, ICompressibleKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/tree/objectTree'; -import { Iterable } from 'vs/base/common/iterator'; -import { ICompressedTreeNode, ICompressedTreeElement } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; -import { URI } from 'vs/base/common/uri'; -import { FileKind } from 'vs/platform/files/common/files'; -import { compareFileNames, comparePaths } from 'vs/base/common/comparers'; -import { FuzzyScore, createMatches, IMatch } from 'vs/base/common/filters'; -import { IViewDescriptor, IViewDescriptorService } from 'vs/workbench/common/views'; -import { localize } from 'vs/nls'; -import { flatten, find } from 'vs/base/common/arrays'; -import { memoize } from 'vs/base/common/decorators'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { toResource, SideBySideEditor } from 'vs/workbench/common/editor'; -import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; -import { Hasher } from 'vs/base/common/hash'; -import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; -import { ITextModel } from 'vs/editor/common/model'; -import { IEditorConstructionOptions } from 'vs/editor/common/config/editorOptions'; -import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; -import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; -import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; -import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; -import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import * as platform from 'vs/base/common/platform'; -import { format, compare } from 'vs/base/common/strings'; -import { inputPlaceholderForeground, inputValidationInfoBorder, inputValidationWarningBorder, inputValidationErrorBorder, inputValidationInfoBackground, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningForeground, inputValidationErrorBackground, inputValidationErrorForeground, inputBackground, inputForeground, inputBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { Schemas } from 'vs/base/common/network'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { ModesHoverController } from 'vs/editor/contrib/hover/hover'; -import { ColorDetector } from 'vs/editor/contrib/colorPicker/colorDetector'; -import { LinkDetector } from 'vs/editor/contrib/links/links'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; -import { IModeService } from 'vs/editor/common/services/modeService'; -import { ILabelService } from 'vs/platform/label/common/label'; -import { ContextSubMenu } from 'vs/base/browser/contextmenu'; -import { KeyCode } from 'vs/base/common/keyCodes'; -import { DEFAULT_FONT_FAMILY } from 'vs/workbench/browser/style'; - -type TreeElement = ISCMResourceGroup | IResourceNode | ISCMResource; - -function splitMatches(uri: URI, filterData: FuzzyScore | undefined): [IMatch[] | undefined, IMatch[] | undefined] { - let matches: IMatch[] | undefined; - let descriptionMatches: IMatch[] | undefined; - - if (filterData) { - matches = []; - descriptionMatches = []; - - const fileName = basename(uri); - const allMatches = createMatches(filterData); - - for (const match of allMatches) { - if (match.start < fileName.length) { - matches!.push( - { - start: match.start, - end: Math.min(match.end, fileName.length) - } - ); - } else { - descriptionMatches!.push( - { - start: match.start - (fileName.length + 1), - end: match.end - (fileName.length + 1) - } - ); - } - } - } - - return [matches, descriptionMatches]; -} - -interface ResourceGroupTemplate { - readonly name: HTMLElement; - readonly count: CountBadge; - readonly actionBar: ActionBar; - elementDisposables: IDisposable; - readonly disposables: IDisposable; -} - -class ResourceGroupRenderer implements ICompressibleTreeRenderer { - - static readonly TEMPLATE_ID = 'resource group'; - get templateId(): string { return ResourceGroupRenderer.TEMPLATE_ID; } - - constructor( - private actionViewItemProvider: IActionViewItemProvider, - private themeService: IThemeService, - private menus: SCMMenus - ) { } - - renderTemplate(container: HTMLElement): ResourceGroupTemplate { - // hack - addClass(container.parentElement!.parentElement!.querySelector('.monaco-tl-twistie')! as HTMLElement, 'force-twistie'); - - const element = append(container, $('.resource-group')); - const name = append(element, $('.name')); - const actionsContainer = append(element, $('.actions')); - const actionBar = new ActionBar(actionsContainer, { actionViewItemProvider: this.actionViewItemProvider }); - const countContainer = append(element, $('.count')); - const count = new CountBadge(countContainer); - const styler = attachBadgeStyler(count, this.themeService); - const elementDisposables = Disposable.None; - const disposables = combinedDisposable(actionBar, styler); - - return { name, count, actionBar, elementDisposables, disposables }; - } - - renderElement(node: ITreeNode, index: number, template: ResourceGroupTemplate): void { - template.elementDisposables.dispose(); - - const group = node.element; - template.name.textContent = group.label; - template.actionBar.clear(); - template.actionBar.context = group; - template.count.setCount(group.elements.length); - - const disposables = new DisposableStore(); - disposables.add(connectPrimaryMenuToInlineActionBar(this.menus.getResourceGroupMenu(group), template.actionBar)); - - template.elementDisposables = disposables; - } - - renderCompressedElements(node: ITreeNode, FuzzyScore>, index: number, templateData: ResourceGroupTemplate, height: number | undefined): void { - throw new Error('Should never happen since node is incompressible'); - } - - disposeElement(group: ITreeNode, index: number, template: ResourceGroupTemplate): void { - template.elementDisposables.dispose(); - } - - disposeTemplate(template: ResourceGroupTemplate): void { - template.elementDisposables.dispose(); - template.disposables.dispose(); - } -} - -interface ResourceTemplate { - element: HTMLElement; - name: HTMLElement; - fileLabel: IResourceLabel; - decorationIcon: HTMLElement; - actionBar: ActionBar; - elementDisposables: IDisposable; - disposables: IDisposable; -} - -class RepositoryPaneActionRunner extends ActionRunner { - - constructor(private getSelectedResources: () => (ISCMResource | IResourceNode)[]) { - super(); - } - - async runAction(action: IAction, context: ISCMResource | IResourceNode): Promise { - if (!(action instanceof MenuItemAction)) { - return super.runAction(action, context); - } - - const selection = this.getSelectedResources(); - const contextIsSelected = selection.some(s => s === context); - const actualContext = contextIsSelected ? selection : [context]; - const args = flatten(actualContext.map(e => ResourceTree.isResourceNode(e) ? ResourceTree.collect(e) : [e])); - await action.run(...args); - } -} - -class ResourceRenderer implements ICompressibleTreeRenderer, FuzzyScore, ResourceTemplate> { - - static readonly TEMPLATE_ID = 'resource'; - get templateId(): string { return ResourceRenderer.TEMPLATE_ID; } - - constructor( - private viewModelProvider: () => ViewModel, - private labels: ResourceLabels, - private actionViewItemProvider: IActionViewItemProvider, - private actionRunner: ActionRunner, - private themeService: IThemeService, - private menus: SCMMenus - ) { } - - renderTemplate(container: HTMLElement): ResourceTemplate { - const element = append(container, $('.resource')); - const name = append(element, $('.name')); - const fileLabel = this.labels.create(name, { supportDescriptionHighlights: true, supportHighlights: true }); - const actionsContainer = append(fileLabel.element, $('.actions')); - const actionBar = new ActionBar(actionsContainer, { - actionViewItemProvider: this.actionViewItemProvider, - actionRunner: this.actionRunner - }); - - const decorationIcon = append(element, $('.decoration-icon')); - const disposables = combinedDisposable(actionBar, fileLabel); - - return { element, name, fileLabel, decorationIcon, actionBar, elementDisposables: Disposable.None, disposables }; - } - - renderElement(node: ITreeNode | ITreeNode, FuzzyScore>, index: number, template: ResourceTemplate): void { - template.elementDisposables.dispose(); - - const elementDisposables = new DisposableStore(); - const resourceOrFolder = node.element; - const theme = this.themeService.getColorTheme(); - const iconResource = ResourceTree.isResourceNode(resourceOrFolder) ? resourceOrFolder.element : resourceOrFolder; - const icon = iconResource && (theme.type === LIGHT ? iconResource.decorations.icon : iconResource.decorations.iconDark); - - const uri = ResourceTree.isResourceNode(resourceOrFolder) ? resourceOrFolder.uri : resourceOrFolder.sourceUri; - const fileKind = ResourceTree.isResourceNode(resourceOrFolder) ? FileKind.FOLDER : FileKind.FILE; - const viewModel = this.viewModelProvider(); - - const [matches, descriptionMatches] = splitMatches(uri, node.filterData); - template.fileLabel.setFile(uri, { - fileDecorations: { colors: false, badges: !icon }, - hidePath: viewModel.mode === ViewModelMode.Tree, - fileKind, - matches, - descriptionMatches - }); - - template.actionBar.clear(); - template.actionBar.context = resourceOrFolder; - - if (ResourceTree.isResourceNode(resourceOrFolder)) { - if (resourceOrFolder.element) { - elementDisposables.add(connectPrimaryMenuToInlineActionBar(this.menus.getResourceMenu(resourceOrFolder.element.resourceGroup), template.actionBar)); - toggleClass(template.name, 'strike-through', resourceOrFolder.element.decorations.strikeThrough); - toggleClass(template.element, 'faded', resourceOrFolder.element.decorations.faded); - } else { - elementDisposables.add(connectPrimaryMenuToInlineActionBar(this.menus.getResourceFolderMenu(resourceOrFolder.context), template.actionBar)); - removeClass(template.name, 'strike-through'); - removeClass(template.element, 'faded'); - } - } else { - elementDisposables.add(connectPrimaryMenuToInlineActionBar(this.menus.getResourceMenu(resourceOrFolder.resourceGroup), template.actionBar)); - toggleClass(template.name, 'strike-through', resourceOrFolder.decorations.strikeThrough); - toggleClass(template.element, 'faded', resourceOrFolder.decorations.faded); - } - - const tooltip = !ResourceTree.isResourceNode(resourceOrFolder) && resourceOrFolder.decorations.tooltip || ''; - - if (icon) { - template.decorationIcon.style.display = ''; - template.decorationIcon.style.backgroundImage = `url('${icon}')`; - template.decorationIcon.title = tooltip; - } else { - template.decorationIcon.style.display = 'none'; - template.decorationIcon.style.backgroundImage = ''; - template.decorationIcon.title = ''; - } - - template.element.setAttribute('data-tooltip', tooltip); - template.elementDisposables = elementDisposables; - } - - disposeElement(resource: ITreeNode | ITreeNode, FuzzyScore>, index: number, template: ResourceTemplate): void { - template.elementDisposables.dispose(); - } - - renderCompressedElements(node: ITreeNode | ICompressedTreeNode>, FuzzyScore>, index: number, template: ResourceTemplate, height: number | undefined): void { - template.elementDisposables.dispose(); - - const elementDisposables = new DisposableStore(); - const compressed = node.element as ICompressedTreeNode>; - const folder = compressed.elements[compressed.elements.length - 1]; - - const label = compressed.elements.map(e => e.name).join('/'); - const fileKind = FileKind.FOLDER; - - const [matches, descriptionMatches] = splitMatches(folder.uri, node.filterData); - template.fileLabel.setResource({ resource: folder.uri, name: label }, { - fileDecorations: { colors: false, badges: true }, - fileKind, - matches, - descriptionMatches - }); - - template.actionBar.clear(); - template.actionBar.context = folder; - - elementDisposables.add(connectPrimaryMenuToInlineActionBar(this.menus.getResourceFolderMenu(folder.context), template.actionBar)); - - removeClass(template.name, 'strike-through'); - removeClass(template.element, 'faded'); - template.decorationIcon.style.display = 'none'; - template.decorationIcon.style.backgroundImage = ''; - - template.element.setAttribute('data-tooltip', ''); - template.elementDisposables = elementDisposables; - } - - disposeCompressedElements(node: ITreeNode | ICompressedTreeNode>, FuzzyScore>, index: number, template: ResourceTemplate, height: number | undefined): void { - template.elementDisposables.dispose(); - } - - disposeTemplate(template: ResourceTemplate): void { - template.elementDisposables.dispose(); - template.disposables.dispose(); - } -} - -class ProviderListDelegate implements IListVirtualDelegate { - - getHeight() { return 22; } - - getTemplateId(element: TreeElement) { - if (ResourceTree.isResourceNode(element) || isSCMResource(element)) { - return ResourceRenderer.TEMPLATE_ID; - } else { - return ResourceGroupRenderer.TEMPLATE_ID; - } - } -} - -class SCMTreeFilter implements ITreeFilter { - - filter(element: TreeElement): boolean { - if (ResourceTree.isResourceNode(element)) { - return true; - } else if (isSCMResourceGroup(element)) { - return element.elements.length > 0 || !element.hideWhenEmpty; - } else { - return true; - } - } -} - -export class SCMTreeSorter implements ITreeSorter { - - @memoize - private get viewModel(): ViewModel { return this.viewModelProvider(); } - - constructor(private viewModelProvider: () => ViewModel) { } - - compare(one: TreeElement, other: TreeElement): number { - if (isSCMResourceGroup(one) && isSCMResourceGroup(other)) { - return 0; - } - - // List - if (this.viewModel.mode === ViewModelMode.List) { - // FileName - if (this.viewModel.sortKey === ViewModelSortKey.Name) { - const oneName = basename((one as ISCMResource).sourceUri); - const otherName = basename((other as ISCMResource).sourceUri); - - return compareFileNames(oneName, otherName); - } - - // Status - if (this.viewModel.sortKey === ViewModelSortKey.Status) { - const oneTooltip = (one as ISCMResource).decorations.tooltip ?? ''; - const otherTooltip = (other as ISCMResource).decorations.tooltip ?? ''; - - if (oneTooltip !== otherTooltip) { - return compare(oneTooltip, otherTooltip); - } - } - - // Path (default) - const onePath = (one as ISCMResource).sourceUri.fsPath; - const otherPath = (other as ISCMResource).sourceUri.fsPath; - - return comparePaths(onePath, otherPath); - } - - // Tree - const oneIsDirectory = ResourceTree.isResourceNode(one); - const otherIsDirectory = ResourceTree.isResourceNode(other); - - if (oneIsDirectory !== otherIsDirectory) { - return oneIsDirectory ? -1 : 1; - } - - const oneName = ResourceTree.isResourceNode(one) ? one.name : basename((one as ISCMResource).sourceUri); - const otherName = ResourceTree.isResourceNode(other) ? other.name : basename((other as ISCMResource).sourceUri); - - return compareFileNames(oneName, otherName); - } -} - -export class SCMTreeKeyboardNavigationLabelProvider implements ICompressibleKeyboardNavigationLabelProvider { - - constructor(@ILabelService private readonly labelService: ILabelService) { } - - getKeyboardNavigationLabel(element: TreeElement): { toString(): string; } | undefined { - if (ResourceTree.isResourceNode(element)) { - return element.name; - } else if (isSCMResourceGroup(element)) { - return element.label; - } else { - // Since a match in the file name takes precedence over a match - // in the folder name we are returning the label as file/folder. - const fileName = basename(element.sourceUri); - const filePath = this.labelService.getUriLabel(dirname(element.sourceUri), { relative: true }); - - return filePath.length !== 0 ? `${fileName} ${filePath}` : fileName; - } - } - - getCompressedNodeKeyboardNavigationLabel(elements: TreeElement[]): { toString(): string | undefined; } | undefined { - const folders = elements as IResourceNode[]; - return folders.map(e => e.name).join('/'); - } -} - -class SCMResourceIdentityProvider implements IIdentityProvider { - - getId(element: TreeElement): string { - if (ResourceTree.isResourceNode(element)) { - const group = element.context; - return `${group.provider.contextValue}/${group.id}/$FOLDER/${element.uri.toString()}`; - } else if (isSCMResource(element)) { - const group = element.resourceGroup; - const provider = group.provider; - return `${provider.contextValue}/${group.id}/${element.sourceUri.toString()}`; - } else { - const provider = element.provider; - return `${provider.contextValue}/${element.id}`; - } - } -} - -export class SCMAccessibilityProvider implements IListAccessibilityProvider { - - constructor(@ILabelService private readonly labelService: ILabelService) { } - - getWidgetAriaLabel(): string { - return localize('scm', "Source Control Management"); - } - - getAriaLabel(element: TreeElement): string { - if (ResourceTree.isResourceNode(element)) { - return this.labelService.getUriLabel(element.uri, { relative: true, noPrefix: true }) || element.name; - } else if (isSCMResourceGroup(element)) { - return element.label; - } else { - const result: string[] = []; - - result.push(basename(element.sourceUri)); - - if (element.decorations.tooltip) { - result.push(element.decorations.tooltip); - } - - const path = this.labelService.getUriLabel(dirname(element.sourceUri), { relative: true, noPrefix: true }); - - if (path) { - result.push(path); - } - - return result.join(', '); - } - } -} - -interface IGroupItem { - readonly group: ISCMResourceGroup; - readonly resources: ISCMResource[]; - readonly tree: ResourceTree; - readonly disposable: IDisposable; -} - -function groupItemAsTreeElement(item: IGroupItem, mode: ViewModelMode): ICompressedTreeElement { - const children = mode === ViewModelMode.List - ? Iterable.map(item.resources, element => ({ element, incompressible: true })) - : Iterable.map(item.tree.root.children, node => asTreeElement(node, true)); - - return { element: item.group, children, incompressible: true, collapsible: true }; -} - -function asTreeElement(node: IResourceNode, forceIncompressible: boolean): ICompressedTreeElement { - return { - element: (node.childrenCount === 0 && node.element) ? node.element : node, - children: Iterable.map(node.children, node => asTreeElement(node, false)), - incompressible: !!node.element || forceIncompressible - }; -} - -const enum ViewModelMode { - List = 'list', - Tree = 'tree' -} - -const enum ViewModelSortKey { - Path, - Name, - Status -} - -class ViewModel { - - private readonly _onDidChangeMode = new Emitter(); - readonly onDidChangeMode = this._onDidChangeMode.event; - - get mode(): ViewModelMode { return this._mode; } - set mode(mode: ViewModelMode) { - this._mode = mode; - - for (const item of this.items) { - item.tree.clear(); - - if (mode === ViewModelMode.Tree) { - for (const resource of item.resources) { - item.tree.add(resource.sourceUri, resource); - } - } - } - - this.refresh(); - this._onDidChangeMode.fire(mode); - } - - get sortKey(): ViewModelSortKey { return this._sortKey; } - set sortKey(sortKey: ViewModelSortKey) { - if (sortKey !== this._sortKey) { - this._sortKey = sortKey; - this.refresh(); - } - } - - private items: IGroupItem[] = []; - private visibilityDisposables = new DisposableStore(); - private scrollTop: number | undefined; - private firstVisible = true; - private disposables = new DisposableStore(); - - constructor( - private groups: ISequence, - private tree: WorkbenchCompressibleObjectTree, - private _mode: ViewModelMode, - private _sortKey: ViewModelSortKey, - @IEditorService protected editorService: IEditorService, - @IConfigurationService protected configurationService: IConfigurationService, - ) { } - - private onDidSpliceGroups({ start, deleteCount, toInsert }: ISplice): void { - const itemsToInsert: IGroupItem[] = []; - - for (const group of toInsert) { - const tree = new ResourceTree(group, group.provider.rootUri || URI.file('/')); - const resources: ISCMResource[] = [...group.elements]; - const disposable = combinedDisposable( - group.onDidChange(() => this.tree.refilter()), - group.onDidSplice(splice => this.onDidSpliceGroup(item, splice)) - ); - - const item: IGroupItem = { group, resources, tree, disposable }; - - if (this._mode === ViewModelMode.Tree) { - for (const resource of resources) { - item.tree.add(resource.sourceUri, resource); - } - } - - itemsToInsert.push(item); - } - - const itemsToDispose = this.items.splice(start, deleteCount, ...itemsToInsert); - - for (const item of itemsToDispose) { - item.disposable.dispose(); - } - - this.refresh(); - } - - private onDidSpliceGroup(item: IGroupItem, { start, deleteCount, toInsert }: ISplice): void { - const deleted = item.resources.splice(start, deleteCount, ...toInsert); - - if (this._mode === ViewModelMode.Tree) { - for (const resource of deleted) { - item.tree.delete(resource.sourceUri); - } - - for (const resource of toInsert) { - item.tree.add(resource.sourceUri, resource); - } - } - - this.refresh(item); - } - - setVisible(visible: boolean): void { - if (visible) { - this.visibilityDisposables = new DisposableStore(); - this.groups.onDidSplice(this.onDidSpliceGroups, this, this.visibilityDisposables); - this.onDidSpliceGroups({ start: 0, deleteCount: this.items.length, toInsert: this.groups.elements }); - - if (typeof this.scrollTop === 'number') { - this.tree.scrollTop = this.scrollTop; - this.scrollTop = undefined; - } - - this.editorService.onDidActiveEditorChange(this.onDidActiveEditorChange, this, this.visibilityDisposables); - this.onDidActiveEditorChange(); - } else { - this.visibilityDisposables.dispose(); - this.onDidSpliceGroups({ start: 0, deleteCount: this.items.length, toInsert: [] }); - this.scrollTop = this.tree.scrollTop; - } - } - - private refresh(item?: IGroupItem): void { - if (item) { - this.tree.setChildren(item.group, groupItemAsTreeElement(item, this.mode).children); - } else { - this.tree.setChildren(null, this.items.map(item => groupItemAsTreeElement(item, this.mode))); - } - } - - private onDidActiveEditorChange(): void { - if (!this.configurationService.getValue('scm.autoReveal')) { - return; - } - - if (this.firstVisible) { - this.firstVisible = false; - this.visibilityDisposables.add(disposableTimeout(() => this.onDidActiveEditorChange(), 250)); - return; - } - - const editor = this.editorService.activeEditor; - - if (!editor) { - return; - } - - const uri = toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }); - - if (!uri) { - return; - } - - // go backwards from last group - for (let i = this.items.length - 1; i >= 0; i--) { - const item = this.items[i]; - const resource = this.mode === ViewModelMode.Tree - ? item.tree.getNode(uri)?.element - : find(item.resources, r => isEqual(r.sourceUri, uri)); - - if (resource) { - this.tree.reveal(resource); - this.tree.setSelection([resource]); - this.tree.setFocus([resource]); - return; - } - } - } - - dispose(): void { - this.visibilityDisposables.dispose(); - this.disposables.dispose(); - - for (const item of this.items) { - item.disposable.dispose(); - } - - this.items = []; - } -} - -class SCMViewSubMenuAction extends ContextSubMenu { - constructor(viewModel: ViewModel) { - super(localize('sortAction', "View & Sort"), - [ - ...new RadioGroup([ - new SCMViewModeListAction(viewModel), - new SCMViewModeTreeAction(viewModel) - ]).actions, - new Separator(), - ...new RadioGroup([ - new SCMSortByNameAction(viewModel), - new SCMSortByPathAction(viewModel), - new SCMSortByStatusAction(viewModel) - ]).actions - ] - ); - } -} - -abstract class SCMViewModeAction extends Action { - constructor(id: string, label: string, private viewModel: ViewModel, private viewMode: ViewModelMode) { - super(id, label); - - this.checked = this.viewModel.mode === this.viewMode; - } - - async run(): Promise { - if (this.viewMode !== this.viewModel.mode) { - this.checked = !this.checked; - this.viewModel.mode = this.viewMode; - } - } -} - -class SCMViewModeListAction extends SCMViewModeAction { - static readonly ID = 'workbench.scm.action.viewModeList'; - static readonly LABEL = localize('viewModeList', "View as List"); - - constructor(viewModel: ViewModel) { - super(SCMViewModeListAction.ID, SCMViewModeListAction.LABEL, viewModel, ViewModelMode.List); - } -} - -class SCMViewModeTreeAction extends SCMViewModeAction { - static readonly ID = 'workbench.scm.action.viewModeTree'; - static readonly LABEL = localize('viewModeTree', "View as Tree"); - - constructor(viewModel: ViewModel) { - super(SCMViewModeTreeAction.ID, SCMViewModeTreeAction.LABEL, viewModel, ViewModelMode.Tree); - } -} - -abstract class SCMSortAction extends Action { - - private readonly _listener: IDisposable; - - constructor(id: string, label: string, private viewModel: ViewModel, private sortKey: ViewModelSortKey) { - super(id, label); - - this.checked = this.sortKey === ViewModelSortKey.Path; - this.enabled = this.viewModel?.mode === ViewModelMode.List ?? false; - this._listener = viewModel?.onDidChangeMode(e => this.enabled = e === ViewModelMode.List); - } - - async run(): Promise { - if (this.sortKey !== this.viewModel.sortKey) { - this.checked = !this.checked; - this.viewModel.sortKey = this.sortKey; - } - } - - dispose(): void { - this._listener.dispose(); - super.dispose(); - } -} - -class SCMSortByNameAction extends SCMSortAction { - static readonly ID = 'workbench.scm.action.sortByName'; - static readonly LABEL = localize('sortByName', "Sort by Name"); - - constructor(viewModel: ViewModel) { - super(SCMSortByNameAction.ID, SCMSortByNameAction.LABEL, viewModel, ViewModelSortKey.Name); - } -} - -class SCMSortByPathAction extends SCMSortAction { - static readonly ID = 'workbench.scm.action.sortByPath'; - static readonly LABEL = localize('sortByPath', "Sort by Path"); - - constructor(viewModel: ViewModel) { - super(SCMSortByPathAction.ID, SCMSortByPathAction.LABEL, viewModel, ViewModelSortKey.Path); - } -} - -class SCMSortByStatusAction extends SCMSortAction { - static readonly ID = 'workbench.scm.action.sortByStatus'; - static readonly LABEL = localize('sortByStatus', "Sort by Status"); - - constructor(viewModel: ViewModel) { - super(SCMSortByStatusAction.ID, SCMSortByStatusAction.LABEL, viewModel, ViewModelSortKey.Status); - } -} - -export class RepositoryPane extends ViewPane { - private readonly defaultInputFontFamily = DEFAULT_FONT_FAMILY; - - private cachedHeight: number | undefined = undefined; - private cachedWidth: number | undefined = undefined; - private inputContainer!: HTMLElement; - private validationContainer!: HTMLElement; - private inputEditor!: CodeEditorWidget; - private inputModel!: ITextModel; - private listContainer!: HTMLElement; - private tree!: WorkbenchCompressibleObjectTree; - private viewModel!: ViewModel; - private listLabels!: ResourceLabels; - private menus: SCMMenus; - protected contextKeyService: IContextKeyService; - private commitTemplate = ''; - - constructor( - readonly repository: ISCMRepository, - options: IViewPaneOptions, - @IKeybindingService protected keybindingService: IKeybindingService, - @IThemeService protected themeService: IThemeService, - @IContextMenuService protected contextMenuService: IContextMenuService, - @IContextViewService protected contextViewService: IContextViewService, - @ICommandService protected commandService: ICommandService, - @INotificationService private readonly notificationService: INotificationService, - @IEditorService protected editorService: IEditorService, - @IInstantiationService protected instantiationService: IInstantiationService, - @IViewDescriptorService viewDescriptorService: IViewDescriptorService, - @IConfigurationService protected configurationService: IConfigurationService, - @IContextKeyService contextKeyService: IContextKeyService, - @IMenuService protected menuService: IMenuService, - @IStorageService private storageService: IStorageService, - @IModelService private modelService: IModelService, - @IModeService private modeService: IModeService, - @IOpenerService openerService: IOpenerService, - @ITelemetryService telemetryService: ITelemetryService, - ) { - super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); - - this.menus = instantiationService.createInstance(SCMMenus, this.repository.provider); - this._register(this.menus); - this._register(this.menus.onDidChangeTitle(this._onDidChangeTitleArea.fire, this._onDidChangeTitleArea)); - - this.contextKeyService = contextKeyService.createScoped(this.element); - this.contextKeyService.createKey('scmRepository', this.repository); - } - - render(): void { - super.render(); - this._register(this.menus.onDidChangeTitle(this.updateActions, this)); - } - - protected renderHeaderTitle(container: HTMLElement): void { - let title: string; - let type: string; - - if (this.repository.provider.rootUri) { - title = basename(this.repository.provider.rootUri); - type = this.repository.provider.label; - } else { - title = this.repository.provider.label; - type = ''; - } - - super.renderHeaderTitle(container, title); - addClass(container, 'scm-provider'); - append(container, $('span.type', undefined, type)); - } - - protected renderBody(container: HTMLElement): void { - super.renderBody(container); - - const focusTracker = trackFocus(container); - this._register(focusTracker.onDidFocus(() => this.repository.focus())); - this._register(focusTracker); - - // Input - this.inputContainer = append(container, $('.scm-editor')); - const editorContainer = append(this.inputContainer, $('.scm-editor-container')); - - const placeholderTextContainer = append(editorContainer, $('.scm-editor-placeholder')); - const updatePlaceholder = () => { - const binding = this.keybindingService.lookupKeybinding('scm.acceptInput'); - const label = binding ? binding.getLabel() : (platform.isMacintosh ? 'Cmd+Enter' : 'Ctrl+Enter'); - const placeholderText = format(this.repository.input.placeholder, label); - - this.inputEditor.updateOptions({ ariaLabel: placeholderText }); - placeholderTextContainer.textContent = placeholderText; - }; - - this.validationContainer = append(editorContainer, $('.scm-editor-validation')); - - const validationDelayer = new ThrottledDelayer(200); - const validate = () => { - const position = this.inputEditor.getSelection()?.getStartPosition(); - const offset = position && this.inputModel.getOffsetAt(position); - const value = this.inputModel.getValue(); - - return this.repository.input.validateInput(value, offset || 0).then(result => { - if (!result) { - removeClass(editorContainer, 'validation-info'); - removeClass(editorContainer, 'validation-warning'); - removeClass(editorContainer, 'validation-error'); - removeClass(this.validationContainer, 'validation-info'); - removeClass(this.validationContainer, 'validation-warning'); - removeClass(this.validationContainer, 'validation-error'); - this.validationContainer.textContent = null; - } else { - toggleClass(editorContainer, 'validation-info', result.type === InputValidationType.Information); - toggleClass(editorContainer, 'validation-warning', result.type === InputValidationType.Warning); - toggleClass(editorContainer, 'validation-error', result.type === InputValidationType.Error); - toggleClass(this.validationContainer, 'validation-info', result.type === InputValidationType.Information); - toggleClass(this.validationContainer, 'validation-warning', result.type === InputValidationType.Warning); - toggleClass(this.validationContainer, 'validation-error', result.type === InputValidationType.Error); - this.validationContainer.textContent = result.message; - } - }); - }; - - const triggerValidation = () => validationDelayer.trigger(validate); - - const editorOptions: IEditorConstructionOptions = { - ...getSimpleEditorOptions(), - lineDecorationsWidth: 4, - dragAndDrop: false, - cursorWidth: 1, - fontSize: 13, - lineHeight: 20, - fontFamily: this.getInputEditorFontFamily(), - wrappingStrategy: 'advanced', - wrappingIndent: 'none', - padding: { top: 3, bottom: 3 }, - quickSuggestions: false - }; - const codeEditorWidgetOptions: ICodeEditorWidgetOptions = { - isSimpleWidget: true, - contributions: EditorExtensionsRegistry.getSomeEditorContributions([ - SuggestController.ID, - SnippetController2.ID, - MenuPreventer.ID, - SelectionClipboardContributionID, - ContextMenuController.ID, - ColorDetector.ID, - ModesHoverController.ID, - LinkDetector.ID - ]) - }; - - const services = new ServiceCollection([IContextKeyService, this.contextKeyService]); - const instantiationService = this.instantiationService.createChild(services); - this.inputEditor = instantiationService.createInstance(CodeEditorWidget, editorContainer, editorOptions, codeEditorWidgetOptions); - - this._register(this.inputEditor); - - this._register(this.inputEditor.onDidFocusEditorText(() => addClass(editorContainer, 'synthetic-focus'))); - this._register(this.inputEditor.onDidBlurEditorText(() => removeClass(editorContainer, 'synthetic-focus'))); - - const onInputFontFamilyChanged = Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.inputFontFamily')); - this._register(onInputFontFamilyChanged(() => this.inputEditor.updateOptions({ fontFamily: this.getInputEditorFontFamily() }))); - - let query: string | undefined; - - if (this.repository.provider.rootUri) { - query = `rootUri=${encodeURIComponent(this.repository.provider.rootUri.toString())}`; - } - - const uri = URI.from({ - scheme: Schemas.vscode, - path: `scm/${this.repository.provider.contextValue}/${this.repository.provider.id}/input`, - query - }); - - this.configurationService.updateValue('editor.wordBasedSuggestions', false, { resource: uri }, ConfigurationTarget.MEMORY); - - const mode = this.modeService.create('scminput'); - this.inputModel = this.modelService.getModel(uri) || this.modelService.createModel('', mode, uri); - this.inputEditor.setModel(this.inputModel); - - this._register(this.inputEditor.onDidChangeCursorPosition(triggerValidation)); - - const opts = this.modelService.getCreationOptions(this.inputModel.getLanguageIdentifier().language, this.inputModel.uri, this.inputModel.isForSimpleWidget); - const onEnter = Event.filter(this.inputEditor.onKeyDown, e => e.keyCode === KeyCode.Enter); - this._register(onEnter(() => this.inputModel.detectIndentation(opts.insertSpaces, opts.tabSize))); - - // Keep model in sync with API - this.inputModel.setValue(this.repository.input.value); - this._register(this.repository.input.onDidChange(value => { - if (value === this.inputModel.getValue()) { - return; - } - this.inputModel.setValue(value); - this.inputEditor.setPosition(this.inputModel.getFullModelRange().getEndPosition()); - })); - - // Keep API in sync with model and update placeholder and validation - toggleClass(placeholderTextContainer, 'hidden', this.inputModel.getValueLength() > 0); - this.inputModel.onDidChangeContent(() => { - this.repository.input.value = this.inputModel.getValue(); - toggleClass(placeholderTextContainer, 'hidden', this.inputModel.getValueLength() > 0); - triggerValidation(); - }); - - updatePlaceholder(); - this._register(this.repository.input.onDidChangePlaceholder(updatePlaceholder, null)); - this._register(this.keybindingService.onDidUpdateKeybindings(updatePlaceholder, null)); - - const onDidChangeContentHeight = Event.filter(this.inputEditor.onDidContentSizeChange, e => e.contentHeightChanged); - this._register(onDidChangeContentHeight(() => this.layoutBody())); - - this._register(this.repository.provider.onDidChangeCommitTemplate(this.onDidChangeCommitTemplate, this)); - - this.onDidChangeCommitTemplate(); - - // Input box visibility - this._register(this.repository.input.onDidChangeVisibility(this.updateInputBoxVisibility, this)); - this.updateInputBoxVisibility(); - - // List - this.listContainer = append(container, $('.scm-status.show-file-icons')); - - const updateActionsVisibility = () => toggleClass(this.listContainer, 'show-actions', this.configurationService.getValue('scm.alwaysShowActions')); - Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.alwaysShowActions'))(updateActionsVisibility); - updateActionsVisibility(); - - const delegate = new ProviderListDelegate(); - - const actionViewItemProvider = (action: IAction) => this.getActionViewItem(action); - - this.listLabels = this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this.onDidChangeBodyVisibility }); - this._register(this.listLabels); - - const actionRunner = new RepositoryPaneActionRunner(() => this.getSelectedResources()); - this._register(actionRunner); - this._register(actionRunner.onDidBeforeRun(() => this.tree.domFocus())); - - const renderers = [ - new ResourceGroupRenderer(actionViewItemProvider, this.themeService, this.menus), - new ResourceRenderer(() => this.viewModel, this.listLabels, actionViewItemProvider, actionRunner, this.themeService, this.menus) - ]; - - const filter = new SCMTreeFilter(); - const sorter = new SCMTreeSorter(() => this.viewModel); - const keyboardNavigationLabelProvider = this.instantiationService.createInstance(SCMTreeKeyboardNavigationLabelProvider); - const identityProvider = new SCMResourceIdentityProvider(); - - this.tree = this.instantiationService.createInstance( - WorkbenchCompressibleObjectTree, - 'SCM Tree Repo', - this.listContainer, - delegate, - renderers, - { - identityProvider, - horizontalScrolling: false, - filter, - sorter, - keyboardNavigationLabelProvider, - overrideStyles: { - listBackground: SIDE_BAR_BACKGROUND - }, - accessibilityProvider: this.instantiationService.createInstance(SCMAccessibilityProvider) - }) as WorkbenchCompressibleObjectTree; - - const navigator = this._register(new TreeResourceNavigator(this.tree, { openOnSelection: false })); - this._register(navigator.onDidOpenResource(this.open, this)); - - this._register(Event.chain(this.tree.onDidPin) - .map(e => e.elements[0]) - .filter(e => !!e && !isSCMResourceGroup(e) && !ResourceTree.isResourceNode(e)) - .on(this.pin, this)); - - this._register(this.tree.onContextMenu(this.onListContextMenu, this)); - this._register(this.tree); - - let viewMode = this.configurationService.getValue<'tree' | 'list'>('scm.defaultViewMode') === 'list' ? ViewModelMode.List : ViewModelMode.Tree; - - const rootUri = this.repository.provider.rootUri; - - if (typeof rootUri !== 'undefined') { - const storageMode = this.storageService.get(`scm.repository.viewMode:${rootUri.toString()}`, StorageScope.WORKSPACE) as ViewModelMode; - - if (typeof storageMode === 'string') { - viewMode = storageMode; - } - } - - this.viewModel = this.instantiationService.createInstance(ViewModel, this.repository.provider.groups, this.tree, viewMode, ViewModelSortKey.Path); - this._register(this.viewModel); - - addClass(this.listContainer, 'file-icon-themable-tree'); - addClass(this.listContainer, 'show-file-icons'); - - this.updateIndentStyles(this.themeService.getFileIconTheme()); - this._register(this.themeService.onDidFileIconThemeChange(this.updateIndentStyles, this)); - this._register(this.viewModel.onDidChangeMode(this.onDidChangeMode, this)); - - this._register(this.onDidChangeBodyVisibility(this._onDidChangeVisibility, this)); - - this.updateActions(); - } - - private updateIndentStyles(theme: IFileIconTheme): void { - toggleClass(this.listContainer, 'list-view-mode', this.viewModel.mode === ViewModelMode.List); - toggleClass(this.listContainer, 'tree-view-mode', this.viewModel.mode === ViewModelMode.Tree); - toggleClass(this.listContainer, 'align-icons-and-twisties', (this.viewModel.mode === ViewModelMode.List && theme.hasFileIcons) || (theme.hasFileIcons && !theme.hasFolderIcons)); - toggleClass(this.listContainer, 'hide-arrows', this.viewModel.mode === ViewModelMode.Tree && theme.hidesExplorerArrows === true); - } - - private onDidChangeMode(): void { - this.updateIndentStyles(this.themeService.getFileIconTheme()); - - const rootUri = this.repository.provider.rootUri; - - if (typeof rootUri === 'undefined') { - return; - } - - this.storageService.store(`scm.repository.viewMode:${rootUri.toString()}`, this.viewModel.mode, StorageScope.WORKSPACE); - } - - layoutBody(height: number | undefined = this.cachedHeight, width: number | undefined = this.cachedWidth): void { - if (height === undefined) { - return; - } - - if (width !== undefined) { - super.layoutBody(height, width); - } - - this.cachedHeight = height; - this.cachedWidth = width; - - if (this.repository.input.visible) { - removeClass(this.inputContainer, 'hidden'); - - const editorContentHeight = this.inputEditor.getContentHeight(); - const editorHeight = Math.min(editorContentHeight, 134); - this.inputEditor.layout({ height: editorHeight, width: width! - 12 - 16 - 2 }); - - this.validationContainer.style.top = `${editorHeight + 1}px`; - - const listHeight = height - (editorHeight + 5 + 2 + 5); - this.listContainer.style.height = `${listHeight}px`; - this.tree.layout(listHeight, width); - } else { - addClass(this.inputContainer, 'hidden'); - - this.inputEditor.onHide(); - this.listContainer.style.height = `${height}px`; - this.tree.layout(height, width); - } - } - - focus(): void { - super.focus(); - - if (this.isExpanded()) { - if (this.repository.input.visible) { - this.inputEditor.focus(); - } else { - this.tree.domFocus(); - } - - this.repository.focus(); - } - } - - private _onDidChangeVisibility(visible: boolean): void { - this.viewModel.setVisible(visible); - - if (this.repository.input.visible && visible) { - this.inputEditor.onVisible(); - } else { - this.inputEditor.onHide(); - } - } - - getActions(): IAction[] { - return this.menus.getTitleActions(); - } - - getSecondaryActions(): IAction[] { - if (!this.viewModel) { - return []; - } - - const result: IAction[] = [new SCMViewSubMenuAction(this.viewModel)]; - const secondaryActions = this.menus.getTitleSecondaryActions(); - - if (secondaryActions.length > 0) { - result.push(new Separator(), ...secondaryActions); - } - - return result; - } - - getActionViewItem(action: IAction): IActionViewItem | undefined { - if (!(action instanceof MenuItemAction)) { - return undefined; - } - - return new ContextAwareMenuEntryActionViewItem(action, this.keybindingService, this.notificationService, this.contextMenuService); - } - - getActionsContext(): any { - return this.repository.provider; - } - - private open(e: IOpenEvent): void { - if (!e.element || isSCMResourceGroup(e.element) || ResourceTree.isResourceNode(e.element)) { - return; - } - - e.element.open(!!e.editorOptions.preserveFocus); - } - - private pin(): void { - const activeEditorPane = this.editorService.activeEditorPane; - - if (activeEditorPane) { - activeEditorPane.group.pinEditor(activeEditorPane.input); - } - } - - private onListContextMenu(e: ITreeContextMenuEvent): void { - if (!e.element) { - return; - } - - const element = e.element; - let actions: IAction[] = []; - - if (isSCMResourceGroup(element)) { - actions = this.menus.getResourceGroupContextActions(element); - } else if (ResourceTree.isResourceNode(element)) { - if (element.element) { - actions = this.menus.getResourceContextActions(element.element); - } else { - actions = this.menus.getResourceFolderContextActions(element.context); - } - } else { - actions = this.menus.getResourceContextActions(element); - } - - const actionRunner = new RepositoryPaneActionRunner(() => this.getSelectedResources()); - actionRunner.onDidBeforeRun(() => this.tree.domFocus()); - - this.contextMenuService.showContextMenu({ - getAnchor: () => e.anchor, - getActions: () => actions, - getActionsContext: () => element, - actionRunner - }); - } - - private getSelectedResources(): (ISCMResource | IResourceNode)[] { - return this.tree.getSelection() - .filter(r => !!r && !isSCMResourceGroup(r))! as any; - } - - private onDidChangeCommitTemplate(): void { - if (typeof this.repository.provider.commitTemplate === 'undefined' || !this.repository.input.visible) { - return; - } - - const oldCommitTemplate = this.commitTemplate; - this.commitTemplate = this.repository.provider.commitTemplate; - - const value = this.inputModel.getValue(); - - if (value && value !== oldCommitTemplate) { - return; - } - - this.inputModel.setValue(this.commitTemplate); - } - - private updateInputBoxVisibility(): void { - if (this.cachedHeight) { - this.layoutBody(this.cachedHeight); - } - } - - private getInputEditorFontFamily(): string { - const inputFontFamily = this.configurationService.getValue('scm.inputFontFamily').trim(); - - if (inputFontFamily.toLowerCase() === 'editor') { - return this.configurationService.getValue('editor.fontFamily').trim(); - } - - if (inputFontFamily.length !== 0 && inputFontFamily.toLowerCase() !== 'default') { - return inputFontFamily; - } - - return this.defaultInputFontFamily; - } -} - -export class RepositoryViewDescriptor implements IViewDescriptor { - - private static counter = 0; - - readonly id: string; - readonly name: string; - readonly ctorDescriptor: SyncDescriptor; - readonly canToggleVisibility = true; - readonly order = -500; - readonly workspace = true; - - constructor(readonly repository: ISCMRepository, readonly hideByDefault: boolean) { - const repoId = repository.provider.rootUri ? repository.provider.rootUri.toString() : `#${RepositoryViewDescriptor.counter++}`; - const hasher = new Hasher(); - hasher.hash(repository.provider.label); - hasher.hash(repoId); - this.id = `scm:repository:${hasher.value}`; - this.name = repository.provider.rootUri ? basename(repository.provider.rootUri) : repository.provider.label; - - this.ctorDescriptor = new SyncDescriptor(RepositoryPane, [repository]); - } -} - -registerThemingParticipant((theme, collector) => { - const inputBackgroundColor = theme.getColor(inputBackground); - if (inputBackgroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-container .monaco-editor-background, - .scm-viewlet .scm-editor-container .monaco-editor, - .scm-viewlet .scm-editor-container .monaco-editor .margin - { background-color: ${inputBackgroundColor}; }`); - } - - const inputForegroundColor = theme.getColor(inputForeground); - if (inputForegroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-container .mtk1 { color: ${inputForegroundColor}; }`); - } - - const inputBorderColor = theme.getColor(inputBorder); - if (inputBorderColor) { - collector.addRule(`.scm-viewlet .scm-editor-container { outline: 1px solid ${inputBorderColor}; }`); - } - - const focusBorderColor = theme.getColor(focusBorder); - if (focusBorderColor) { - collector.addRule(`.scm-viewlet .scm-editor-container.synthetic-focus { outline: 1px solid ${focusBorderColor}; }`); - } - - const inputPlaceholderForegroundColor = theme.getColor(inputPlaceholderForeground); - if (inputPlaceholderForegroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-placeholder { color: ${inputPlaceholderForegroundColor}; }`); - } - - const inputValidationInfoBorderColor = theme.getColor(inputValidationInfoBorder); - if (inputValidationInfoBorderColor) { - collector.addRule(`.scm-viewlet .scm-editor-container.validation-info { outline: 1px solid ${inputValidationInfoBorderColor}; }`); - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-info { border: 1px solid ${inputValidationInfoBorderColor}; }`); - } - - const inputValidationInfoBackgroundColor = theme.getColor(inputValidationInfoBackground); - if (inputValidationInfoBackgroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-info { background-color: ${inputValidationInfoBackgroundColor}; }`); - } - - const inputValidationInfoForegroundColor = theme.getColor(inputValidationInfoForeground); - if (inputValidationInfoForegroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-info { color: ${inputValidationInfoForegroundColor}; }`); - } - - const inputValidationWarningBorderColor = theme.getColor(inputValidationWarningBorder); - if (inputValidationWarningBorderColor) { - collector.addRule(`.scm-viewlet .scm-editor-container.validation-warning { outline: 1px solid ${inputValidationWarningBorderColor}; }`); - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-warning { border: 1px solid ${inputValidationWarningBorderColor}; }`); - } - - const inputValidationWarningBackgroundColor = theme.getColor(inputValidationWarningBackground); - if (inputValidationWarningBackgroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-warning { background-color: ${inputValidationWarningBackgroundColor}; }`); - } - - const inputValidationWarningForegroundColor = theme.getColor(inputValidationWarningForeground); - if (inputValidationWarningForegroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-warning { color: ${inputValidationWarningForegroundColor}; }`); - } - - const inputValidationErrorBorderColor = theme.getColor(inputValidationErrorBorder); - if (inputValidationErrorBorderColor) { - collector.addRule(`.scm-viewlet .scm-editor-container.validation-error { outline: 1px solid ${inputValidationErrorBorderColor}; }`); - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-error { border: 1px solid ${inputValidationErrorBorderColor}; }`); - } - - const inputValidationErrorBackgroundColor = theme.getColor(inputValidationErrorBackground); - if (inputValidationErrorBackgroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-error { background-color: ${inputValidationErrorBackgroundColor}; }`); - } - - const inputValidationErrorForegroundColor = theme.getColor(inputValidationErrorForeground); - if (inputValidationErrorForegroundColor) { - collector.addRule(`.scm-viewlet .scm-editor-validation.validation-error { color: ${inputValidationErrorForegroundColor}; }`); - } -}); diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts index 6020e1c282d..9f911a0e8a9 100644 --- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts @@ -8,7 +8,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { DirtyDiffWorkbenchController } from './dirtydiffDecorator'; import { ShowViewletAction } from 'vs/workbench/browser/viewlet'; -import { VIEWLET_ID, ISCMRepository, ISCMService } from 'vs/workbench/contrib/scm/common/scm'; +import { VIEWLET_ID, ISCMRepository, ISCMService, VIEW_PANE_ID } from 'vs/workbench/contrib/scm/common/scm'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; @@ -23,11 +23,12 @@ import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/co import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { SCMService } from 'vs/workbench/contrib/scm/common/scmService'; -import { IViewContainersRegistry, ViewContainerLocation, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; -import { SCMViewPaneContainer } from 'vs/workbench/contrib/scm/browser/scmViewlet'; +import { IViewContainersRegistry, ViewContainerLocation, Extensions as ViewContainerExtensions, IViewsRegistry } from 'vs/workbench/common/views'; +import { SCMViewPaneContainer } from 'vs/workbench/contrib/scm/browser/scmViewPaneContainer'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ModesRegistry } from 'vs/editor/common/modes/modesRegistry'; import { Codicon } from 'vs/base/common/codicons'; +import { SCMViewPane } from 'vs/workbench/contrib/scm/browser/scmViewPane'; class OpenSCMViewletAction extends ShowViewletAction { @@ -48,16 +49,33 @@ ModesRegistry.registerLanguage({ Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(DirtyDiffWorkbenchController, LifecyclePhase.Restored); -Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({ +const viewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({ id: VIEWLET_ID, name: localize('source control', "Source Control"), ctorDescriptor: new SyncDescriptor(SCMViewPaneContainer), storageId: 'workbench.scm.views.state', icon: Codicon.sourceControl.classNames, alwaysUseContainerInfo: true, - order: 2 + order: 2, + hideIfEmpty: true }, ViewContainerLocation.Sidebar); +const viewsRegistry = Registry.as(ViewContainerExtensions.ViewsRegistry); + +viewsRegistry.registerViewWelcomeContent(VIEW_PANE_ID, { + content: localize('no open repo', "No source control providers registered."), + when: 'default' +}); + +viewsRegistry.registerViews([{ + id: VIEW_PANE_ID, + name: localize('source control', "Source Control"), + ctorDescriptor: new SyncDescriptor(SCMViewPane), + canToggleVisibility: true, + workspace: true, + canMoveView: true +}], viewContainer); + Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(SCMStatusController, LifecyclePhase.Restored); @@ -80,16 +98,6 @@ Registry.as(ConfigurationExtensions.Configuration).regis type: 'object', scope: ConfigurationScope.RESOURCE, properties: { - 'scm.alwaysShowProviders': { - type: 'boolean', - description: localize('alwaysShowProviders', "Controls whether to show the Source Control Provider section even when there's only one Provider registered."), - default: false - }, - 'scm.providers.visible': { - type: 'number', - description: localize('providersVisible', "Controls how many providers are visible in the Source Control Provider section. Set to `0` to be able to manually resize the view."), - default: 10 - }, 'scm.diffDecorations': { type: 'string', enum: ['all', 'gutter', 'overview', 'minimap', 'none'], @@ -135,6 +143,17 @@ Registry.as(ConfigurationExtensions.Configuration).regis description: localize('scm.countBadge', "Controls the Source Control count badge."), default: 'all' }, + 'scm.providerCountBadge': { + type: 'string', + enum: ['hidden', 'auto', 'visible'], + enumDescriptions: [ + localize('scm.providerCountBadge.hidden', "Hide Source Control Providers count badges."), + localize('scm.providerCountBadge.auto', "Show Source Control Providers count badges if there are any changes."), + localize('scm.providerCountBadge.visible', "Show Source Control Providers count badges.") + ], + description: localize('scm.providerCountBadge', "Controls the Source Control Providers count badge."), + default: 'hidden' + }, 'scm.defaultViewMode': { type: 'string', enum: ['tree', 'list'], diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts new file mode 100644 index 00000000000..ea79f5becec --- /dev/null +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -0,0 +1,1979 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/scm'; +import { Event, Emitter } from 'vs/base/common/event'; +import { basename, dirname, isEqual } from 'vs/base/common/resources'; +import { IDisposable, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; +import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; +import { append, $, addClass, toggleClass, removeClass, Dimension } from 'vs/base/browser/dom'; +import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; +import { ISCMResourceGroup, ISCMResource, InputValidationType, ISCMService, ISCMRepository, ISCMInput, IInputValidation } from 'vs/workbench/contrib/scm/common/scm'; +import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels'; +import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { MenuItemAction, IMenuService } from 'vs/platform/actions/common/actions'; +import { IAction, IActionViewItem, ActionRunner, Action, RadioGroup } from 'vs/base/common/actions'; +import { ContextAwareMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { SCMMenus } from './menus'; +import { ActionBar, IActionViewItemProvider, Separator, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IThemeService, LIGHT, registerThemingParticipant, IFileIconTheme } from 'vs/platform/theme/common/themeService'; +import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar, isSCMRepository, isSCMInput, connectPrimaryMenu } from './util'; +import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; +import { WorkbenchCompressibleObjectTree, IOpenEvent } from 'vs/platform/list/browser/listService'; +import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; +import { disposableTimeout, ThrottledDelayer } from 'vs/base/common/async'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { ITreeNode, ITreeFilter, ITreeSorter, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; +import { ResourceTree, IResourceNode } from 'vs/base/common/resourceTree'; +import { ISequence, ISplice, SimpleSequence } from 'vs/base/common/sequence'; +import { ICompressibleTreeRenderer, ICompressibleKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/tree/objectTree'; +import { Iterable } from 'vs/base/common/iterator'; +import { ICompressedTreeNode, ICompressedTreeElement } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; +import { URI } from 'vs/base/common/uri'; +import { FileKind } from 'vs/platform/files/common/files'; +import { compareFileNames, comparePaths } from 'vs/base/common/comparers'; +import { FuzzyScore, createMatches, IMatch } from 'vs/base/common/filters'; +import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { localize } from 'vs/nls'; +import { flatten } from 'vs/base/common/arrays'; +import { memoize } from 'vs/base/common/decorators'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { toResource, SideBySideEditor } from 'vs/workbench/common/editor'; +import { SIDE_BAR_BACKGROUND, SIDE_BAR_BORDER, PANEL_BACKGROUND, PANEL_INPUT_BORDER } from 'vs/workbench/common/theme'; +import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; +import { ITextModel } from 'vs/editor/common/model'; +import { IEditorConstructionOptions } from 'vs/editor/common/config/editorOptions'; +import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; +import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; +import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; +import * as platform from 'vs/base/common/platform'; +import { escape, compare, format } from 'vs/base/common/strings'; +import { inputPlaceholderForeground, inputValidationInfoBorder, inputValidationWarningBorder, inputValidationErrorBorder, inputValidationInfoBackground, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningForeground, inputValidationErrorBackground, inputValidationErrorForeground, inputBackground, inputForeground, inputBorder, focusBorder, registerColor, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { Schemas } from 'vs/base/common/network'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { ModesHoverController } from 'vs/editor/contrib/hover/hover'; +import { ColorDetector } from 'vs/editor/contrib/colorPicker/colorDetector'; +import { LinkDetector } from 'vs/editor/contrib/links/links'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { ContextSubMenu } from 'vs/base/browser/contextmenu'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { DEFAULT_FONT_FAMILY } from 'vs/workbench/browser/style'; +import { Command } from 'vs/editor/common/modes'; +import { renderCodicons, Codicon } from 'vs/base/common/codicons'; +import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; +import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; +import { domEvent } from 'vs/base/browser/event'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; + +type TreeElement = ISCMRepository | ISCMInput | ISCMResourceGroup | IResourceNode | ISCMResource; + +function splitMatches(uri: URI, filterData: FuzzyScore | undefined): [IMatch[] | undefined, IMatch[] | undefined] { + let matches: IMatch[] | undefined; + let descriptionMatches: IMatch[] | undefined; + + if (filterData) { + matches = []; + descriptionMatches = []; + + const fileName = basename(uri); + const allMatches = createMatches(filterData); + + for (const match of allMatches) { + if (match.start < fileName.length) { + matches!.push( + { + start: match.start, + end: Math.min(match.end, fileName.length) + } + ); + } else { + descriptionMatches!.push( + { + start: match.start - (fileName.length + 1), + end: match.end - (fileName.length + 1) + } + ); + } + } + } + + return [matches, descriptionMatches]; +} + +class StatusBarAction extends Action { + + constructor( + private command: Command, + private commandService: ICommandService + ) { + super(`statusbaraction{${command.id}}`, command.title, '', true); + this.tooltip = command.tooltip || ''; + } + + run(): Promise { + return this.commandService.executeCommand(this.command.id, ...(this.command.arguments || [])); + } +} + +class StatusBarActionViewItem extends ActionViewItem { + + constructor(action: StatusBarAction) { + super(null, action, {}); + } + + updateLabel(): void { + if (this.options.label && this.label) { + this.label.innerHTML = renderCodicons(escape(this.getAction().label)); + } + } +} + +interface ISCMLayout { + height: number | undefined; + width: number | undefined; + readonly onDidChange: Event; +} + +interface RepositoryTemplate { + readonly name: HTMLElement; + readonly description: HTMLElement; + readonly countContainer: HTMLElement; + readonly count: CountBadge; + readonly toolBar: ToolBar; + disposable: IDisposable; + readonly templateDisposable: IDisposable; +} + +class RepositoryRenderer implements ICompressibleTreeRenderer { + + static readonly TEMPLATE_ID = 'repository'; + get templateId(): string { return RepositoryRenderer.TEMPLATE_ID; } + + constructor( + private actionViewItemProvider: IActionViewItemProvider, + private menus: SCMMenus, + @ICommandService private commandService: ICommandService, + @IContextMenuService private contextMenuService: IContextMenuService, + @IThemeService private themeService: IThemeService + ) { } + + renderTemplate(container: HTMLElement): RepositoryTemplate { + // hack + addClass(container.parentElement!.parentElement!.querySelector('.monaco-tl-twistie')! as HTMLElement, 'force-twistie'); + + const provider = append(container, $('.scm-provider')); + const label = append(provider, $('.label')); + const name = append(label, $('span.name')); + const description = append(label, $('span.description')); + const actions = append(provider, $('.actions')); + const toolBar = new ToolBar(actions, this.contextMenuService, { actionViewItemProvider: this.actionViewItemProvider }); + const countContainer = append(provider, $('.count')); + const count = new CountBadge(countContainer); + const badgeStyler = attachBadgeStyler(count, this.themeService); + const visibilityDisposable = toolBar.onDidChangeDropdownVisibility(e => toggleClass(provider, 'active', e)); + + const disposable = Disposable.None; + const templateDisposable = combinedDisposable(visibilityDisposable, toolBar, badgeStyler); + + return { name, description, countContainer, count, toolBar, disposable, templateDisposable }; + } + + renderElement(node: ITreeNode, index: number, templateData: RepositoryTemplate, height: number | undefined): void { + templateData.disposable.dispose(); + + const disposables = new DisposableStore(); + const repository = node.element; + + if (repository.provider.rootUri) { + templateData.name.textContent = basename(repository.provider.rootUri); + templateData.description.textContent = repository.provider.label; + } else { + templateData.name.textContent = repository.provider.label; + templateData.description.textContent = ''; + } + + let statusPrimaryActions: IAction[] = []; + let menuPrimaryActions: IAction[] = []; + let menuSecondaryActions: IAction[] = []; + const updateToolbar = () => { + templateData.toolBar.setActions([...statusPrimaryActions, ...menuPrimaryActions], menuSecondaryActions); + }; + + const onDidChangeProvider = () => { + const commands = repository.provider.statusBarCommands || []; + statusPrimaryActions = commands.map(c => new StatusBarAction(c, this.commandService)); + updateToolbar(); + + const count = repository.provider.count || 0; + templateData.countContainer.setAttribute('data-count', String(count)); + templateData.count.setCount(count); + }; + disposables.add(repository.provider.onDidChange(onDidChangeProvider, null)); + onDidChangeProvider(); + + const menus = this.menus.getRepositoryMenus(repository.provider); + disposables.add(connectPrimaryMenu(menus.titleMenu, (primary, secondary) => { + menuPrimaryActions = primary; + menuSecondaryActions = secondary; + updateToolbar(); + })); + templateData.toolBar.context = repository.provider; + + templateData.disposable = disposables; + } + + renderCompressedElements(): void { + throw new Error('Should never happen since node is incompressible'); + } + + disposeElement(group: ITreeNode, index: number, template: RepositoryTemplate): void { + template.disposable.dispose(); + } + + disposeTemplate(templateData: RepositoryTemplate): void { + templateData.disposable.dispose(); + templateData.templateDisposable.dispose(); + } +} + +interface InputTemplate { + readonly inputWidget: SCMInputWidget; + disposable: IDisposable; + readonly templateDisposable: IDisposable; +} + +class InputRenderer implements ICompressibleTreeRenderer { + + static readonly DEFAULT_HEIGHT = 26; + + static readonly TEMPLATE_ID = 'input'; + get templateId(): string { return InputRenderer.TEMPLATE_ID; } + + private inputWidgets = new Map(); + private contentHeights = new WeakMap(); + + constructor( + private outerLayout: ISCMLayout, + private updateHeight: (input: ISCMInput, height: number) => void, + private focusTree: () => void, + @IInstantiationService private instantiationService: IInstantiationService, + ) { } + + renderTemplate(container: HTMLElement): InputTemplate { + // hack + addClass(container.parentElement!.parentElement!.querySelector('.monaco-tl-twistie')! as HTMLElement, 'force-no-twistie'); + + const disposables = new DisposableStore(); + const inputElement = append(container, $('.scm-input')); + const inputWidget = this.instantiationService.createInstance(SCMInputWidget, inputElement); + disposables.add(inputWidget); + + const onKeyDown = Event.map(domEvent(container, 'keydown'), e => new StandardKeyboardEvent(e)); + const onEscape = Event.filter(onKeyDown, e => e.keyCode === KeyCode.Escape); + disposables.add(onEscape(this.focusTree)); + + return { inputWidget, disposable: Disposable.None, templateDisposable: disposables }; + } + + renderElement(node: ITreeNode, index: number, templateData: InputTemplate): void { + templateData.disposable.dispose(); + + const disposables = new DisposableStore(); + const input = node.element; + templateData.inputWidget.input = input; + disposables.add({ dispose: () => templateData.inputWidget.input = undefined }); + + // Remember widget + this.inputWidgets.set(input, templateData.inputWidget); + disposables.add({ dispose: () => this.inputWidgets.delete(input) }); + + // Rerender the element whenever the editor content height changes + const onDidChangeContentHeight = () => { + const contentHeight = templateData.inputWidget.getContentHeight(); + const lastContentHeight = this.contentHeights.get(input)!; + this.contentHeights.set(input, contentHeight); + + if (lastContentHeight !== contentHeight) { + this.updateHeight(input, contentHeight + 10); + templateData.inputWidget.layout(); + } + }; + + const initialRender = () => { + disposables.add(templateData.inputWidget.onDidChangeContentHeight(onDidChangeContentHeight)); + onDidChangeContentHeight(); + }; + + const contentHeight = templateData.inputWidget.getContentHeight(); + + if (contentHeight !== InputRenderer.DEFAULT_HEIGHT) { + const timeout = setTimeout(initialRender, 0); + disposables.add({ dispose: () => clearTimeout(timeout) }); + } else { + initialRender(); + } + + // Layout the editor whenever the outer layout happens + const layoutEditor = () => templateData.inputWidget.layout(); + disposables.add(this.outerLayout.onDidChange(layoutEditor)); + layoutEditor(); + + templateData.disposable = disposables; + } + + renderCompressedElements(): void { + throw new Error('Should never happen since node is incompressible'); + } + + disposeElement(group: ITreeNode, index: number, template: InputTemplate): void { + template.disposable.dispose(); + } + + disposeTemplate(templateData: InputTemplate): void { + templateData.disposable.dispose(); + templateData.templateDisposable.dispose(); + } + + getHeight(input: ISCMInput): number { + return (this.contentHeights.get(input) ?? InputRenderer.DEFAULT_HEIGHT) + 10; + } + + getRenderedInputWidget(input: ISCMInput): SCMInputWidget | undefined { + return this.inputWidgets.get(input); + } +} + +interface ResourceGroupTemplate { + readonly name: HTMLElement; + readonly count: CountBadge; + readonly actionBar: ActionBar; + elementDisposables: IDisposable; + readonly disposables: IDisposable; +} + +class ResourceGroupRenderer implements ICompressibleTreeRenderer { + + static readonly TEMPLATE_ID = 'resource group'; + get templateId(): string { return ResourceGroupRenderer.TEMPLATE_ID; } + + constructor( + private actionViewItemProvider: IActionViewItemProvider, + private menus: SCMMenus, + @IThemeService private themeService: IThemeService, + ) { } + + renderTemplate(container: HTMLElement): ResourceGroupTemplate { + // hack + addClass(container.parentElement!.parentElement!.querySelector('.monaco-tl-twistie')! as HTMLElement, 'force-twistie'); + + const element = append(container, $('.resource-group')); + const name = append(element, $('.name')); + const actionsContainer = append(element, $('.actions')); + const actionBar = new ActionBar(actionsContainer, { actionViewItemProvider: this.actionViewItemProvider }); + const countContainer = append(element, $('.count')); + const count = new CountBadge(countContainer); + const styler = attachBadgeStyler(count, this.themeService); + const elementDisposables = Disposable.None; + const disposables = combinedDisposable(actionBar, styler); + + return { name, count, actionBar, elementDisposables, disposables }; + } + + renderElement(node: ITreeNode, index: number, template: ResourceGroupTemplate): void { + template.elementDisposables.dispose(); + + const group = node.element; + template.name.textContent = group.label; + template.actionBar.clear(); + template.actionBar.context = group; + template.count.setCount(group.elements.length); + + const disposables = new DisposableStore(); + const menus = this.menus.getRepositoryMenus(group.provider); + disposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceGroupMenu(group), template.actionBar)); + + template.elementDisposables = disposables; + } + + renderCompressedElements(node: ITreeNode, FuzzyScore>, index: number, templateData: ResourceGroupTemplate, height: number | undefined): void { + throw new Error('Should never happen since node is incompressible'); + } + + disposeElement(group: ITreeNode, index: number, template: ResourceGroupTemplate): void { + template.elementDisposables.dispose(); + } + + disposeTemplate(template: ResourceGroupTemplate): void { + template.elementDisposables.dispose(); + template.disposables.dispose(); + } +} + +interface ResourceTemplate { + element: HTMLElement; + name: HTMLElement; + fileLabel: IResourceLabel; + decorationIcon: HTMLElement; + actionBar: ActionBar; + elementDisposables: IDisposable; + disposables: IDisposable; +} + +class RepositoryPaneActionRunner extends ActionRunner { + + constructor(private getSelectedResources: () => (ISCMResource | IResourceNode)[]) { + super(); + } + + async runAction(action: IAction, context: ISCMResource | IResourceNode): Promise { + if (!(action instanceof MenuItemAction)) { + return super.runAction(action, context); + } + + const selection = this.getSelectedResources(); + const contextIsSelected = selection.some(s => s === context); + const actualContext = contextIsSelected ? selection : [context]; + const args = flatten(actualContext.map(e => ResourceTree.isResourceNode(e) ? ResourceTree.collect(e) : [e])); + await action.run(...args); + } +} + +class ResourceRenderer implements ICompressibleTreeRenderer, FuzzyScore, ResourceTemplate> { + + static readonly TEMPLATE_ID = 'resource'; + get templateId(): string { return ResourceRenderer.TEMPLATE_ID; } + + constructor( + private viewModelProvider: () => ViewModel, + private labels: ResourceLabels, + private actionViewItemProvider: IActionViewItemProvider, + private actionRunner: ActionRunner, + private menus: SCMMenus, + @IThemeService private themeService: IThemeService + ) { } + + renderTemplate(container: HTMLElement): ResourceTemplate { + const element = append(container, $('.resource')); + const name = append(element, $('.name')); + const fileLabel = this.labels.create(name, { supportDescriptionHighlights: true, supportHighlights: true }); + const actionsContainer = append(fileLabel.element, $('.actions')); + const actionBar = new ActionBar(actionsContainer, { + actionViewItemProvider: this.actionViewItemProvider, + actionRunner: this.actionRunner + }); + + const decorationIcon = append(element, $('.decoration-icon')); + const disposables = combinedDisposable(actionBar, fileLabel); + + return { element, name, fileLabel, decorationIcon, actionBar, elementDisposables: Disposable.None, disposables }; + } + + renderElement(node: ITreeNode | ITreeNode, FuzzyScore>, index: number, template: ResourceTemplate): void { + template.elementDisposables.dispose(); + + const elementDisposables = new DisposableStore(); + const resourceOrFolder = node.element; + const theme = this.themeService.getColorTheme(); + const iconResource = ResourceTree.isResourceNode(resourceOrFolder) ? resourceOrFolder.element : resourceOrFolder; + const icon = iconResource && (theme.type === LIGHT ? iconResource.decorations.icon : iconResource.decorations.iconDark); + + const uri = ResourceTree.isResourceNode(resourceOrFolder) ? resourceOrFolder.uri : resourceOrFolder.sourceUri; + const fileKind = ResourceTree.isResourceNode(resourceOrFolder) ? FileKind.FOLDER : FileKind.FILE; + const viewModel = this.viewModelProvider(); + + const [matches, descriptionMatches] = splitMatches(uri, node.filterData); + template.fileLabel.setFile(uri, { + fileDecorations: { colors: false, badges: !icon }, + hidePath: viewModel.mode === ViewModelMode.Tree, + fileKind, + matches, + descriptionMatches + }); + + template.actionBar.clear(); + template.actionBar.context = resourceOrFolder; + + if (ResourceTree.isResourceNode(resourceOrFolder)) { + if (resourceOrFolder.element) { + const menus = this.menus.getRepositoryMenus(resourceOrFolder.element.resourceGroup.provider); + elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceMenu(resourceOrFolder.element.resourceGroup), template.actionBar)); + toggleClass(template.name, 'strike-through', resourceOrFolder.element.decorations.strikeThrough); + toggleClass(template.element, 'faded', resourceOrFolder.element.decorations.faded); + } else { + const menus = this.menus.getRepositoryMenus(resourceOrFolder.context.provider); + elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceFolderMenu(resourceOrFolder.context), template.actionBar)); + removeClass(template.name, 'strike-through'); + removeClass(template.element, 'faded'); + } + } else { + const menus = this.menus.getRepositoryMenus(resourceOrFolder.resourceGroup.provider); + elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceMenu(resourceOrFolder.resourceGroup), template.actionBar)); + toggleClass(template.name, 'strike-through', resourceOrFolder.decorations.strikeThrough); + toggleClass(template.element, 'faded', resourceOrFolder.decorations.faded); + } + + const tooltip = !ResourceTree.isResourceNode(resourceOrFolder) && resourceOrFolder.decorations.tooltip || ''; + + if (icon) { + template.decorationIcon.style.display = ''; + template.decorationIcon.style.backgroundImage = `url('${icon}')`; + template.decorationIcon.title = tooltip; + } else { + template.decorationIcon.style.display = 'none'; + template.decorationIcon.style.backgroundImage = ''; + template.decorationIcon.title = ''; + } + + template.element.setAttribute('data-tooltip', tooltip); + template.elementDisposables = elementDisposables; + } + + disposeElement(resource: ITreeNode | ITreeNode, FuzzyScore>, index: number, template: ResourceTemplate): void { + template.elementDisposables.dispose(); + } + + renderCompressedElements(node: ITreeNode | ICompressedTreeNode>, FuzzyScore>, index: number, template: ResourceTemplate, height: number | undefined): void { + template.elementDisposables.dispose(); + + const elementDisposables = new DisposableStore(); + const compressed = node.element as ICompressedTreeNode>; + const folder = compressed.elements[compressed.elements.length - 1]; + + const label = compressed.elements.map(e => e.name).join('/'); + const fileKind = FileKind.FOLDER; + + const [matches, descriptionMatches] = splitMatches(folder.uri, node.filterData); + template.fileLabel.setResource({ resource: folder.uri, name: label }, { + fileDecorations: { colors: false, badges: true }, + fileKind, + matches, + descriptionMatches + }); + + template.actionBar.clear(); + template.actionBar.context = folder; + + const menus = this.menus.getRepositoryMenus(folder.context.provider); + elementDisposables.add(connectPrimaryMenuToInlineActionBar(menus.getResourceFolderMenu(folder.context), template.actionBar)); + + removeClass(template.name, 'strike-through'); + removeClass(template.element, 'faded'); + template.decorationIcon.style.display = 'none'; + template.decorationIcon.style.backgroundImage = ''; + + template.element.setAttribute('data-tooltip', ''); + template.elementDisposables = elementDisposables; + } + + disposeCompressedElements(node: ITreeNode | ICompressedTreeNode>, FuzzyScore>, index: number, template: ResourceTemplate, height: number | undefined): void { + template.elementDisposables.dispose(); + } + + disposeTemplate(template: ResourceTemplate): void { + template.elementDisposables.dispose(); + template.disposables.dispose(); + } +} + +class ProviderListDelegate implements IListVirtualDelegate { + + constructor(private readonly inputRenderer: InputRenderer) { } + + getHeight(element: TreeElement) { + if (isSCMInput(element)) { + return this.inputRenderer.getHeight(element); + } else { + return 22; + } + } + + getTemplateId(element: TreeElement) { + if (isSCMRepository(element)) { + return RepositoryRenderer.TEMPLATE_ID; + } else if (isSCMInput(element)) { + return InputRenderer.TEMPLATE_ID; + } else if (ResourceTree.isResourceNode(element) || isSCMResource(element)) { + return ResourceRenderer.TEMPLATE_ID; + } else { + return ResourceGroupRenderer.TEMPLATE_ID; + } + } +} + +class SCMTreeFilter implements ITreeFilter { + + filter(element: TreeElement): boolean { + if (ResourceTree.isResourceNode(element)) { + return true; + } else if (isSCMResourceGroup(element)) { + return element.elements.length > 0 || !element.hideWhenEmpty; + } else { + return true; + } + } +} + +export class SCMTreeSorter implements ITreeSorter { + + @memoize + private get viewModel(): ViewModel { return this.viewModelProvider(); } + + constructor(private viewModelProvider: () => ViewModel) { } + + compare(one: TreeElement, other: TreeElement): number { + if (isSCMRepository(one)) { + if (!isSCMRepository(other)) { + throw new Error('Invalid comparison'); + } + + return 0; + } + + if (isSCMInput(one)) { + return -1; + } else if (isSCMInput(other)) { + return 1; + } + + if (isSCMResourceGroup(one)) { + if (!isSCMResourceGroup(other)) { + throw new Error('Invalid comparison'); + } + + return 0; + } + + // List + if (this.viewModel.mode === ViewModelMode.List) { + // FileName + if (this.viewModel.sortKey === ViewModelSortKey.Name) { + const oneName = basename((one as ISCMResource).sourceUri); + const otherName = basename((other as ISCMResource).sourceUri); + + return compareFileNames(oneName, otherName); + } + + // Status + if (this.viewModel.sortKey === ViewModelSortKey.Status) { + const oneTooltip = (one as ISCMResource).decorations.tooltip ?? ''; + const otherTooltip = (other as ISCMResource).decorations.tooltip ?? ''; + + if (oneTooltip !== otherTooltip) { + return compare(oneTooltip, otherTooltip); + } + } + + // Path (default) + const onePath = (one as ISCMResource).sourceUri.fsPath; + const otherPath = (other as ISCMResource).sourceUri.fsPath; + + return comparePaths(onePath, otherPath); + } + + // Tree + const oneIsDirectory = ResourceTree.isResourceNode(one); + const otherIsDirectory = ResourceTree.isResourceNode(other); + + if (oneIsDirectory !== otherIsDirectory) { + return oneIsDirectory ? -1 : 1; + } + + const oneName = ResourceTree.isResourceNode(one) ? one.name : basename((one as ISCMResource).sourceUri); + const otherName = ResourceTree.isResourceNode(other) ? other.name : basename((other as ISCMResource).sourceUri); + + return compareFileNames(oneName, otherName); + } +} + +export class SCMTreeKeyboardNavigationLabelProvider implements ICompressibleKeyboardNavigationLabelProvider { + + constructor(@ILabelService private readonly labelService: ILabelService) { } + + getKeyboardNavigationLabel(element: TreeElement): { toString(): string; } | undefined { + if (ResourceTree.isResourceNode(element)) { + return element.name; + } else if (isSCMRepository(element)) { + return undefined; + } else if (isSCMInput(element)) { + return undefined; + } else if (isSCMResourceGroup(element)) { + return element.label; + } else { + // Since a match in the file name takes precedence over a match + // in the folder name we are returning the label as file/folder. + const fileName = basename(element.sourceUri); + const filePath = this.labelService.getUriLabel(dirname(element.sourceUri), { relative: true }); + + return filePath.length !== 0 ? `${fileName} ${filePath}` : fileName; + } + } + + getCompressedNodeKeyboardNavigationLabel(elements: TreeElement[]): { toString(): string | undefined; } | undefined { + const folders = elements as IResourceNode[]; + return folders.map(e => e.name).join('/'); + } +} + +class SCMResourceIdentityProvider implements IIdentityProvider { + + getId(element: TreeElement): string { + if (ResourceTree.isResourceNode(element)) { + const group = element.context; + return `folder:${group.provider.id}/${group.id}/$FOLDER/${element.uri.toString()}`; + } else if (isSCMRepository(element)) { + const provider = element.provider; + return `repo:${provider.id}`; + } else if (isSCMInput(element)) { + const provider = element.repository.provider; + return `input:${provider.id}`; + } else if (isSCMResource(element)) { + const group = element.resourceGroup; + const provider = group.provider; + return `resource:${provider.id}/${group.id}/${element.sourceUri.toString()}`; + } else { + const provider = element.provider; + return `group:${provider.id}/${element.id}`; + } + } +} + +export class SCMAccessibilityProvider implements IListAccessibilityProvider { + + constructor(@ILabelService private readonly labelService: ILabelService) { } + + getWidgetAriaLabel(): string { + return localize('scm', "Source Control Management"); + } + + getAriaLabel(element: TreeElement): string { + if (ResourceTree.isResourceNode(element)) { + return this.labelService.getUriLabel(element.uri, { relative: true, noPrefix: true }) || element.name; + } else if (isSCMRepository(element)) { + return element.provider.label; + } else if (isSCMInput(element)) { + return localize('input', "Source Control Input"); + } else if (isSCMResourceGroup(element)) { + return element.label; + } else { + const result: string[] = []; + + result.push(basename(element.sourceUri)); + + if (element.decorations.tooltip) { + result.push(element.decorations.tooltip); + } + + const path = this.labelService.getUriLabel(dirname(element.sourceUri), { relative: true, noPrefix: true }); + + if (path) { + result.push(path); + } + + return result.join(', '); + } + } +} + +interface IGroupItem { + readonly element: ISCMResourceGroup; + readonly resources: ISCMResource[]; + readonly tree: ResourceTree; + readonly disposable: IDisposable; +} + +interface IRepositoryItem { + readonly element: ISCMRepository; + readonly groupItems: IGroupItem[]; + readonly disposable: IDisposable; +} + +function isRepositoryItem(item: IRepositoryItem | IGroupItem): item is IRepositoryItem { + return Array.isArray((item as IRepositoryItem).groupItems); +} + +function asTreeElement(node: IResourceNode, forceIncompressible: boolean): ICompressedTreeElement { + return { + element: (node.childrenCount === 0 && node.element) ? node.element : node, + children: Iterable.map(node.children, node => asTreeElement(node, false)), + incompressible: !!node.element || forceIncompressible + }; +} + +const enum ViewModelMode { + List = 'list', + Tree = 'tree' +} + +const enum ViewModelSortKey { + Path, + Name, + Status +} + +class ViewModel { + + private readonly _onDidChangeMode = new Emitter(); + readonly onDidChangeMode = this._onDidChangeMode.event; + + private _onDidChangeRepositoryCollapseState = new Emitter(); + readonly onDidChangeRepositoryCollapseState: Event; + private visible: boolean = false; + + get mode(): ViewModelMode { return this._mode; } + set mode(mode: ViewModelMode) { + this._mode = mode; + + for (const item of this.items) { + for (const groupItem of item.groupItems) { + groupItem.tree.clear(); + + if (mode === ViewModelMode.Tree) { + for (const resource of groupItem.resources) { + groupItem.tree.add(resource.sourceUri, resource); + } + } + } + } + + this.refresh(); + this._onDidChangeMode.fire(mode); + } + + get sortKey(): ViewModelSortKey { return this._sortKey; } + set sortKey(sortKey: ViewModelSortKey) { + if (sortKey !== this._sortKey) { + this._sortKey = sortKey; + this.refresh(); + } + } + + private items: IRepositoryItem[] = []; + private visibilityDisposables = new DisposableStore(); + private scrollTop: number | undefined; + private firstVisible = true; + private repositoryCollapseStates: Map | undefined; + private disposables = new DisposableStore(); + + constructor( + readonly repositories: ISequence, + private tree: WorkbenchCompressibleObjectTree, + private menus: SCMMenus, + private inputRenderer: InputRenderer, + private _mode: ViewModelMode, + private _sortKey: ViewModelSortKey, + @IEditorService protected editorService: IEditorService, + @IConfigurationService protected configurationService: IConfigurationService, + ) { + this.onDidChangeRepositoryCollapseState = Event.any( + this._onDidChangeRepositoryCollapseState.event, + Event.signal(Event.filter(this.tree.onDidChangeCollapseState, e => isSCMRepository(e.node.element))) + ); + } + + private _onDidSpliceRepositories({ start, deleteCount, toInsert }: ISplice): void { + const itemsToInsert = toInsert.map(repository => { + const disposable = combinedDisposable( + repository.provider.groups.onDidSplice(splice => this._onDidSpliceGroups(item, splice)), + repository.input.onDidChangeVisibility(() => this.refresh(item)) + ); + const groupItems = repository.provider.groups.elements.map(group => this.createGroupItem(group)); + const item: IRepositoryItem = { element: repository, groupItems, disposable }; + + return item; + }); + + const itemsToDispose = this.items.splice(start, deleteCount, ...itemsToInsert); + + for (const item of itemsToDispose) { + for (const groupItem of item.groupItems) { + groupItem.disposable.dispose(); + } + + item.disposable.dispose(); + } + + this.refresh(); + } + + private _onDidSpliceGroups(item: IRepositoryItem, { start, deleteCount, toInsert }: ISplice): void { + const itemsToInsert: IGroupItem[] = toInsert.map(group => this.createGroupItem(group)); + const itemsToDispose = item.groupItems.splice(start, deleteCount, ...itemsToInsert); + + for (const item of itemsToDispose) { + item.disposable.dispose(); + } + + this.refresh(); + } + + private createGroupItem(group: ISCMResourceGroup): IGroupItem { + const tree = new ResourceTree(group, group.provider.rootUri || URI.file('/')); + const resources: ISCMResource[] = [...group.elements]; + const disposable = combinedDisposable( + group.onDidChange(() => this.tree.refilter()), + group.onDidSplice(splice => this._onDidSpliceGroup(item, splice)) + ); + + const item: IGroupItem = { element: group, resources, tree, disposable }; + + if (this._mode === ViewModelMode.Tree) { + for (const resource of resources) { + item.tree.add(resource.sourceUri, resource); + } + } + + return item; + } + + private _onDidSpliceGroup(item: IGroupItem, { start, deleteCount, toInsert }: ISplice): void { + const before = item.resources.length; + const deleted = item.resources.splice(start, deleteCount, ...toInsert); + const after = item.resources.length; + + if (this._mode === ViewModelMode.Tree) { + for (const resource of deleted) { + item.tree.delete(resource.sourceUri); + } + + for (const resource of toInsert) { + item.tree.add(resource.sourceUri, resource); + } + } + + if (before !== after && (before === 0 || after === 0)) { + this.refresh(); + } else { + this.refresh(item); + } + } + + setVisible(visible: boolean): void { + if (visible) { + this.visibilityDisposables = new DisposableStore(); + this.repositories.onDidSplice(this._onDidSpliceRepositories, this, this.visibilityDisposables); + this._onDidSpliceRepositories({ start: 0, deleteCount: 0, toInsert: this.repositories.elements }); + this.repositoryCollapseStates = undefined; + + if (typeof this.scrollTop === 'number') { + this.tree.scrollTop = this.scrollTop; + this.scrollTop = undefined; + } + + this.editorService.onDidActiveEditorChange(this.onDidActiveEditorChange, this, this.visibilityDisposables); + this.onDidActiveEditorChange(); + } else { + if (this.items.length > 1) { + this.repositoryCollapseStates = new Map(); + + for (const item of this.items) { + this.repositoryCollapseStates.set(item.element, this.tree.isCollapsed(item.element)); + } + } + + this.visibilityDisposables.dispose(); + this._onDidSpliceRepositories({ start: 0, deleteCount: this.items.length, toInsert: [] }); + this.scrollTop = this.tree.scrollTop; + } + + this.visible = visible; + this._onDidChangeRepositoryCollapseState.fire(); + } + + private refresh(item?: IRepositoryItem | IGroupItem): void { + if (this.items.length === 1 && (!item || isRepositoryItem(item))) { + this.tree.setChildren(null, this.render(this.items[0]).children); + } else if (item) { + this.tree.setChildren(item.element, this.render(item).children); + } else { + this.tree.setChildren(null, this.items.map(item => this.render(item))); + } + + this._onDidChangeRepositoryCollapseState.fire(); + } + + private render(item: IRepositoryItem | IGroupItem): ICompressedTreeElement { + if (isRepositoryItem(item)) { + const children: ICompressedTreeElement[] = []; + const hasSomeChanges = item.groupItems.some(item => item.element.elements.length > 0); + + if (this.items.length === 1 || hasSomeChanges) { + if (item.element.input.visible) { + children.push({ element: item.element.input, incompressible: true, collapsible: false }); + } + + children.push(...item.groupItems.map(i => this.render(i))); + } + + const collapsed = this.repositoryCollapseStates?.get(item.element) ?? false; + return { element: item.element, children, incompressible: true, collapsed, collapsible: hasSomeChanges }; + } else { + const children = this.mode === ViewModelMode.List + ? Iterable.map(item.resources, element => ({ element, incompressible: true })) + : Iterable.map(item.tree.root.children, node => asTreeElement(node, true)); + + return { element: item.element, children, incompressible: true, collapsible: true }; + } + } + + private onDidActiveEditorChange(): void { + if (!this.configurationService.getValue('scm.autoReveal')) { + return; + } + + if (this.firstVisible) { + this.firstVisible = false; + this.visibilityDisposables.add(disposableTimeout(() => this.onDidActiveEditorChange(), 250)); + return; + } + + const editor = this.editorService.activeEditor; + + if (!editor) { + return; + } + + const uri = toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); + + if (!uri) { + return; + } + + for (let i = 0; i < this.items.length; i++) { + const item = this.items[i]; + // go backwards from last group + for (let j = item.groupItems.length - 1; j >= 0; j--) { + const groupItem = item.groupItems[j]; + const resource = this.mode === ViewModelMode.Tree + ? groupItem.tree.getNode(uri)?.element + : groupItem.resources.find(r => isEqual(r.sourceUri, uri)); + + if (resource) { + this.tree.reveal(resource); + this.tree.setSelection([resource]); + this.tree.setFocus([resource]); + return; + } + } + } + } + + focus() { + for (const repository of this.repositories.elements) { + const widget = this.inputRenderer.getRenderedInputWidget(repository.input); + + if (widget) { + widget.focus(); + return; + } + } + + this.tree.domFocus(); + } + + getViewActions(): IAction[] { + if (this.repositories.elements.length !== 1) { + return []; + } + + const menus = this.menus.getRepositoryMenus(this.repositories.elements[0].provider); + return menus.getTitleActions(); + } + + getViewSecondaryActions(): IAction[] { + if (this.repositories.elements.length === 0) { + return []; + } + + const viewAction = new SCMViewSubMenuAction(this); + + if (this.repositories.elements.length !== 1) { + return viewAction.entries; + } + + const menus = this.menus.getRepositoryMenus(this.repositories.elements[0].provider); + const secondaryActions = menus.getTitleSecondaryActions(); + + if (secondaryActions.length === 0) { + return [viewAction]; + } + + return [viewAction, new Separator(), ...secondaryActions]; + } + + getViewActionsContext(): any { + if (this.repositories.elements.length !== 1) { + return undefined; + } + + return this.repositories.elements[0].provider; + } + + collapseAllProviders(): void { + for (const repository of this.repositories.elements) { + if (this.tree.isCollapsible(repository)) { + this.tree.collapse(repository); + } + } + } + + expandAllProviders(): void { + for (const repository of this.repositories.elements) { + if (this.tree.isCollapsible(repository)) { + this.tree.expand(repository); + } + } + } + + isAnyProviderCollapsible(): boolean { + if (!this.visible || this.repositories.elements.length === 1) { + return false; + } + + return this.repositories.elements.some(r => this.tree.hasElement(r) && this.tree.isCollapsible(r)); + } + + areAllProvidersCollapsed(): boolean { + if (!this.visible || this.repositories.elements.length === 1) { + return false; + } + + return this.repositories.elements.every(r => this.tree.hasElement(r) && (!this.tree.isCollapsible(r) || this.tree.isCollapsed(r))); + } + + dispose(): void { + this.visibilityDisposables.dispose(); + this.disposables.dispose(); + + for (const item of this.items) { + item.disposable.dispose(); + } + + this.items = []; + } +} + +class SCMViewSubMenuAction extends ContextSubMenu { + constructor(viewModel: ViewModel) { + super(localize('sortAction', "View & Sort"), + [ + ...new RadioGroup([ + new SCMViewModeListAction(viewModel), + new SCMViewModeTreeAction(viewModel) + ]).actions, + new Separator(), + ...new RadioGroup([ + new SCMSortByNameAction(viewModel), + new SCMSortByPathAction(viewModel), + new SCMSortByStatusAction(viewModel) + ]).actions + ] + ); + } +} + +abstract class SCMViewModeAction extends Action { + constructor(id: string, label: string, private viewModel: ViewModel, private viewMode: ViewModelMode) { + super(id, label); + + this.checked = this.viewModel.mode === this.viewMode; + } + + async run(): Promise { + if (this.viewMode !== this.viewModel.mode) { + this.checked = !this.checked; + this.viewModel.mode = this.viewMode; + } + } +} + +class SCMViewModeListAction extends SCMViewModeAction { + static readonly ID = 'workbench.scm.action.viewModeList'; + static readonly LABEL = localize('viewModeList', "View as List"); + + constructor(viewModel: ViewModel) { + super(SCMViewModeListAction.ID, SCMViewModeListAction.LABEL, viewModel, ViewModelMode.List); + } +} + +class SCMViewModeTreeAction extends SCMViewModeAction { + static readonly ID = 'workbench.scm.action.viewModeTree'; + static readonly LABEL = localize('viewModeTree', "View as Tree"); + + constructor(viewModel: ViewModel) { + super(SCMViewModeTreeAction.ID, SCMViewModeTreeAction.LABEL, viewModel, ViewModelMode.Tree); + } +} + +abstract class SCMSortAction extends Action { + + private readonly _listener: IDisposable; + + constructor(id: string, label: string, private viewModel: ViewModel, private sortKey: ViewModelSortKey) { + super(id, label); + + this.checked = this.sortKey === ViewModelSortKey.Path; + this.enabled = this.viewModel?.mode === ViewModelMode.List ?? false; + this._listener = viewModel?.onDidChangeMode(e => this.enabled = e === ViewModelMode.List); + } + + async run(): Promise { + if (this.sortKey !== this.viewModel.sortKey) { + this.checked = !this.checked; + this.viewModel.sortKey = this.sortKey; + } + } + + dispose(): void { + this._listener.dispose(); + super.dispose(); + } +} + +class SCMSortByNameAction extends SCMSortAction { + static readonly ID = 'workbench.scm.action.sortByName'; + static readonly LABEL = localize('sortByName', "Sort by Name"); + + constructor(viewModel: ViewModel) { + super(SCMSortByNameAction.ID, SCMSortByNameAction.LABEL, viewModel, ViewModelSortKey.Name); + } +} + +class SCMSortByPathAction extends SCMSortAction { + static readonly ID = 'workbench.scm.action.sortByPath'; + static readonly LABEL = localize('sortByPath', "Sort by Path"); + + constructor(viewModel: ViewModel) { + super(SCMSortByPathAction.ID, SCMSortByPathAction.LABEL, viewModel, ViewModelSortKey.Path); + } +} + +class SCMSortByStatusAction extends SCMSortAction { + static readonly ID = 'workbench.scm.action.sortByStatus'; + static readonly LABEL = localize('sortByStatus', "Sort by Status"); + + constructor(viewModel: ViewModel) { + super(SCMSortByStatusAction.ID, SCMSortByStatusAction.LABEL, viewModel, ViewModelSortKey.Status); + } +} + +class SCMInputWidget extends Disposable { + + private readonly defaultInputFontFamily = DEFAULT_FONT_FAMILY; + + private element: HTMLElement; + private editorContainer: HTMLElement; + private placeholderTextContainer: HTMLElement; + private inputEditor: CodeEditorWidget; + + private model: { readonly input: ISCMInput; readonly textModel: ITextModel; } | undefined; + private repositoryContextKey: IContextKey; + private repositoryDisposables = new DisposableStore(); + + private validation: IInputValidation | undefined; + private validationDisposable: IDisposable = Disposable.None; + + readonly onDidChangeContentHeight: Event; + + get input(): ISCMInput | undefined { + return this.model?.input; + } + + set input(input: ISCMInput | undefined) { + this.validationDisposable.dispose(); + removeClass(this.editorContainer, 'synthetic-focus'); + + this.repositoryDisposables.dispose(); + this.repositoryDisposables = new DisposableStore(); + this.repositoryContextKey.set(input?.repository); + + if (!input) { + this.model?.textModel.dispose(); + this.inputEditor.setModel(undefined); + this.model = undefined; + return; + } + + let query: string | undefined; + + if (input.repository.provider.rootUri) { + query = `rootUri=${encodeURIComponent(input.repository.provider.rootUri.toString())}`; + } + + const uri = URI.from({ + scheme: Schemas.vscode, + path: `scm/${input.repository.provider.contextValue}/${input.repository.provider.id}/input`, + query + }); + + this.configurationService.updateValue('editor.wordBasedSuggestions', false, { resource: uri }, ConfigurationTarget.MEMORY); + + const mode = this.modeService.create('scminput'); + const textModel = this.modelService.getModel(uri) || this.modelService.createModel('', mode, uri); + this.inputEditor.setModel(textModel); + + // Validation + const validationDelayer = new ThrottledDelayer(200); + const validate = async () => { + const position = this.inputEditor.getSelection()?.getStartPosition(); + const offset = position && textModel.getOffsetAt(position); + const value = textModel.getValue(); + + this.validation = await input.validateInput(value, offset || 0); + this.renderValidation(); + }; + + const triggerValidation = () => validationDelayer.trigger(validate); + this.repositoryDisposables.add(validationDelayer); + this.repositoryDisposables.add(this.inputEditor.onDidChangeCursorPosition(triggerValidation)); + + // Adaptive indentation rules + const opts = this.modelService.getCreationOptions(textModel.getLanguageIdentifier().language, textModel.uri, textModel.isForSimpleWidget); + const onEnter = Event.filter(this.inputEditor.onKeyDown, e => e.keyCode === KeyCode.Enter); + this.repositoryDisposables.add(onEnter(() => textModel.detectIndentation(opts.insertSpaces, opts.tabSize))); + + // Keep model in sync with API + textModel.setValue(input.value); + this.repositoryDisposables.add(input.onDidChange(value => { + if (value === textModel.getValue()) { // circuit breaker + return; + } + textModel.setValue(value); + this.inputEditor.setPosition(textModel.getFullModelRange().getEndPosition()); + })); + + // Keep API in sync with model, update placeholder visibility and validate + const updatePlaceholderVisibility = () => toggleClass(this.placeholderTextContainer, 'hidden', textModel.getValueLength() > 0); + this.repositoryDisposables.add(textModel.onDidChangeContent(() => { + input.value = textModel.getValue(); + updatePlaceholderVisibility(); + triggerValidation(); + })); + updatePlaceholderVisibility(); + + // Update placeholder text + const updatePlaceholderText = () => { + const binding = this.keybindingService.lookupKeybinding('scm.acceptInput'); + const label = binding ? binding.getLabel() : (platform.isMacintosh ? 'Cmd+Enter' : 'Ctrl+Enter'); + const placeholderText = format(input.placeholder, label); + + this.inputEditor.updateOptions({ ariaLabel: placeholderText }); + this.placeholderTextContainer.textContent = placeholderText; + }; + this.repositoryDisposables.add(input.onDidChangePlaceholder(updatePlaceholderText)); + this.repositoryDisposables.add(this.keybindingService.onDidUpdateKeybindings(updatePlaceholderText)); + updatePlaceholderText(); + + // Update input template + let commitTemplate = ''; + const updateTemplate = () => { + if (typeof input.repository.provider.commitTemplate === 'undefined' || !input.visible) { + return; + } + + const oldCommitTemplate = commitTemplate; + commitTemplate = input.repository.provider.commitTemplate; + + const value = textModel.getValue(); + + if (value && value !== oldCommitTemplate) { + return; + } + + textModel.setValue(commitTemplate); + }; + this.repositoryDisposables.add(input.repository.provider.onDidChangeCommitTemplate(updateTemplate, this)); + updateTemplate(); + + // Save model + this.model = { input, textModel }; + } + + constructor( + container: HTMLElement, + @IContextKeyService contextKeyService: IContextKeyService, + @IModelService private modelService: IModelService, + @IModeService private modeService: IModeService, + @IKeybindingService private keybindingService: IKeybindingService, + @IConfigurationService private configurationService: IConfigurationService, + @IInstantiationService instantiationService: IInstantiationService, + @IContextViewService private readonly contextViewService: IContextViewService, + ) { + super(); + + this.element = append(container, $('.scm-editor')); + this.editorContainer = append(this.element, $('.scm-editor-container')); + this.placeholderTextContainer = append(this.editorContainer, $('.scm-editor-placeholder')); + + const contextKeyService2 = contextKeyService.createScoped(this.element); + this.repositoryContextKey = contextKeyService2.createKey('scmRepository', undefined); + + const editorOptions: IEditorConstructionOptions = { + ...getSimpleEditorOptions(), + lineDecorationsWidth: 4, + dragAndDrop: false, + cursorWidth: 1, + fontSize: 13, + lineHeight: 20, + fontFamily: this.getInputEditorFontFamily(), + wrappingStrategy: 'advanced', + wrappingIndent: 'none', + padding: { top: 3, bottom: 3 }, + quickSuggestions: false + }; + + const codeEditorWidgetOptions: ICodeEditorWidgetOptions = { + isSimpleWidget: true, + contributions: EditorExtensionsRegistry.getSomeEditorContributions([ + SuggestController.ID, + SnippetController2.ID, + MenuPreventer.ID, + SelectionClipboardContributionID, + ContextMenuController.ID, + ColorDetector.ID, + ModesHoverController.ID, + LinkDetector.ID + ]) + }; + + const services = new ServiceCollection([IContextKeyService, contextKeyService2]); + const instantiationService2 = instantiationService.createChild(services); + this.inputEditor = instantiationService2.createInstance(CodeEditorWidget, this.editorContainer, editorOptions, codeEditorWidgetOptions); + this._register(this.inputEditor); + + this._register(this.inputEditor.onDidFocusEditorText(() => { + this.input?.repository.setSelected(true); // TODO@joao: remove + addClass(this.editorContainer, 'synthetic-focus'); + this.renderValidation(); + })); + this._register(this.inputEditor.onDidBlurEditorText(() => { + removeClass(this.editorContainer, 'synthetic-focus'); + this.validationDisposable.dispose(); + })); + + const onInputFontFamilyChanged = Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.inputFontFamily')); + this._register(onInputFontFamilyChanged(() => this.inputEditor.updateOptions({ fontFamily: this.getInputEditorFontFamily() }))); + + this.onDidChangeContentHeight = Event.signal(Event.filter(this.inputEditor.onDidContentSizeChange, e => e.contentHeightChanged)); + } + + getContentHeight(): number { + const editorContentHeight = this.inputEditor.getContentHeight(); + return Math.min(editorContentHeight, 134); + } + + layout(): void { + const editorHeight = this.getContentHeight(); + const dimension: Dimension = { + width: this.element.clientWidth - 2, + height: editorHeight, + }; + + this.inputEditor.layout(dimension); + this.renderValidation(); + } + + focus(): void { + this.inputEditor.focus(); + addClass(this.editorContainer, 'synthetic-focus'); + } + + private renderValidation(): void { + this.validationDisposable.dispose(); + + toggleClass(this.editorContainer, 'validation-info', this.validation?.type === InputValidationType.Information); + toggleClass(this.editorContainer, 'validation-warning', this.validation?.type === InputValidationType.Warning); + toggleClass(this.editorContainer, 'validation-error', this.validation?.type === InputValidationType.Error); + + if (!this.validation || !this.inputEditor.hasTextFocus()) { + return; + } + + this.validationDisposable = this.contextViewService.showContextView({ + getAnchor: () => this.editorContainer, + render: container => { + const element = append(container, $('.scm-editor-validation')); + toggleClass(element, 'validation-info', this.validation!.type === InputValidationType.Information); + toggleClass(element, 'validation-warning', this.validation!.type === InputValidationType.Warning); + toggleClass(element, 'validation-error', this.validation!.type === InputValidationType.Error); + element.style.width = `${this.editorContainer.clientWidth}px`; + element.textContent = this.validation!.message; + return Disposable.None; + }, + anchorAlignment: AnchorAlignment.LEFT + }); + } + + private getInputEditorFontFamily(): string { + const inputFontFamily = this.configurationService.getValue('scm.inputFontFamily').trim(); + + if (inputFontFamily.toLowerCase() === 'editor') { + return this.configurationService.getValue('editor.fontFamily').trim(); + } + + if (inputFontFamily.length !== 0 && inputFontFamily.toLowerCase() !== 'default') { + return inputFontFamily; + } + + return this.defaultInputFontFamily; + } + + dispose(): void { + this.repositoryDisposables.dispose(); + this.validationDisposable.dispose(); + super.dispose(); + } +} + +class SCMCollapseAction extends Action { + + private allCollapsed = false; + + constructor(private viewModel: ViewModel) { + super('scm.collapse', undefined, undefined, true); + this._register(viewModel.onDidChangeRepositoryCollapseState(this.update, this)); + this.update(); + } + + async run(): Promise { + if (this.allCollapsed) { + this.viewModel.expandAllProviders(); + } else { + this.viewModel.collapseAllProviders(); + } + } + + private update(): void { + const isAnyProviderCollapsible = this.viewModel.isAnyProviderCollapsible(); + + this.enabled = isAnyProviderCollapsible; + this.allCollapsed = isAnyProviderCollapsible && this.viewModel.areAllProvidersCollapsed(); + this.label = this.allCollapsed ? localize('expand all', "Expand All Providers") : localize('collapse all', "Collapse All Providers"); + this.class = this.allCollapsed ? Codicon.expandAll.classNames : Codicon.collapseAll.classNames; + } +} + +export class SCMViewPane extends ViewPane { + + private _onDidLayout = new Emitter(); + private layoutCache: ISCMLayout = { + height: undefined, + width: undefined, + onDidChange: this._onDidLayout.event + }; + + private listContainer!: HTMLElement; + private tree!: WorkbenchCompressibleObjectTree; + private viewModel!: ViewModel; + private listLabels!: ResourceLabels; + private menus!: SCMMenus; + private inputRenderer!: InputRenderer; + + constructor( + options: IViewPaneOptions, + @ISCMService private scmService: ISCMService, + @IKeybindingService protected keybindingService: IKeybindingService, + @IThemeService protected themeService: IThemeService, + @IContextMenuService protected contextMenuService: IContextMenuService, + @IContextViewService protected contextViewService: IContextViewService, + @ICommandService protected commandService: ICommandService, + @INotificationService private readonly notificationService: INotificationService, + @IEditorService protected editorService: IEditorService, + @IInstantiationService protected instantiationService: IInstantiationService, + @IViewDescriptorService viewDescriptorService: IViewDescriptorService, + @IConfigurationService protected configurationService: IConfigurationService, + @IContextKeyService contextKeyService: IContextKeyService, + @IMenuService protected menuService: IMenuService, + @IStorageService private storageService: IStorageService, + @IOpenerService openerService: IOpenerService, + @ITelemetryService telemetryService: ITelemetryService, + ) { + super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); + this._register(Event.any(this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository)(() => this._onDidChangeViewWelcomeState.fire())); + } + + protected renderBody(container: HTMLElement): void { + super.renderBody(container); + + // List + this.listContainer = append(container, $('.scm-view.show-file-icons')); + + const updateActionsVisibility = () => toggleClass(this.listContainer, 'show-actions', this.configurationService.getValue('scm.alwaysShowActions')); + Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.alwaysShowActions'))(updateActionsVisibility); + updateActionsVisibility(); + + const updateProviderCountVisibility = () => { + const value = this.configurationService.getValue<'hidden' | 'auto' | 'visible'>('scm.providerCountBadge'); + toggleClass(this.listContainer, 'hide-provider-counts', value === 'hidden'); + toggleClass(this.listContainer, 'auto-provider-counts', value === 'auto'); + }; + Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.providerCountBadge'))(updateProviderCountVisibility); + updateProviderCountVisibility(); + + const repositories = new SimpleSequence(this.scmService.repositories, this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository); + this._register(repositories); + + this.menus = this.instantiationService.createInstance(SCMMenus, repositories); + this._register(this.menus); + + this._register(repositories.onDidSplice(() => this.updateActions())); + + this.inputRenderer = this.instantiationService.createInstance(InputRenderer, this.layoutCache, (input, height) => this.tree.updateElementHeight(input, height), () => this.tree.domFocus()); + const delegate = new ProviderListDelegate(this.inputRenderer); + + const actionViewItemProvider = (action: IAction) => this.getActionViewItem(action); + + this.listLabels = this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this.onDidChangeBodyVisibility }); + this._register(this.listLabels); + + const actionRunner = new RepositoryPaneActionRunner(() => this.getSelectedResources()); + this._register(actionRunner); + this._register(actionRunner.onDidBeforeRun(() => this.tree.domFocus())); + + const renderers = [ + this.instantiationService.createInstance(RepositoryRenderer, actionViewItemProvider, this.menus), + this.inputRenderer, + this.instantiationService.createInstance(ResourceGroupRenderer, actionViewItemProvider, this.menus), + this.instantiationService.createInstance(ResourceRenderer, () => this.viewModel, this.listLabels, actionViewItemProvider, actionRunner, this.menus) + ]; + + const filter = new SCMTreeFilter(); + const sorter = new SCMTreeSorter(() => this.viewModel); + const keyboardNavigationLabelProvider = this.instantiationService.createInstance(SCMTreeKeyboardNavigationLabelProvider); + const identityProvider = new SCMResourceIdentityProvider(); + + this.tree = this.instantiationService.createInstance( + WorkbenchCompressibleObjectTree, + 'SCM Tree Repo', + this.listContainer, + delegate, + renderers, + { + identityProvider, + horizontalScrolling: false, + setRowLineHeight: false, + filter, + sorter, + keyboardNavigationLabelProvider, + transformOptimization: false, + overrideStyles: { + listBackground: this.viewDescriptorService.getViewLocationById(this.id) === ViewContainerLocation.Sidebar ? SIDE_BAR_BACKGROUND : PANEL_BACKGROUND + }, + accessibilityProvider: this.instantiationService.createInstance(SCMAccessibilityProvider) + }) as WorkbenchCompressibleObjectTree; + + this._register(this.tree.onDidOpen(this.open, this)); + + this._register(this.tree.onContextMenu(this.onListContextMenu, this)); + this._register(this.tree); + + let viewMode = this.configurationService.getValue<'tree' | 'list'>('scm.defaultViewMode') === 'list' ? ViewModelMode.List : ViewModelMode.Tree; + const storageMode = this.storageService.get(`scm.viewMode`, StorageScope.WORKSPACE) as ViewModelMode; + + if (typeof storageMode === 'string') { + viewMode = storageMode; + } + + this.viewModel = this.instantiationService.createInstance(ViewModel, repositories, this.tree, this.menus, this.inputRenderer, viewMode, ViewModelSortKey.Path); + this._register(this.viewModel); + + addClass(this.listContainer, 'file-icon-themable-tree'); + addClass(this.listContainer, 'show-file-icons'); + + this.updateIndentStyles(this.themeService.getFileIconTheme()); + this._register(this.themeService.onDidFileIconThemeChange(this.updateIndentStyles, this)); + this._register(this.viewModel.onDidChangeMode(this.onDidChangeMode, this)); + + this._register(this.onDidChangeBodyVisibility(this.viewModel.setVisible, this.viewModel)); + + this.updateActions(); + } + + private updateIndentStyles(theme: IFileIconTheme): void { + toggleClass(this.listContainer, 'list-view-mode', this.viewModel.mode === ViewModelMode.List); + toggleClass(this.listContainer, 'tree-view-mode', this.viewModel.mode === ViewModelMode.Tree); + toggleClass(this.listContainer, 'align-icons-and-twisties', (this.viewModel.mode === ViewModelMode.List && theme.hasFileIcons) || (theme.hasFileIcons && !theme.hasFolderIcons)); + toggleClass(this.listContainer, 'hide-arrows', this.viewModel.mode === ViewModelMode.Tree && theme.hidesExplorerArrows === true); + } + + private onDidChangeMode(): void { + this.updateIndentStyles(this.themeService.getFileIconTheme()); + this.storageService.store(`scm.viewMode`, this.viewModel.mode, StorageScope.WORKSPACE); + } + + layoutBody(height: number | undefined = this.layoutCache.height, width: number | undefined = this.layoutCache.width): void { + if (height === undefined) { + return; + } + + if (width !== undefined) { + super.layoutBody(height, width); + } + + this.layoutCache.height = height; + this.layoutCache.width = width; + this._onDidLayout.fire(); + + this.listContainer.style.height = `${height}px`; + this.tree.layout(height, width); + } + + focus(): void { + super.focus(); + + if (this.isExpanded()) { + this.viewModel.focus(); + } + } + + getActions(): IAction[] { + if (!this.viewModel) { + return []; + } + + if (this.viewModel.repositories.elements.length < 2) { + return this.viewModel.getViewActions(); + } + + return [ + new SCMCollapseAction(this.viewModel), + ...this.viewModel.getViewActions() + ]; + } + + getSecondaryActions(): IAction[] { + if (!this.viewModel) { + return []; + } + + return this.viewModel.getViewSecondaryActions(); + } + + getActionViewItem(action: IAction): IActionViewItem | undefined { + if (action instanceof StatusBarAction) { + return new StatusBarActionViewItem(action); + } + + if (!(action instanceof MenuItemAction)) { + return undefined; + } + + return new ContextAwareMenuEntryActionViewItem(action, this.keybindingService, this.notificationService, this.contextMenuService); + } + + getActionsContext(): any { + if (!this.viewModel) { + return []; + } + + return this.viewModel.getViewActionsContext(); + } + + private async open(e: IOpenEvent): Promise { + if (!e.element) { + return; + } else if (isSCMRepository(e.element)) { // TODO@joao: remove + e.element.setSelected(true); + return; + } else if (isSCMResourceGroup(e.element)) { // TODO@joao: remove + const provider = e.element.provider; + const repository = this.scmService.repositories.find(r => r.provider === provider); + repository?.setSelected(true); + return; + } else if (ResourceTree.isResourceNode(e.element)) { // TODO@joao: remove + const provider = e.element.context.provider; + const repository = this.scmService.repositories.find(r => r.provider === provider); + repository?.setSelected(true); + return; + } else if (isSCMInput(e.element)) { + e.element.repository.setSelected(true); // TODO@joao: remove + + const widget = this.inputRenderer.getRenderedInputWidget(e.element); + + if (widget) { + widget.focus(); + + const selection = this.tree.getSelection(); + + if (selection.length === 1 && selection[0] === e.element) { + setTimeout(() => this.tree.setSelection([])); + } + } + + return; + } + + // ISCMResource + await e.element.open(!!e.editorOptions.preserveFocus); + + if (e.editorOptions.pinned) { + const activeEditorPane = this.editorService.activeEditorPane; + + if (activeEditorPane) { + activeEditorPane.group.pinEditor(activeEditorPane.input); + } + } + + // TODO@joao: remove + const provider = e.element.resourceGroup.provider; + const repository = this.scmService.repositories.find(r => r.provider === provider); + repository?.setSelected(true); + } + + private onListContextMenu(e: ITreeContextMenuEvent): void { + if (!e.element) { + return; + } + + const element = e.element; + let context: any = element; + let actions: IAction[] = []; + + if (isSCMRepository(element)) { + const menus = this.menus.getRepositoryMenus(element.provider); + context = element.provider; + actions = menus.getRepositoryContextActions(); + } else if (isSCMInput(element)) { + // noop + } else if (isSCMResourceGroup(element)) { + const menus = this.menus.getRepositoryMenus(element.provider); + actions = menus.getResourceGroupContextActions(element); + } else if (ResourceTree.isResourceNode(element)) { + if (element.element) { + const menus = this.menus.getRepositoryMenus(element.element.resourceGroup.provider); + actions = menus.getResourceContextActions(element.element); + } else { + const menus = this.menus.getRepositoryMenus(element.context.provider); + actions = menus.getResourceFolderContextActions(element.context); + } + } else { + const menus = this.menus.getRepositoryMenus(element.resourceGroup.provider); + actions = menus.getResourceContextActions(element); + } + + const actionRunner = new RepositoryPaneActionRunner(() => this.getSelectedResources()); + actionRunner.onDidBeforeRun(() => this.tree.domFocus()); + + this.contextMenuService.showContextMenu({ + getAnchor: () => e.anchor, + getActions: () => actions, + getActionsContext: () => context, + actionRunner + }); + } + + private getSelectedResources(): (ISCMResource | IResourceNode)[] { + return this.tree.getSelection() + .filter(r => !!r && !isSCMResourceGroup(r))! as any; + } + + shouldShowWelcome(): boolean { + return this.scmService.repositories.length === 0; + } +} + +export const scmProviderSeparatorBorderColor = registerColor('scm.providerBorder', { dark: '#454545', light: '#C8C8C8', hc: contrastBorder }, localize('scm.providerBorder', "SCM Provider separator border.")); + +registerThemingParticipant((theme, collector) => { + const inputBackgroundColor = theme.getColor(inputBackground); + if (inputBackgroundColor) { + collector.addRule(`.scm-view .scm-editor-container .monaco-editor-background, + .scm-view .scm-editor-container .monaco-editor, + .scm-view .scm-editor-container .monaco-editor .margin + { background-color: ${inputBackgroundColor} !important; }`); + } + + const inputForegroundColor = theme.getColor(inputForeground); + if (inputForegroundColor) { + collector.addRule(`.scm-view .scm-editor-container .mtk1 { color: ${inputForegroundColor}; }`); + } + + const inputBorderColor = theme.getColor(inputBorder); + if (inputBorderColor) { + collector.addRule(`.scm-view .scm-editor-container { outline: 1px solid ${inputBorderColor}; }`); + } + + const panelInputBorder = theme.getColor(PANEL_INPUT_BORDER); + if (panelInputBorder) { + collector.addRule(`.monaco-workbench .part.panel .scm-view .scm-editor-container { outline: 1px solid ${panelInputBorder}; }`); + } + + const focusBorderColor = theme.getColor(focusBorder); + if (focusBorderColor) { + collector.addRule(`.scm-view .scm-editor-container.synthetic-focus { outline: 1px solid ${focusBorderColor}; }`); + } + + const inputPlaceholderForegroundColor = theme.getColor(inputPlaceholderForeground); + if (inputPlaceholderForegroundColor) { + collector.addRule(`.scm-view .scm-editor-placeholder { color: ${inputPlaceholderForegroundColor}; }`); + } + + const inputValidationInfoBorderColor = theme.getColor(inputValidationInfoBorder); + if (inputValidationInfoBorderColor) { + collector.addRule(`.scm-view .scm-editor-container.validation-info { outline: 1px solid ${inputValidationInfoBorderColor} !important; }`); + collector.addRule(`.scm-editor-validation.validation-info { border-color: ${inputValidationInfoBorderColor}; }`); + } + + const inputValidationInfoBackgroundColor = theme.getColor(inputValidationInfoBackground); + if (inputValidationInfoBackgroundColor) { + collector.addRule(`.scm-editor-validation.validation-info { background-color: ${inputValidationInfoBackgroundColor}; }`); + } + + const inputValidationInfoForegroundColor = theme.getColor(inputValidationInfoForeground); + if (inputValidationInfoForegroundColor) { + collector.addRule(`.scm-editor-validation.validation-info { color: ${inputValidationInfoForegroundColor}; }`); + } + + const inputValidationWarningBorderColor = theme.getColor(inputValidationWarningBorder); + if (inputValidationWarningBorderColor) { + collector.addRule(`.scm-view .scm-editor-container.validation-warning { outline: 1px solid ${inputValidationWarningBorderColor} !important; }`); + collector.addRule(`.scm-editor-validation.validation-warning { border-color: ${inputValidationWarningBorderColor}; }`); + } + + const inputValidationWarningBackgroundColor = theme.getColor(inputValidationWarningBackground); + if (inputValidationWarningBackgroundColor) { + collector.addRule(`.scm-editor-validation.validation-warning { background-color: ${inputValidationWarningBackgroundColor}; }`); + } + + const inputValidationWarningForegroundColor = theme.getColor(inputValidationWarningForeground); + if (inputValidationWarningForegroundColor) { + collector.addRule(`.scm-editor-validation.validation-warning { color: ${inputValidationWarningForegroundColor}; }`); + } + + const inputValidationErrorBorderColor = theme.getColor(inputValidationErrorBorder); + if (inputValidationErrorBorderColor) { + collector.addRule(`.scm-view .scm-editor-container.validation-error { outline: 1px solid ${inputValidationErrorBorderColor} !important; }`); + collector.addRule(`.scm-editor-validation.validation-error { border-color: ${inputValidationErrorBorderColor}; }`); + } + + const inputValidationErrorBackgroundColor = theme.getColor(inputValidationErrorBackground); + if (inputValidationErrorBackgroundColor) { + collector.addRule(`.scm-editor-validation.validation-error { background-color: ${inputValidationErrorBackgroundColor}; }`); + } + + const inputValidationErrorForegroundColor = theme.getColor(inputValidationErrorForeground); + if (inputValidationErrorForegroundColor) { + collector.addRule(`.scm-editor-validation.validation-error { color: ${inputValidationErrorForegroundColor}; }`); + } + + const repositoryStatusActionsBorderColor = theme.getColor(SIDE_BAR_BORDER); + if (repositoryStatusActionsBorderColor) { + collector.addRule(`.scm-view .scm-provider > .status > .monaco-action-bar > .actions-container { border-color: ${repositoryStatusActionsBorderColor}; }`); + } +}); diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPaneContainer.ts b/src/vs/workbench/contrib/scm/browser/scmViewPaneContainer.ts new file mode 100644 index 00000000000..b1efece39ac --- /dev/null +++ b/src/vs/workbench/contrib/scm/browser/scmViewPaneContainer.ts @@ -0,0 +1,64 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/scm'; +import { localize } from 'vs/nls'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { VIEWLET_ID, ISCMService } from 'vs/workbench/contrib/scm/common/scm'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { SCMRepositoryMenus } from './menus'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IViewDescriptorService } from 'vs/workbench/common/views'; +import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; +import { addClass } from 'vs/base/browser/dom'; + +export class SCMViewPaneContainer extends ViewPaneContainer { + + constructor( + @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, + @ITelemetryService telemetryService: ITelemetryService, + @ISCMService protected scmService: ISCMService, + @IInstantiationService protected instantiationService: IInstantiationService, + @IContextViewService protected contextViewService: IContextViewService, + @IKeybindingService protected keybindingService: IKeybindingService, + @INotificationService protected notificationService: INotificationService, + @IContextMenuService protected contextMenuService: IContextMenuService, + @IThemeService protected themeService: IThemeService, + @ICommandService protected commandService: ICommandService, + @IStorageService storageService: IStorageService, + @IConfigurationService configurationService: IConfigurationService, + @IExtensionService extensionService: IExtensionService, + @IWorkspaceContextService protected contextService: IWorkspaceContextService, + @IViewDescriptorService viewDescriptorService: IViewDescriptorService + ) { + super(VIEWLET_ID, { mergeViewWithContainerWhenSingleView: true }, instantiationService, configurationService, layoutService, contextMenuService, telemetryService, extensionService, themeService, storageService, contextService, viewDescriptorService); + + const menus = instantiationService.createInstance(SCMRepositoryMenus, undefined); + this._register(menus); + this._register(menus.onDidChangeTitle(this.updateTitleArea, this)); + } + + create(parent: HTMLElement): void { + super.create(parent); + addClass(parent, 'scm-viewlet'); + } + + getOptimalWidth(): number { + return 400; + } + + getTitle(): string { + return localize('source control', "Source Control"); + } +} diff --git a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts deleted file mode 100644 index 30b7511a215..00000000000 --- a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts +++ /dev/null @@ -1,313 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import 'vs/css!./media/scmViewlet'; -import { localize } from 'vs/nls'; -import { Event, Emitter } from 'vs/base/common/event'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { VIEWLET_ID, ISCMService, ISCMRepository } from 'vs/workbench/contrib/scm/common/scm'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { MenuItemAction } from 'vs/platform/actions/common/actions'; -import { IAction, IActionViewItem } from 'vs/base/common/actions'; -import { ContextAwareMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { SCMMenus } from './menus'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IStorageService } from 'vs/platform/storage/common/storage'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IViewsRegistry, Extensions, IViewDescriptorService, IViewDescriptor, IAddedViewDescriptorRef, IViewDescriptorRef } from 'vs/workbench/common/views'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { RepositoryPane, RepositoryViewDescriptor } from 'vs/workbench/contrib/scm/browser/repositoryPane'; -import { MainPaneDescriptor, MainPane, IViewModel } from 'vs/workbench/contrib/scm/browser/mainPane'; -import { ViewPaneContainer, IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer'; -import { debounce } from 'vs/base/common/decorators'; -import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { addClass } from 'vs/base/browser/dom'; -import { Codicon } from 'vs/base/common/codicons'; - -export interface ISpliceEvent { - index: number; - deleteCount: number; - elements: T[]; -} - -export class EmptyPane extends ViewPane { - - static readonly ID = 'workbench.scm'; - static readonly TITLE = localize('scm', "Source Control"); - - constructor( - options: IViewPaneOptions, - @IKeybindingService keybindingService: IKeybindingService, - @IContextMenuService contextMenuService: IContextMenuService, - @IConfigurationService configurationService: IConfigurationService, - @IContextKeyService contextKeyService: IContextKeyService, - @IViewDescriptorService viewDescriptorService: IViewDescriptorService, - @IInstantiationService instantiationService: IInstantiationService, - @IOpenerService openerService: IOpenerService, - @IThemeService themeService: IThemeService, - @ITelemetryService telemetryService: ITelemetryService, - ) { - super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); - } - - shouldShowWelcome(): boolean { - return true; - } -} - -export class EmptyPaneDescriptor implements IViewDescriptor { - readonly id = EmptyPane.ID; - readonly name = EmptyPane.TITLE; - readonly containerIcon = Codicon.sourceControl.classNames; - readonly ctorDescriptor = new SyncDescriptor(EmptyPane); - readonly canToggleVisibility = true; - readonly hideByDefault = false; - readonly order = -1000; - readonly workspace = true; - readonly when = ContextKeyExpr.equals('scm.providerCount', 0); -} - -export class SCMViewPaneContainer extends ViewPaneContainer implements IViewModel { - - private menus: SCMMenus; - private _repositories: ISCMRepository[] = []; - - private repositoryCountKey: IContextKey; - private viewDescriptors: RepositoryViewDescriptor[] = []; - - private readonly _onDidSplice = new Emitter>(); - readonly onDidSplice: Event> = this._onDidSplice.event; - - private _height: number | undefined = undefined; - get height(): number | undefined { return this._height; } - - get repositories(): ISCMRepository[] { - return this._repositories; - } - - get visibleRepositories(): ISCMRepository[] { - return this.panes.filter(pane => pane instanceof RepositoryPane) - .map(pane => (pane as RepositoryPane).repository); - } - - get onDidChangeVisibleRepositories(): Event { - const modificationEvent = Event.debounce(Event.any(this.viewContainerModel.onDidAddVisibleViewDescriptors, this.viewContainerModel.onDidRemoveVisibleViewDescriptors), () => null, 0); - return Event.map(modificationEvent, () => this.visibleRepositories); - } - - constructor( - @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, - @ITelemetryService telemetryService: ITelemetryService, - @ISCMService protected scmService: ISCMService, - @IInstantiationService protected instantiationService: IInstantiationService, - @IContextViewService protected contextViewService: IContextViewService, - @IKeybindingService protected keybindingService: IKeybindingService, - @INotificationService protected notificationService: INotificationService, - @IContextMenuService protected contextMenuService: IContextMenuService, - @IThemeService protected themeService: IThemeService, - @ICommandService protected commandService: ICommandService, - @IStorageService storageService: IStorageService, - @IConfigurationService configurationService: IConfigurationService, - @IExtensionService extensionService: IExtensionService, - @IWorkspaceContextService protected contextService: IWorkspaceContextService, - @IContextKeyService contextKeyService: IContextKeyService, - @IViewDescriptorService viewDescriptorService: IViewDescriptorService - ) { - super(VIEWLET_ID, { mergeViewWithContainerWhenSingleView: true }, instantiationService, configurationService, layoutService, contextMenuService, telemetryService, extensionService, themeService, storageService, contextService, viewDescriptorService); - - this.menus = instantiationService.createInstance(SCMMenus, undefined); - this._register(this.menus.onDidChangeTitle(this.updateTitleArea, this)); - - const viewsRegistry = Registry.as(Extensions.ViewsRegistry); - - viewsRegistry.registerViewWelcomeContent(EmptyPane.ID, { - content: localize('no open repo', "No source control providers registered."), - when: 'default' - }); - - viewsRegistry.registerViews([new EmptyPaneDescriptor()], this.viewContainer); - viewsRegistry.registerViews([new MainPaneDescriptor(this)], this.viewContainer); - - this._register(configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('scm.alwaysShowProviders') && configurationService.getValue('scm.alwaysShowProviders')) { - this.viewContainerModel.setVisible(MainPane.ID, true); - } - })); - - this.repositoryCountKey = contextKeyService.createKey('scm.providerCount', 0); - - this._register(this.viewContainerModel.onDidAddVisibleViewDescriptors(this.onDidShowView, this)); - this._register(this.viewContainerModel.onDidRemoveVisibleViewDescriptors(this.onDidHideView, this)); - } - - create(parent: HTMLElement): void { - super.create(parent); - addClass(parent, 'scm-viewlet'); - this._register(this.scmService.onDidAddRepository(this.onDidAddRepository, this)); - this._register(this.scmService.onDidRemoveRepository(this.onDidRemoveRepository, this)); - this.scmService.repositories.forEach(r => this.onDidAddRepository(r)); - } - - private onDidAddRepository(repository: ISCMRepository): void { - const index = this._repositories.length; - this._repositories.push(repository); - - const viewDescriptor = new RepositoryViewDescriptor(repository, false); - Registry.as(Extensions.ViewsRegistry).registerViews([viewDescriptor], this.viewContainer); - this.viewDescriptors.push(viewDescriptor); - - this._onDidSplice.fire({ index, deleteCount: 0, elements: [repository] }); - this.updateTitleArea(); - - this.onDidChangeRepositories(); - } - - private onDidRemoveRepository(repository: ISCMRepository): void { - const index = this._repositories.indexOf(repository); - - if (index === -1) { - return; - } - - Registry.as(Extensions.ViewsRegistry).deregisterViews([this.viewDescriptors[index]], this.viewContainer); - - this._repositories.splice(index, 1); - this.viewDescriptors.splice(index, 1); - - this._onDidSplice.fire({ index, deleteCount: 1, elements: [] }); - this.updateTitleArea(); - - this.onDidChangeRepositories(); - } - - private onDidChangeRepositories(): void { - this.repositoryCountKey.set(this.repositories.length); - } - - private onDidShowView(e: IAddedViewDescriptorRef[]): void { - for (const ref of e) { - if (ref.viewDescriptor instanceof RepositoryViewDescriptor) { - ref.viewDescriptor.repository.setSelected(true); - } - } - } - - private onDidHideView(e: IViewDescriptorRef[]): void { - for (const ref of e) { - if (ref.viewDescriptor instanceof RepositoryViewDescriptor) { - ref.viewDescriptor.repository.setSelected(false); - } - } - - this.afterOnDidHideView(); - } - - @debounce(0) - private afterOnDidHideView(): void { - if (this.repositoryCountKey.get()! > 0 && this.viewDescriptors.every(d => !this.viewContainerModel.isVisible(d.id))) { - this.viewContainerModel.setVisible(this.viewDescriptors[0].id, true); - } - } - - focus(): void { - const repository = this.visibleRepositories[0]; - - if (repository) { - const pane = this.panes - .filter(pane => pane instanceof RepositoryPane && pane.repository === repository)[0] as RepositoryPane | undefined; - - if (pane) { - pane.focus(); - } else { - super.focus(); - } - } else { - super.focus(); - } - } - - getOptimalWidth(): number { - return 400; - } - - getTitle(): string { - const title = localize('source control', "Source Control"); - - if (this.visibleRepositories.length === 1) { - const [repository] = this.repositories; - return localize('viewletTitle', "{0}: {1}", title, repository.provider.label); - } else { - return title; - } - } - - getActionViewItem(action: IAction): IActionViewItem | undefined { - if (!(action instanceof MenuItemAction)) { - return undefined; - } - - return new ContextAwareMenuEntryActionViewItem(action, this.keybindingService, this.notificationService, this.contextMenuService); - } - - getActions(): IAction[] { - if (this.repositories.length > 0) { - return super.getActions(); - } - - return this.menus.getTitleActions(); - } - - getSecondaryActions(): IAction[] { - if (this.repositories.length > 0) { - return super.getSecondaryActions(); - } - - return this.menus.getTitleSecondaryActions(); - } - - getActionsContext(): any { - if (this.visibleRepositories.length === 1) { - return this.repositories[0].provider; - } - } - - setVisibleRepositories(repositories: ISCMRepository[]): void { - const visibleViewDescriptors = this.viewContainerModel.visibleViewDescriptors; - - const toSetVisible = this.viewContainerModel.activeViewDescriptors - .filter((d): d is RepositoryViewDescriptor => d instanceof RepositoryViewDescriptor && repositories.indexOf(d.repository) > -1 && visibleViewDescriptors.indexOf(d) === -1); - - const toSetInvisible = visibleViewDescriptors - .filter((d): d is RepositoryViewDescriptor => d instanceof RepositoryViewDescriptor && repositories.indexOf(d.repository) === -1); - - let size: number | undefined; - const oneToOne = toSetVisible.length === 1 && toSetInvisible.length === 1; - - for (const viewDescriptor of toSetInvisible) { - if (oneToOne) { - const pane = this.panes.filter(pane => pane.id === viewDescriptor.id)[0]; - - if (pane) { - size = this.getPaneSize(pane); - } - } - - this.viewContainerModel.setVisible(viewDescriptor.id, false); - } - - for (const viewDescriptor of toSetVisible) { - this.viewContainerModel.setVisible(viewDescriptor.id, true, size); - } - } -} diff --git a/src/vs/workbench/contrib/scm/browser/util.ts b/src/vs/workbench/contrib/scm/browser/util.ts index 97a4c1eb80a..08a7e69ce3a 100644 --- a/src/vs/workbench/contrib/scm/browser/util.ts +++ b/src/vs/workbench/contrib/scm/browser/util.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ISCMResource, ISCMRepository, ISCMResourceGroup } from 'vs/workbench/contrib/scm/common/scm'; +import { ISCMResource, ISCMRepository, ISCMResourceGroup, ISCMInput } from 'vs/workbench/contrib/scm/common/scm'; import { IMenu } from 'vs/platform/actions/common/actions'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { IDisposable, Disposable, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -15,6 +15,10 @@ export function isSCMRepository(element: any): element is ISCMRepository { return !!(element as ISCMRepository).provider && typeof (element as ISCMRepository).setSelected === 'function'; } +export function isSCMInput(element: any): element is ISCMInput { + return !!(element as ISCMInput).validateInput && typeof (element as ISCMInput).value === 'string'; +} + export function isSCMResourceGroup(element: any): element is ISCMResourceGroup { return !!(element as ISCMResourceGroup).provider && !!(element as ISCMResourceGroup).elements; } @@ -23,31 +27,42 @@ export function isSCMResource(element: any): element is ISCMResource { return !!(element as ISCMResource).sourceUri && isSCMResourceGroup((element as ISCMResource).resourceGroup); } -export function connectPrimaryMenuToInlineActionBar(menu: IMenu, actionBar: ActionBar): IDisposable { +const compareActions = (a: IAction, b: IAction) => a.id === b.id; + +export function connectPrimaryMenu(menu: IMenu, callback: (primary: IAction[], secondary: IAction[]) => void, isPrimaryGroup?: (group: string) => boolean): IDisposable { let cachedDisposable: IDisposable = Disposable.None; let cachedPrimary: IAction[] = []; + let cachedSecondary: IAction[] = []; const updateActions = () => { const primary: IAction[] = []; const secondary: IAction[] = []; - const disposable = createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, { primary, secondary }, g => /^inline/.test(g)); + const disposable = createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, { primary, secondary }, isPrimaryGroup); - if (equals(cachedPrimary, primary, (a, b) => a.id === b.id)) { + if (equals(cachedPrimary, primary, compareActions) && equals(cachedSecondary, secondary, compareActions)) { disposable.dispose(); return; } cachedDisposable = disposable; cachedPrimary = primary; + cachedSecondary = secondary; - actionBar.clear(); - actionBar.push(primary, { icon: true, label: false }); + callback(primary, secondary); }; updateActions(); - return combinedDisposable(menu.onDidChange(updateActions), toDisposable(() => { - cachedDisposable.dispose(); - })); + return combinedDisposable( + menu.onDidChange(updateActions), + toDisposable(() => cachedDisposable.dispose()) + ); +} + +export function connectPrimaryMenuToInlineActionBar(menu: IMenu, actionBar: ActionBar): IDisposable { + return connectPrimaryMenu(menu, (primary) => { + actionBar.clear(); + actionBar.push(primary, { icon: true, label: false }); + }, g => /^inline/.test(g)); } diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index d6fd58f1519..cd96a61d4de 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -11,6 +11,7 @@ import { Command } from 'vs/editor/common/modes'; import { ISequence } from 'vs/base/common/sequence'; export const VIEWLET_ID = 'workbench.view.scm'; +export const VIEW_PANE_ID = 'workbench.scm'; export interface IBaselineResourceProvider { getBaselineResource(resource: URI): Promise; @@ -79,6 +80,8 @@ export interface IInputValidator { } export interface ISCMInput { + readonly repository: ISCMRepository; + value: string; readonly onDidChange: Event; @@ -93,12 +96,10 @@ export interface ISCMInput { } export interface ISCMRepository extends IDisposable { - readonly onDidFocus: Event; readonly selected: boolean; readonly onDidChangeSelection: Event; readonly provider: ISCMProvider; readonly input: ISCMInput; - focus(): void; setSelected(selected: boolean): void; } @@ -107,10 +108,7 @@ export interface ISCMService { readonly _serviceBrand: undefined; readonly onDidAddRepository: Event; readonly onDidRemoveRepository: Event; - readonly repositories: ISCMRepository[]; - readonly selectedRepositories: ISCMRepository[]; - readonly onDidChangeSelectedRepositories: Event; registerSCMProvider(provider: ISCMProvider): ISCMRepository; } diff --git a/src/vs/workbench/contrib/scm/common/scmService.ts b/src/vs/workbench/contrib/scm/common/scmService.ts index d73a4639494..fac8be966b7 100644 --- a/src/vs/workbench/contrib/scm/common/scmService.ts +++ b/src/vs/workbench/contrib/scm/common/scmService.ts @@ -7,7 +7,6 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; import { ISCMService, ISCMProvider, ISCMInput, ISCMRepository, IInputValidator } from './scm'; import { ILogService } from 'vs/platform/log/common/log'; -import { equals } from 'vs/base/common/arrays'; class SCMInput implements ISCMInput { @@ -70,13 +69,12 @@ class SCMInput implements ISCMInput { private readonly _onDidChangeValidateInput = new Emitter(); readonly onDidChangeValidateInput: Event = this._onDidChangeValidateInput.event; + + constructor(readonly repository: ISCMRepository) { } } class SCMRepository implements ISCMRepository { - private readonly _onDidFocus = new Emitter(); - readonly onDidFocus: Event = this._onDidFocus.event; - private _selected = false; get selected(): boolean { return this._selected; @@ -85,17 +83,13 @@ class SCMRepository implements ISCMRepository { private readonly _onDidChangeSelection = new Emitter(); readonly onDidChangeSelection: Event = this._onDidChangeSelection.event; - readonly input: ISCMInput = new SCMInput(); + readonly input: ISCMInput = new SCMInput(this); constructor( public readonly provider: ISCMProvider, private disposable: IDisposable ) { } - focus(): void { - this._onDidFocus.fire(); - } - setSelected(selected: boolean): void { if (this._selected === selected) { return; @@ -119,11 +113,10 @@ export class SCMService implements ISCMService { private _repositories: ISCMRepository[] = []; get repositories(): ISCMRepository[] { return [...this._repositories]; } - private _selectedRepositories: ISCMRepository[] = []; - get selectedRepositories(): ISCMRepository[] { return [...this._selectedRepositories]; } + private _selectedRepository: ISCMRepository | undefined; - private readonly _onDidChangeSelectedRepositories = new Emitter(); - readonly onDidChangeSelectedRepositories: Event = this._onDidChangeSelectedRepositories.event; + private readonly _onDidSelectRepository = new Emitter(); + readonly onDidSelectRepository: Event = this._onDidSelectRepository.event; private readonly _onDidAddProvider = new Emitter(); readonly onDidAddRepository: Event = this._onDidAddProvider.event; @@ -153,26 +146,31 @@ export class SCMService implements ISCMService { this._providerIds.delete(provider.id); this._repositories.splice(index, 1); this._onDidRemoveProvider.fire(repository); - this.onDidChangeSelection(); + + if (this._selectedRepository === repository) { + this.select(this._repositories[0]); + } }); const repository = new SCMRepository(provider, disposable); - const selectedDisposable = repository.onDidChangeSelection(this.onDidChangeSelection, this); + const selectedDisposable = Event.map(Event.filter(repository.onDidChangeSelection, selected => selected), _ => repository)(this.select, this); this._repositories.push(repository); this._onDidAddProvider.fire(repository); + if (!this._selectedRepository) { + repository.setSelected(true); + } + return repository; } - private onDidChangeSelection(): void { - const selectedRepositories = this._repositories.filter(r => r.selected); - - if (equals(this._selectedRepositories, selectedRepositories)) { - return; + private select(repository: ISCMRepository | undefined): void { + if (this._selectedRepository) { + this._selectedRepository.setSelected(false); } - this._selectedRepositories = this._repositories.filter(r => r.selected); - this._onDidChangeSelectedRepositories.fire(this.selectedRepositories); + this._selectedRepository = repository; + this._onDidSelectRepository.fire(this._selectedRepository); } } diff --git a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts index c386be60bba..a749425a97f 100644 --- a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts +++ b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts @@ -643,7 +643,7 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider this.toggleCollapseAction.onTreeCollapseStateChange()) )); - const resourceNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: true, openOnSelection: false })); - this._register(Event.debounce(resourceNavigator.onDidOpenResource, (last, event) => event, 75, true)(options => { + this._register(Event.debounce(this.tree.onDidOpen, (last, event) => event, 75, true)(options => { if (options.element instanceof Match) { const selectedMatch: Match = options.element; if (this.currentSelectedFileMatch) { diff --git a/src/vs/workbench/contrib/search/common/search.ts b/src/vs/workbench/contrib/search/common/search.ts index b63a4223a13..54a624656d2 100644 --- a/src/vs/workbench/contrib/search/common/search.ts +++ b/src/vs/workbench/contrib/search/common/search.ts @@ -96,7 +96,7 @@ export function getOutOfWorkspaceEditorResources(accessor: ServicesAccessor): UR const fileService = accessor.get(IFileService); const resources = editorService.editors - .map(editor => toResource(editor, { supportSideBySide: SideBySideEditor.MASTER })) + .map(editor => toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY })) .filter(resource => !!resource && !contextService.isInsideWorkspace(resource) && fileService.canHandleResource(resource)); return resources as URI[]; diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts index fd07335d2b2..85310f85300 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts @@ -5,7 +5,7 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import * as objects from 'vs/base/common/objects'; -import { endsWith } from 'vs/base/common/strings'; +import { extname } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { Range } from 'vs/editor/common/core/range'; @@ -30,7 +30,7 @@ import * as SearchConstants from 'vs/workbench/contrib/search/common/constants'; import * as SearchEditorConstants from 'vs/workbench/contrib/searchEditor/browser/constants'; import { SearchEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditor'; import { createEditorFromSearchResult, modifySearchEditorContextLinesCommand, openNewSearchEditor, selectAllSearchEditorMatchesCommand, toggleSearchEditorCaseSensitiveCommand, toggleSearchEditorContextLinesCommand, toggleSearchEditorRegexCommand, toggleSearchEditorWholeWordCommand } from 'vs/workbench/contrib/searchEditor/browser/searchEditorActions'; -import { getOrMakeSearchEditorInput, SearchConfiguration, SearchEditorInput } from 'vs/workbench/contrib/searchEditor/browser/searchEditorInput'; +import { getOrMakeSearchEditorInput, SearchConfiguration, SearchEditorInput, SEARCH_EDITOR_EXT } from 'vs/workbench/contrib/searchEditor/browser/searchEditorInput'; import { parseSavedSearchEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -79,11 +79,11 @@ class SearchEditorContribution implements IWorkbenchContribution { const resource = editor.resource; if (!resource) { return undefined; } - if (!endsWith(resource.path, '.code-search')) { + if (extname(resource) !== SEARCH_EDITOR_EXT) { return undefined; } - if (group.isOpened(editor) && editor instanceof SearchEditorInput) { + if (editor instanceof SearchEditorInput && group.isOpened(editor)) { return undefined; } diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts index 3d1f4407810..cb5f5c99735 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts @@ -43,7 +43,7 @@ export type SearchConfiguration = { showIncludesExcludes: boolean, }; -const SEARCH_EDITOR_EXT = '.code-search'; +export const SEARCH_EDITOR_EXT = '.code-search'; export class SearchEditorInput extends EditorInput { static readonly ID: string = 'workbench.editorinputs.searchEditorInput'; @@ -110,7 +110,7 @@ export class SearchEditorInput extends EditorInput { const input = this; const workingCopyAdapter = new class implements IWorkingCopy { - readonly resource = input.backingUri ?? input.modelUri; + readonly resource = input.modelUri; get name() { return input.getName(); } readonly capabilities = input.isUntitled() ? WorkingCopyCapabilities.Untitled : 0; readonly onDidChangeDirty = input.onDidChangeDirty; @@ -213,7 +213,7 @@ export class SearchEditorInput extends EditorInput { return !this.backingUri; } - move(group: GroupIdentifier, target: URI): IMoveResult | undefined { + rename(group: GroupIdentifier, target: URI): IMoveResult | undefined { if (this._cachedModel && extname(target) === SEARCH_EDITOR_EXT) { return { editor: this.instantiationService.invokeFunction(getOrMakeSearchEditorInput, { config: this.config, text: this._cachedModel.getValue(), backingUri: target }) @@ -280,7 +280,7 @@ export class SearchEditorInput extends EditorInput { const remoteAuthority = this.environmentService.configuration.remoteAuthority; const schemeFilter = remoteAuthority ? network.Schemas.vscodeRemote : network.Schemas.file; - return joinPath(this.fileDialogService.defaultFilePath(schemeFilter) || (await this.pathService.userHome), searchFileName); + return joinPath(this.fileDialogService.defaultFilePath(schemeFilter) || (await this.pathService.userHome()), searchFileName); } } @@ -308,7 +308,7 @@ export const getOrMakeSearchEditorInput = ( let config = { ...defaultConfig, ...priorConfig, ...existingData.config }; if (defaultNumberOfContextLines !== null && defaultNumberOfContextLines !== undefined) { - config.contextLines = defaultNumberOfContextLines; + config.contextLines = existingData.config.contextLines ?? defaultNumberOfContextLines; } if (existingData.text) { diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts index 038ddda4672..fd868994e08 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts @@ -34,7 +34,7 @@ export class SearchEditorModel { @IModeService private readonly modeService: IModeService) { this.onModelResolved = new Promise(resolve => this.resolveContents = resolve); this.onModelResolved.then(model => this.cachedContentsModel = model); - this.ongoingResolve = backupService.resolve(existingData.backingUri ?? modelUri) + this.ongoingResolve = backupService.resolve(modelUri) .then(backup => modelService.getModel(modelUri) ?? (backup ? modelService.createModel(backup.value, modeService.create('search-result'), modelUri) : undefined)) .then(model => { if (model) { this.resolveContents(model); } }); } diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 741e8b3d45a..d73ccf28dea 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -81,6 +81,7 @@ import { find } from 'vs/base/common/arrays'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQuickPick, QUICKOPEN_SKIP_CONFIG } from 'vs/workbench/contrib/tasks/browser/taskQuickPick'; +import { ILogService } from 'vs/platform/log/common/log'; const QUICKOPEN_HISTORY_LIMIT_CONFIG = 'task.quickOpen.history'; const PROBLEM_MATCHER_NEVER_CONFIG = 'task.problemMatchers.neverPrompt'; @@ -255,7 +256,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer @IPathService private readonly pathService: IPathService, @ITextModelService private readonly textModelResolverService: ITextModelService, @IPreferencesService private readonly preferencesService: IPreferencesService, - @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService + @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, + @ILogService private readonly logService: ILogService ) { super(); @@ -1062,9 +1064,9 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer const eol = model.getEOL(); const edits = format(JSON.stringify(task), undefined, { eol, tabSize, insertSpaces }); let stringified = applyEdits(JSON.stringify(task), edits); - const regex = new RegExp(eol + '\\t', 'g'); - stringified = stringified.replace(regex, eol + '\t\t\t'); - const twoTabs = '\t\t'; + const regex = new RegExp(eol + (insertSpaces ? strings.repeat(' ', tabSize) : '\\t'), 'g'); + stringified = stringified.replace(regex, eol + (insertSpaces ? strings.repeat(' ', tabSize * 3) : '\t\t\t')); + const twoTabs = insertSpaces ? strings.repeat(' ', tabSize * 2) : '\t\t'; stringValue = twoTabs + stringified.slice(0, stringified.length - 1) + twoTabs + stringified.slice(stringified.length - 1); } finally { if (reference) { @@ -1087,7 +1089,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer const contentValue = content.toString(); let stringValue: string | undefined; if (configIndex !== -1) { - const json: TaskConfig.ExternalTaskRunnerConfiguration = JSON.parse(contentValue); + const json: TaskConfig.ExternalTaskRunnerConfiguration = this.configurationService.getValue('tasks', { resource }); if (json.tasks && (json.tasks.length > configIndex)) { stringValue = await this.formatTaskForJson(resource, json.tasks[configIndex]); } @@ -1547,7 +1549,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer this.modelService, this.configurationResolverService, this.telemetryService, this.contextService, this.environmentService, AbstractTaskService.OutputChannelId, this.fileService, this.terminalInstanceService, - this.pathService, this.viewDescriptorService, + this.pathService, this.viewDescriptorService, this.logService, (workspaceFolder: IWorkspaceFolder) => { if (!workspaceFolder) { return undefined; @@ -1872,7 +1874,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } } if (isAffected) { - this._outputChannel.append(nls.localize('TaskSystem.invalidTaskJsonOther', 'Error: The content of the tasks json in {0} has syntax errors. Please correct them before executing a task.\n', location)); + this._outputChannel.append(nls.localize({ key: 'TaskSystem.invalidTaskJsonOther', comment: ['Message notifies of an error in one of several places there is tasks related json, not necessarily in a file named tasks.json'] }, 'Error: The content of the tasks json in {0} has syntax errors. Please correct them before executing a task.\n', location)); this.showOutput(); return { config, hasParseErrors: true }; } diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 4c9521dc7f1..14b7d7bdd0c 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -46,6 +46,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { env as processEnv, cwd as processCwd } from 'vs/base/common/process'; import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { ILogService } from 'vs/platform/log/common/log'; interface TerminalData { terminal: ITerminalInstance; @@ -202,6 +203,7 @@ export class TerminalTaskSystem implements ITaskSystem { private terminalInstanceService: ITerminalInstanceService, private pathService: IPathService, private viewDescriptorService: IViewDescriptorService, + private logService: ILogService, taskSystemInfoResolver: TaskSystemInfoResolver, ) { @@ -722,7 +724,7 @@ export class TerminalTaskSystem implements ITaskSystem { processStartedSignaled = true; } }, (_error) => { - // The process never got ready. Need to think how to handle this. + this.logService.error('Task terminal process never got ready'); }); this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Start, task, terminal.id)); let skipLine: boolean = (!!task.command.presentation && task.command.presentation.echo); @@ -966,7 +968,7 @@ export class TerminalTaskSystem implements ITaskSystem { windowsShellArgs = true; let basename = path.basename(shellLaunchConfig.executable!).toLowerCase(); // If we don't have a cwd, then the terminal uses the home dir. - const userHome = await this.pathService.userHome; + const userHome = await this.pathService.userHome(); if (basename === 'cmd.exe' && ((options.cwd && isUNC(options.cwd)) || (!options.cwd && isUNC(userHome.fsPath)))) { return undefined; } diff --git a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts index 4ff57ccec89..1c408ea3f8a 100644 --- a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts @@ -2024,7 +2024,7 @@ class ConfigurationParser { } context.problemReporter.error( nls.localize( - 'TaskParse.noOsSpecificGlobalTasks', + { key: 'TaskParse.noOsSpecificGlobalTasks', comment: ['\"Task version 2.0.0\" refers to the 2.0.0 version of the task system. The \"version 2.0.0\" is not localizable as it is a json key and value.'] }, 'Task version 2.0.0 doesn\'t support global OS specific tasks. Convert them to a task with a OS specific command. Affected tasks are:\n{0}', taskContent.join('\n')) ); } diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkProviderAdapter.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkProviderAdapter.ts new file mode 100644 index 00000000000..40478f7f7f9 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkProviderAdapter.ts @@ -0,0 +1,71 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Terminal, IViewportRange, IBufferLine } from 'xterm'; +import { getXtermLineContent, convertLinkRangeToBuffer } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; +import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { TerminalBaseLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider'; +import { ITerminalExternalLinkProvider, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { XtermLinkMatcherHandler } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; + +/** + * An adapter to convert a simple external link provider into an internal link provider that + * manages link lifecycle, hovers, etc. and gets registered in xterm.js. + */ +export class TerminalExternalLinkProviderAdapter extends TerminalBaseLinkProvider { + + constructor( + private readonly _xterm: Terminal, + private readonly _instance: ITerminalInstance, + private readonly _externalLinkProvider: ITerminalExternalLinkProvider, + private readonly _wrapLinkHandler: (handler: (event: MouseEvent | undefined, link: string) => void) => XtermLinkMatcherHandler, + private readonly _tooltipCallback: (link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) => void, + @IInstantiationService private readonly _instantiationService: IInstantiationService + ) { + super(); + } + + protected async _provideLinks(y: number): Promise { + let startLine = y - 1; + let endLine = startLine; + + const lines: IBufferLine[] = [ + this._xterm.buffer.active.getLine(startLine)! + ]; + + while (this._xterm.buffer.active.getLine(startLine)?.isWrapped) { + lines.unshift(this._xterm.buffer.active.getLine(startLine - 1)!); + startLine--; + } + + while (this._xterm.buffer.active.getLine(endLine + 1)?.isWrapped) { + lines.push(this._xterm.buffer.active.getLine(endLine + 1)!); + endLine++; + } + + const lineContent = getXtermLineContent(this._xterm.buffer.active, startLine, endLine, this._xterm.cols); + if (lineContent.trim().length === 0) { + return []; + } + + const externalLinks = await this._externalLinkProvider.provideLinks(this._instance, lineContent); + if (!externalLinks) { + return []; + } + + return externalLinks.map(link => { + const bufferRange = convertLinkRangeToBuffer(lines, this._xterm.cols, { + startColumn: link.startIndex + 1, + startLineNumber: 1, + endColumn: link.startIndex + link.length + 1, + endLineNumber: 1 + }, startLine); + const matchingText = lineContent.substr(link.startIndex, link.length) || ''; + const activateLink = this._wrapLinkHandler((_, text) => link.activate(text)); + return this._instantiationService.createInstance(TerminalLink, bufferRange, matchingText, this._xterm.buffer.active.viewportY, activateLink, this._tooltipCallback, true, link.label); + }); + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts index 2754618238f..d0d122fae55 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts @@ -68,20 +68,24 @@ export class TerminalLink extends DisposableStore implements ILink { } })); - const timeout = this._configurationService.getValue('editor.hover.delay'); - this._tooltipScheduler = new RunOnceScheduler(() => { - this._tooltipCallback( - this, - convertBufferRangeToViewport(this.range, this._viewportY), - this._isHighConfidenceLink ? () => this._enableDecorations() : undefined, - this._isHighConfidenceLink ? () => this._disableDecorations() : undefined - ); - // Clear out scheduler until next hover event - this._tooltipScheduler?.dispose(); - this._tooltipScheduler = undefined; - }, timeout); - this.add(this._tooltipScheduler); - this._tooltipScheduler.schedule(); + // Only show the tooltip and highlight for high confidence links (not word/search workspace + // links). Feedback was that this makes using the terminal overly noisy. + if (this._isHighConfidenceLink) { + const timeout = this._configurationService.getValue('editor.hover.delay'); + this._tooltipScheduler = new RunOnceScheduler(() => { + this._tooltipCallback( + this, + convertBufferRangeToViewport(this.range, this._viewportY), + this._isHighConfidenceLink ? () => this._enableDecorations() : undefined, + this._isHighConfidenceLink ? () => this._disableDecorations() : undefined + ); + // Clear out scheduler until next hover event + this._tooltipScheduler?.dispose(); + this._tooltipScheduler = undefined; + }, timeout); + this.add(this._tooltipScheduler); + this._tooltipScheduler.schedule(); + } const origin = { x: event.pageX, y: event.pageY }; this._hoverListeners = new DisposableStore(); diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts index 208b05dbed9..64434e13548 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { URI } from 'vs/base/common/uri'; -import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -13,10 +13,10 @@ import { ITerminalProcessManager, ITerminalConfiguration, TERMINAL_CONFIG_SECTIO import { ITextEditorSelection } from 'vs/platform/editor/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IFileService } from 'vs/platform/files/common/files'; -import { Terminal, IViewportRange } from 'xterm'; +import { Terminal, IViewportRange, ILinkProvider } from 'xterm'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { posix, win32 } from 'vs/base/common/path'; -import { ITerminalBeforeHandleLinkEvent, LINK_INTERCEPT_THRESHOLD } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ITerminalBeforeHandleLinkEvent, LINK_INTERCEPT_THRESHOLD, ITerminalExternalLinkProvider, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { OperatingSystem, isMacintosh, OS } from 'vs/base/common/platform'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { Emitter, Event } from 'vs/base/common/event'; @@ -28,6 +28,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { XTermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; import { TerminalHover, ILinkHoverTargetOptions } from 'vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget'; import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; +import { TerminalExternalLinkProviderAdapter } from 'vs/workbench/contrib/terminal/browser/links/terminalExternalLinkProviderAdapter'; export type XtermLinkMatcherHandler = (event: MouseEvent | undefined, link: string) => Promise; export type XtermLinkMatcherValidationCallback = (uri: string, callback: (isValid: boolean) => void) => void; @@ -43,8 +44,9 @@ interface IPath { export class TerminalLinkManager extends DisposableStore { private _widgetManager: TerminalWidgetManager | undefined; private _processCwd: string | undefined; - private _linkProviders: IDisposable[] = []; private _hasBeforeHandleLinkListeners = false; + private _standardLinkProviders: ILinkProvider[] = []; + private _standardLinkProvidersDisposables: IDisposable[] = []; protected static _LINK_INTERCEPT_THRESHOLD = LINK_INTERCEPT_THRESHOLD; public static readonly LINK_INTERCEPT_THRESHOLD = TerminalLinkManager._LINK_INTERCEPT_THRESHOLD; @@ -72,7 +74,29 @@ export class TerminalLinkManager extends DisposableStore { ) { super(); - this.registerLinkProvider(); + // Protocol links + const wrappedActivateCallback = this._wrapLinkHandler((_, link) => this._handleProtocolLink(link)); + const protocolProvider = this._instantiationService.createInstance(TerminalProtocolLinkProvider, this._xterm, wrappedActivateCallback, this._tooltipCallback2.bind(this)); + this._standardLinkProviders.push(protocolProvider); + + // Validated local links + if (this._configurationService.getValue(TERMINAL_CONFIG_SECTION).enableFileLinks) { + const wrappedTextLinkActivateCallback = this._wrapLinkHandler((_, link) => this._handleLocalLink(link)); + const validatedProvider = this._instantiationService.createInstance(TerminalValidatedLocalLinkProvider, + this._xterm, + this._processManager.os || OS, + wrappedTextLinkActivateCallback, + this._wrapLinkHandler.bind(this), + this._tooltipCallback2.bind(this), + async (link, cb) => cb(await this._resolvePath(link))); + this._standardLinkProviders.push(validatedProvider); + } + + // Word links + const wordProvider = this._instantiationService.createInstance(TerminalWordLinkProvider, this._xterm, this._wrapLinkHandler.bind(this), this._tooltipCallback2.bind(this)); + this._standardLinkProviders.push(wordProvider); + + this._registerStandardLinkProviders(); } private _tooltipCallback2(link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) { @@ -123,28 +147,20 @@ export class TerminalLinkManager extends DisposableStore { this._processCwd = processCwd; } - public registerLinkProvider(): void { - // Protocol links - const wrappedActivateCallback = this._wrapLinkHandler((_, link) => this._handleProtocolLink(link)); - const protocolProvider = this._instantiationService.createInstance(TerminalProtocolLinkProvider, this._xterm, wrappedActivateCallback, this._tooltipCallback2.bind(this)); - this._linkProviders.push(this._xterm.registerLinkProvider(protocolProvider)); - - // Validated local links - if (this._configurationService.getValue(TERMINAL_CONFIG_SECTION).enableFileLinks) { - const wrappedTextLinkActivateCallback = this._wrapLinkHandler((_, link) => this._handleLocalLink(link)); - const validatedProvider = this._instantiationService.createInstance(TerminalValidatedLocalLinkProvider, - this._xterm, - this._processManager.os || OS, - wrappedTextLinkActivateCallback, - this._wrapLinkHandler.bind(this), - this._tooltipCallback2.bind(this), - async (link, cb) => cb(await this._resolvePath(link))); - this._linkProviders.push(this._xterm.registerLinkProvider(validatedProvider)); + private _registerStandardLinkProviders(): void { + dispose(this._standardLinkProvidersDisposables); + this._standardLinkProvidersDisposables = []; + for (const p of this._standardLinkProviders) { + this._standardLinkProvidersDisposables.push(this._xterm.registerLinkProvider(p)); } + } - // Word links - const wordProvider = this._instantiationService.createInstance(TerminalWordLinkProvider, this._xterm, this._wrapLinkHandler.bind(this), this._tooltipCallback2.bind(this)); - this._linkProviders.push(this._xterm.registerLinkProvider(wordProvider)); + public registerExternalLinkProvider(instance: ITerminalInstance, linkProvider: ITerminalExternalLinkProvider): IDisposable { + const wrappedLinkProvider = this._instantiationService.createInstance(TerminalExternalLinkProviderAdapter, this._xterm, instance, linkProvider, this._wrapLinkHandler.bind(this), this._tooltipCallback2.bind(this)); + const newLinkProvider = this._xterm.registerLinkProvider(wrappedLinkProvider); + // Re-register the standard link providers so they are a lower priority that the new one + this._registerStandardLinkProviders(); + return newLinkProvider; } protected _wrapLinkHandler(handler: (event: MouseEvent | undefined, link: string) => void): XtermLinkMatcherHandler { @@ -255,7 +271,8 @@ export class TerminalLinkManager extends DisposableStore { } } - return new MarkdownString(`[${label || nls.localize('followLink', "Follow Link")}](${uri}) (${clickLabel})`, true); + // Use 'undefined' when uri is '' so the link displays correctly + return new MarkdownString(`[${label || nls.localize('followLink', "Follow Link")}](${uri || 'undefined'}) (${clickLabel})`, true); } private get osPath(): IPath { diff --git a/src/vs/workbench/contrib/terminal/browser/media/scrollbar.css b/src/vs/workbench/contrib/terminal/browser/media/scrollbar.css index aaa2d80f59e..da4ecfc43b8 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/scrollbar.css +++ b/src/vs/workbench/contrib/terminal/browser/media/scrollbar.css @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ .monaco-workbench .pane-body.integrated-terminal .xterm-viewport { - /* Use the hack presented in http://stackoverflow.com/a/38748186/1156119 to get opacity transitions working on the scrollbar */ + /* Use the hack presented in https://stackoverflow.com/a/38748186/1156119 to get opacity transitions working on the scrollbar */ -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; diff --git a/src/vs/workbench/contrib/terminal/browser/media/widgets.css b/src/vs/workbench/contrib/terminal/browser/media/widgets.css index ca64da196e6..51a9ab8eff2 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/widgets.css +++ b/src/vs/workbench/contrib/terminal/browser/media/widgets.css @@ -12,29 +12,6 @@ overflow: visible; } -.monaco-workbench .terminal-hover-widget { - position: fixed; - font-size: 14px; - line-height: 19px; - animation: fadein 100ms linear; - /* Must be higher than sash's z-index and terminal canvases */ - z-index: 40; - overflow: hidden; -} - -.monaco-workbench .terminal-hover-widget a { - color: #3794ff; -} - -.monaco-workbench .terminal-hover-widget.right-aligned .hover-row.status-bar .actions { - flex-direction: row-reverse; -} - -.monaco-workbench .terminal-hover-widget.right-aligned .hover-row.status-bar .actions .action-container { - margin-right: 0; - margin-left: 16px; -} - .monaco-workbench .terminal-overlay-widget { position: absolute; left: 0; @@ -58,15 +35,16 @@ opacity: 0.5; } +.monaco-workbench .terminal-env-var-info:hover, +.monaco-workbench .terminal-env-var-info.requires-action { + opacity: 1; +} + .monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.horizontal .split-view-view:last-child .terminal-env-var-info { /* Adjust for reduced margin in splits */ right: -8px; } -.monaco-workbench .terminal-env-var-info:hover { - opacity: 1; -} - .monaco-workbench .terminal-env-var-info.codicon { line-height: 28px; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index e953370e103..39098571234 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -7,7 +7,7 @@ import { Terminal as XTermTerminal } from 'xterm'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { Unicode11Addon as XTermUnicode11Addon } from 'xterm-addon-unicode11'; import { WebglAddon as XTermWebglAddon } from 'xterm-addon-webgl'; -import { IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig, IDefaultShellAndArgsRequest, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, ITerminalProcessExtHostProxy, ICommandTracker, INavigationMode, TitleEventSource, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig, IDefaultShellAndArgsRequest, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, ITerminalProcessExtHostProxy, ICommandTracker, INavigationMode, TitleEventSource, ITerminalDimensions, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; import { Event } from 'vs/base/common/event'; @@ -144,6 +144,14 @@ export interface ITerminalService { */ addLinkHandler(key: string, callback: TerminalLinkHandlerCallback): IDisposable; + /** + * Registers a link provider that enables integrators to add links to the terminal. + * @param linkProvider When registered, the link provider is asked whenever a cell is hovered + * for links at that position. This lets the terminal know all links at a given area and also + * labels for what these links are going to do. + */ + registerLinkProvider(linkProvider: ITerminalExternalLinkProvider): IDisposable; + selectDefaultShell(): Promise; setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void; @@ -161,26 +169,41 @@ export interface ITerminalService { preparePathForTerminalAsync(path: string, executable: string | undefined, title: string, shellType: TerminalShellType): Promise; extHostReady(remoteAuthority: string): void; - requestSpawnExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): void; - requestStartExtensionTerminal(proxy: ITerminalProcessExtHostProxy, cols: number, rows: number): void; + requestSpawnExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise; + requestStartExtensionTerminal(proxy: ITerminalProcessExtHostProxy, cols: number, rows: number): Promise; +} + +/** + * Similar to xterm.js' ILinkProvider but using promises and hides xterm.js internals (like buffer + * positions, decorations, etc.) from the rest of vscode. This is the interface to use for + * workbench integrations. + */ +export interface ITerminalExternalLinkProvider { + provideLinks(instance: ITerminalInstance, line: string): Promise; +} + +export interface ITerminalLink { + /** The startIndex of the link in the line. */ + startIndex: number; + /** The length of the link in the line. */ + length: number; + /** The descriptive label for what the link does when activated. */ + label?: string; + /** + * Activates the link. + * @param text The text of the link. + */ + activate(text: string): void; } export interface ISearchOptions { - /** - * Whether the find should be done as a regex. - */ + /** Whether the find should be done as a regex. */ regex?: boolean; - /** - * Whether only whole words should match. - */ + /** Whether only whole words should match. */ wholeWord?: boolean; - /** - * Whether find should pay attention to case. - */ + /** Whether find should pay attention to case. */ caseSensitive?: boolean; - /** - * Whether the search should start at the current search position (not the next row) - */ + /** Whether the search should start at the current search position (not the next row). */ incremental?: boolean; } @@ -234,6 +257,7 @@ export interface ITerminalInstance { onFocused: Event; onProcessIdReady: Event; + onLinksReady: Event; onRequestExtHostProcess: Event; onDimensionsChanged: Event; onMaximumDimensionsChanged: Event; @@ -272,6 +296,9 @@ export interface ITerminalInstance { readonly exitCode: number | undefined; + readonly areLinksReady: boolean; + + /** A promise that resolves when the terminal's pty/process have been created. */ processReady: Promise; /** @@ -480,4 +507,9 @@ export interface ITerminalInstance { getInitialCwd(): Promise; getCwd(): Promise; + + /** + * @throws when called before xterm.js is ready. + */ + registerLinkProvider(provider: ITerminalExternalLinkProvider): IDisposable; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 4aa1cc3e8cf..a6c7ebbcdd7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -37,6 +37,8 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { localize } from 'vs/nls'; import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { ITerminalContributionService } from 'vs/workbench/contrib/terminal/common/terminalExtensionPoints'; async function getCwdForSplit(configHelper: ITerminalConfigHelper, instance: ITerminalInstance, folders?: IWorkspaceFolder[], commandService?: ICommandService): Promise { switch (configHelper.config.splitCwd) { @@ -303,6 +305,8 @@ export class SelectDefaultShellWindowsTerminalAction extends Action { } } +const terminalIndexRe = /^([0-9]+): /; + export class SwitchTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SWITCH_TERMINAL; @@ -310,7 +314,9 @@ export class SwitchTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService, + @ITerminalContributionService private readonly _contributions: ITerminalContributionService, + @ICommandService private readonly _commands: ICommandService, ) { super(id, label, 'terminal-action switch-terminal'); } @@ -327,9 +333,20 @@ export class SwitchTerminalAction extends Action { this._terminalService.refreshActiveTab(); return this._terminalService.selectDefaultShell(); } - const selectedTabIndex = parseInt(item.split(':')[0], 10) - 1; - this._terminalService.setActiveTabByIndex(selectedTabIndex); - return this._terminalService.showPanel(true); + + const indexMatches = terminalIndexRe.exec(item); + if (indexMatches) { + this._terminalService.setActiveTabByIndex(Number(indexMatches[1]) - 1); + return this._terminalService.showPanel(true); + } + + const customType = this._contributions.terminalTypes.find(t => t.title === item); + if (customType) { + return this._commands.executeCommand(customType.command); + } + + console.warn(`Unmatched terminal item: "${item}"`); + return Promise.resolve(); } } @@ -341,9 +358,10 @@ export class SwitchTerminalActionViewItem extends SelectActionViewItem { action: IAction, @ITerminalService private readonly _terminalService: ITerminalService, @IThemeService private readonly _themeService: IThemeService, - @IContextViewService contextViewService: IContextViewService + @ITerminalContributionService private readonly _contributions: ITerminalContributionService, + @IContextViewService contextViewService: IContextViewService, ) { - super(null, action, getTerminalSelectOpenItems(_terminalService), _terminalService.activeTabIndex, contextViewService, { ariaLabel: localize('terminals', 'Open Terminals.'), optionsAsChildren: true }); + super(null, action, getTerminalSelectOpenItems(_terminalService, _contributions), _terminalService.activeTabIndex, contextViewService, { ariaLabel: localize('terminals', 'Open Terminals.'), optionsAsChildren: true }); this._register(_terminalService.onInstancesChanged(this._updateItems, this)); this._register(_terminalService.onActiveTabChanged(this._updateItems, this)); @@ -361,13 +379,18 @@ export class SwitchTerminalActionViewItem extends SelectActionViewItem { } private _updateItems(): void { - this.setOptions(getTerminalSelectOpenItems(this._terminalService), this._terminalService.activeTabIndex); + this.setOptions(getTerminalSelectOpenItems(this._terminalService, this._contributions), this._terminalService.activeTabIndex); } } -function getTerminalSelectOpenItems(terminalService: ITerminalService): ISelectOptionItem[] { +function getTerminalSelectOpenItems(terminalService: ITerminalService, contributions: ITerminalContributionService): ISelectOptionItem[] { const items = terminalService.getTabLabels().map(label => { text: label }); items.push({ text: SwitchTerminalActionViewItem.SEPARATOR, isDisabled: true }); + + for (const contributed of contributions.terminalTypes) { + items.push({ text: contributed.title }); + } + items.push({ text: SelectDefaultShellWindowsTerminalAction.LABEL }); return items; } @@ -392,6 +415,19 @@ export class ClearTerminalAction extends Action { } } +export class TerminalLaunchHelpAction extends Action { + + constructor( + @IOpenerService private readonly _openerService: IOpenerService + ) { + super('workbench.action.terminal.launchHelp', localize('terminalLaunchHelp', "Open Help")); + } + + async run(): Promise { + this._openerService.open('https://aka.ms/vscode-troubleshoot-terminal-launch'); + } +} + export function registerTerminalActions() { const category: ILocalizedString = { value: TERMINAL_ACTION_CATEGORY, original: 'Terminal' }; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts index 71f2e6af2d7..66607c6e13a 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts @@ -214,7 +214,7 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper { const shellArgsConfigValue = this._configurationService.inspect(`terminal.integrated.shellArgs.${platformKey}`); const envConfigValue = this._configurationService.inspect<{ [key: string]: string }>(`terminal.integrated.env.${platformKey}`); - // Check if workspace setting exists and whether it's whitelisted + // Check if workspace setting exists and whether it's allowed let isWorkspaceShellAllowed: boolean | undefined = false; if (shellConfigValue.workspaceValue !== undefined || shellArgsConfigValue.workspaceValue !== undefined || envConfigValue.workspaceValue !== undefined) { isWorkspaceShellAllowed = this.isWorkspaceShellAllowed(undefined); @@ -226,7 +226,7 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper { isWorkspaceShellAllowed = true; } - // Check if the value is neither blacklisted (false) or whitelisted (true) and ask for + // Check if the value is neither on the blocklist (false) or allowlist (true) and ask for // permission if (isWorkspaceShellAllowed === undefined) { let shellString: string | undefined; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index ac5745e13ed..4b74eba639f 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -25,12 +25,12 @@ import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderB import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; -import { IShellLaunchConfig, ITerminalDimensions, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_VIEW_ID, IWindowsShellHelper, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE, SHELL_CWD_INVALID_EXIT_CODE, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, INavigationMode, TitleEventSource, LEGACY_CONSOLE_MODE_EXIT_CODE, DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalDimensions, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_VIEW_ID, IWindowsShellHelper, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, INavigationMode, TitleEventSource, DEFAULT_COMMANDS_TO_SKIP_SHELL, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_FOREGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { TerminalLinkManager } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; -import { ITerminalInstanceService, ITerminalInstance, TerminalShellType, WindowsShellType, ITerminalBeforeHandleLinkEvent } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ITerminalInstanceService, ITerminalInstance, TerminalShellType, WindowsShellType, ITerminalBeforeHandleLinkEvent, ITerminalExternalLinkProvider } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalProcessManager } from 'vs/workbench/contrib/terminal/browser/terminalProcessManager'; import { Terminal as XTermTerminal, IBuffer, ITerminalAddon } from 'xterm'; import { SearchAddon, ISearchOptions } from 'xterm-addon-search'; @@ -42,6 +42,7 @@ import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { EnvironmentVariableInfoWidget } from 'vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget'; import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { TerminalLaunchHelpAction } from 'vs/workbench/contrib/terminal/browser/terminalActions'; // How long in milliseconds should an average frame take to render for a notification to appear // which suggests the fallback DOM-based renderer @@ -94,6 +95,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { private _xtermReadyPromise: Promise; private _titleReadyPromise: Promise; private _titleReadyComplete: ((title: string) => any) | undefined; + private _areLinksReady: boolean = false; private _messageTitleDisposable: IDisposable | undefined; @@ -126,6 +128,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // TODO: How does this work with detached processes? // TODO: Should this be an event as it can fire twice? public get processReady(): Promise { return this._processManager.ptyProcessReady; } + public get areLinksReady(): boolean { return this._areLinksReady; } public get exitCode(): number | undefined { return this._exitCode; } public get title(): string { return this._title; } public get hadFocusOnExit(): boolean { return this._hadFocusOnExit; } @@ -143,6 +146,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { public get onFocused(): Event { return this._onFocused.event; } private readonly _onProcessIdReady = new Emitter(); public get onProcessIdReady(): Event { return this._onProcessIdReady.event; } + private readonly _onLinksReady = new Emitter(); + public get onLinksReady(): Event { return this._onLinksReady.event; } private readonly _onTitleChanged = new Emitter(); public get onTitleChanged(): Event { return this._onTitleChanged.event; } private readonly _onData = new Emitter(); @@ -200,7 +205,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this._logService.trace(`terminalInstance#ctor (id: ${this.id})`, this._shellLaunchConfig); this._initDimensions(); - this._createProcess(); + this._createProcessManager(); this._xtermReadyPromise = this._createXterm(); this._xtermReadyPromise.then(() => { @@ -208,6 +213,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { if (_container) { this._attachToElement(_container); } + this._createProcess(); }); this.addDisposable(this._configurationService.onDidChangeConfiguration(e => { @@ -415,6 +421,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { e.terminal = this; this._onBeforeHandleLink.fire(e); }); + this._areLinksReady = true; + this._onLinksReady.fire(this); }); this._commandTrackerAddon = new CommandTrackerAddon(); @@ -485,8 +493,13 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { throw new Error('xterm elements not set after open'); } + // Check if custom Terminal title exists and set same + if (this._title.length > 0) { + xterm.textarea.setAttribute('aria-label', nls.localize('terminalTextBoxAriaLabelNumberAndTitle', "Terminal {0}, {1}", this._id, this._title)); + } else { + xterm.textarea.setAttribute('aria-label', nls.localize('terminalTextBoxAriaLabel', "Terminal {0}", this._id)); + } - xterm.textarea.setAttribute('aria-label', nls.localize('terminalTextBoxAriaLabel', "Terminal {0}", this._id)); xterm.textarea.addEventListener('focus', () => this._onFocus.fire(this)); xterm.attachCustomKeyEventHandler((event: KeyboardEvent): boolean => { // Disable all input if the terminal is exiting @@ -862,9 +875,11 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this._terminalHasTextContextKey.set(isActive && this.hasSelection()); } - protected _createProcess(): void { + protected _createProcessManager(): void { this._processManager = this._instantiationService.createInstance(TerminalProcessManager, this._id, this._configHelper); - this._processManager.onProcessReady(() => this._onProcessIdReady.fire(this)); + this._processManager.onProcessReady(() => { + this._onProcessIdReady.fire(this); + }); this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode)); this._processManager.onProcessData(data => this._onData.fire(data)); this._processManager.onProcessOverrideDimensions(e => this.setDimensions(e)); @@ -908,12 +923,14 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { }); }); } + } - // Create the process asynchronously to allow the terminal's container - // to be created so dimensions are accurate - setTimeout(() => { - this._processManager.createProcess(this._shellLaunchConfig, this._cols, this._rows, this._accessibilityService.isScreenReaderOptimized()); - }, 0); + private _createProcess(): void { + this._processManager.createProcess(this._shellLaunchConfig, this._cols, this._rows, this._accessibilityService.isScreenReaderOptimized()).then(error => { + if (error) { + this._onProcessExit(error); + } + }); } private getShellType(executable: string): TerminalShellType { @@ -948,48 +965,54 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { * @param exitCode The exit code of the process, this is undefined when the terminal was exited * through user action. */ - private _onProcessExit(exitCode?: number): void { + private _onProcessExit(exitCodeOrError?: number | ITerminalLaunchError): void { // Prevent dispose functions being triggered multiple times if (this._isExiting) { return; } - this._logService.debug(`Terminal process exit (id: ${this.id}) with code ${exitCode}`); + this._logService.debug(`Terminal process exit (id: ${this.id}) with code ${this._exitCode}`); - this._exitCode = exitCode; this._isExiting = true; let exitCodeMessage: string | undefined; // Create exit code message - if (exitCode) { - if (exitCode === SHELL_PATH_INVALID_EXIT_CODE) { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPath', 'The terminal shell path "{0}" does not exist', this._shellLaunchConfig.executable); - } else if (exitCode === SHELL_PATH_DIRECTORY_EXIT_CODE) { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPathDirectory', 'The terminal shell path "{0}" is a directory', this._shellLaunchConfig.executable); - } else if (exitCode === SHELL_CWD_INVALID_EXIT_CODE && this._shellLaunchConfig.cwd) { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidCWD', 'The terminal shell CWD "{0}" does not exist', this._shellLaunchConfig.cwd.toString()); - } else if (exitCode === LEGACY_CONSOLE_MODE_EXIT_CODE) { - exitCodeMessage = nls.localize('terminal.integrated.legacyConsoleModeError', 'The terminal failed to launch properly because your system has legacy console mode enabled, uncheck "Use legacy console" cmd.exe\'s properties to fix this.'); - } else if (this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH) { - let args = ''; - if (typeof this._shellLaunchConfig.args === 'string') { - args = ` ${this._shellLaunchConfig.args}`; - } else if (this._shellLaunchConfig.args && this._shellLaunchConfig.args.length) { - args = ' ' + this._shellLaunchConfig.args.map(a => { - if (typeof a === 'string' && a.indexOf(' ') !== -1) { - return `'${a}'`; - } - return a; - }).join(' '); + switch (typeof exitCodeOrError) { + case 'number': + // Only show the error if the exit code is non-zero + this._exitCode = exitCodeOrError; + if (this._exitCode === 0) { + break; } + + let commandLine: string | undefined = undefined; if (this._shellLaunchConfig.executable) { - exitCodeMessage = nls.localize('terminal.integrated.launchFailed', 'The terminal process command \'{0}{1}\' failed to launch (exit code: {2})', this._shellLaunchConfig.executable, args, exitCode); - } else { - exitCodeMessage = nls.localize('terminal.integrated.launchFailedExtHost', 'The terminal process failed to launch (exit code: {0})', exitCode); + commandLine = this._shellLaunchConfig.executable; + if (typeof this._shellLaunchConfig.args === 'string') { + commandLine += ` ${this._shellLaunchConfig.args}`; + } else if (this._shellLaunchConfig.args && this._shellLaunchConfig.args.length) { + commandLine += this._shellLaunchConfig.args.map(a => ` '${a}'`).join(); + } } - } else { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithCode', 'The terminal process terminated with exit code: {0}', exitCode); - } + + if (this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH) { + if (commandLine) { + exitCodeMessage = nls.localize('launchFailed.exitCodeAndCommandLine', "The terminal process \"{0}\" failed to launch (exit code: {1}).", commandLine, this._exitCode); + break; + } + exitCodeMessage = nls.localize('launchFailed.exitCodeOnly', "The terminal process failed to launch (exit code: {0}).", this._exitCode); + break; + } + if (commandLine) { + exitCodeMessage = nls.localize('terminated.exitCodeAndCommandLine', "The terminal process \"{0}\" terminated with exit code: {1}.", commandLine, this._exitCode); + break; + } + exitCodeMessage = nls.localize('terminated.exitCodeOnly', "The terminal process terminated with exit code: {0}.", this._exitCode); + break; + case 'object': + this._exitCode = exitCodeOrError.code; + exitCodeMessage = nls.localize('launchFailed.errorMessage', "The terminal process failed to launch: {0}.", exitCodeOrError.message); + break; } this._logService.debug(`Terminal process exit (id: ${this.id}) state ${this._processManager.processState}`); @@ -1016,19 +1039,23 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } else { this.dispose(); if (exitCodeMessage) { - if (this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH) { - this._notificationService.error(exitCodeMessage); + const failedDuringLaunch = this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH; + if (failedDuringLaunch || this._configHelper.config.showExitAlert) { + // Always show launch failures + this._notificationService.notify({ + message: exitCodeMessage, + severity: Severity.Error, + actions: { primary: [this._instantiationService.createInstance(TerminalLaunchHelpAction)] } + }); } else { - if (this._configHelper.config.showExitAlert) { - this._notificationService.error(exitCodeMessage); - } else { - console.warn(exitCodeMessage); - } + // Log to help surface the error in case users report issues with showExitAlert + // disabled + this._logService.warn(exitCodeMessage); } } } - this._onExit.fire(exitCode); + this._onExit.fire(this._exitCode); } private _attachPressAnyKeyToCloseListener(xterm: XTermTerminal) { @@ -1090,13 +1117,14 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // Launch the process unless this is only a renderer. // In the renderer only cases, we still need to set the title correctly. const oldTitle = this._title; - this._createProcess(); + this._createProcessManager(); if (oldTitle !== this._title) { this.setTitle(this._title, TitleEventSource.Process); } this._processManager.onProcessData(data => this._onProcessData(data)); + this._createProcess(); } public relaunch(): void { @@ -1474,6 +1502,13 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { public getCwd(): Promise { return this._processManager.getCwd(); } + + public registerLinkProvider(provider: ITerminalExternalLinkProvider): IDisposable { + if (!this._linkManager) { + throw new Error('TerminalInstance.registerLinkProvider before link manager was ready'); + } + return this._linkManager.registerExternalLinkProvider(this, provider); + } } registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts index eee8ddafca5..7d7623c1a0d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { ITerminalProcessExtHostProxy, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalProcessExtHostProxy, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper, ITerminalDimensions, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import * as nls from 'vs/nls'; import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; -let hasReceivedResponse: boolean = false; +let hasReceivedResponseFromRemoteExtHost: boolean = false; export class TerminalProcessExtHostProxy extends Disposable implements ITerminalChildProcess, ITerminalProcessExtHostProxy { @@ -28,6 +28,8 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal private readonly _onProcessResolvedShellLaunchConfig = this._register(new Emitter()); public get onProcessResolvedShellLaunchConfig(): Event { return this._onProcessResolvedShellLaunchConfig.event; } + private readonly _onStart = this._register(new Emitter()); + public readonly onStart: Event = this._onStart.event; private readonly _onInput = this._register(new Emitter()); public readonly onInput: Event = this._onInput.event; private readonly _onResize: Emitter<{ cols: number, rows: number }> = this._register(new Emitter<{ cols: number, rows: number }>()); @@ -47,31 +49,15 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal constructor( public terminalId: number, - shellLaunchConfig: IShellLaunchConfig, - activeWorkspaceRootUri: URI | undefined, - cols: number, - rows: number, - configHelper: ITerminalConfigHelper, + private _shellLaunchConfig: IShellLaunchConfig, + private _activeWorkspaceRootUri: URI | undefined, + private _cols: number, + private _rows: number, + private _configHelper: ITerminalConfigHelper, @ITerminalService private readonly _terminalService: ITerminalService, - @IRemoteAgentService readonly remoteAgentService: IRemoteAgentService + @IRemoteAgentService private readonly _remoteAgentService: IRemoteAgentService ) { super(); - - // Request a process if needed, if this is a virtual process this step can be skipped as - // there is no real "process" and we know it's ready on the ext host already. - if (shellLaunchConfig.isExtensionTerminal) { - this._terminalService.requestStartExtensionTerminal(this, cols, rows); - } else { - remoteAgentService.getEnvironment().then(env => { - if (!env) { - throw new Error('Could not fetch environment'); - } - this._terminalService.requestSpawnExtHostProcess(this, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, configHelper.checkWorkspaceShellPermissions(env.os)); - }); - if (!hasReceivedResponse) { - setTimeout(() => this._onProcessTitleChanged.fire(nls.localize('terminal.integrated.starting', "Starting...")), 0); - } - } } public emitData(data: string): void { @@ -79,7 +65,7 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal } public emitTitle(title: string): void { - hasReceivedResponse = true; + hasReceivedResponseFromRemoteExtHost = true; this._onProcessTitleChanged.fire(title); } @@ -118,6 +104,29 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal } } + public async start(): Promise { + // Request a process if needed, if this is a virtual process this step can be skipped as + // there is no real "process" and we know it's ready on the ext host already. + if (this._shellLaunchConfig.isExtensionTerminal) { + return this._terminalService.requestStartExtensionTerminal(this, this._cols, this._rows); + } + + // Add a loading title if the extension host has not started yet as there could be a + // decent wait for the user + if (!hasReceivedResponseFromRemoteExtHost) { + setTimeout(() => this._onProcessTitleChanged.fire(nls.localize('terminal.integrated.starting', "Starting...")), 0); + } + + // Fetch the environment to check shell permissions + const env = await this._remoteAgentService.getEnvironment(); + if (!env) { + // Extension host processes are only allowed in remote extension hosts currently + throw new Error('Could not fetch remote environment'); + } + + return this._terminalService.requestSpawnExtHostProcess(this, this._shellLaunchConfig, this._activeWorkspaceRootUri, this._cols, this._rows, this._configHelper.checkWorkspaceShellPermissions(env.os)); + } + public shutdown(immediate: boolean): void { this._onShutdown.fire(immediate); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 2cf53d92986..9d4efdec9d8 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -6,7 +6,7 @@ import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { env as processEnv } from 'vs/base/common/process'; -import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper, ITerminalChildProcess, IBeforeProcessDataEvent, ITerminalEnvironment, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper, ITerminalChildProcess, IBeforeProcessDataEvent, ITerminalEnvironment, ITerminalDimensions, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { ILogService } from 'vs/platform/log/common/log'; import { Emitter, Event } from 'vs/base/common/event'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; @@ -127,7 +127,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce cols: number, rows: number, isScreenReaderModeEnabled: boolean - ): Promise { + ): Promise { if (shellLaunchConfig.isExtensionTerminal) { this._processType = ProcessType.ExtensionTerminal; this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, undefined, cols, rows, this._configHelper); @@ -146,7 +146,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce this.userHome = this._pathService.resolvedUserHome?.fsPath; this.os = platform.OS; if (launchRemotely) { - const userHomeUri = await this._pathService.userHome; + const userHomeUri = await this._pathService.userHome(); this.userHome = userHomeUri.path; if (hasRemoteAuthority) { const remoteEnv = await this._remoteAgentService.getEnvironment(); @@ -162,6 +162,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce this._process = await this._launchProcess(shellLaunchConfig, cols, rows, this.userHome, isScreenReaderModeEnabled); } } + this.processState = ProcessState.LAUNCHING; this._process.onProcessData(data => { @@ -198,6 +199,13 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce this.processState = ProcessState.RUNNING; } }, LAUNCHING_DURATION); + + const error = await this._process.start(); + if (error) { + return error; + } + + return undefined; } private async _launchProcess( diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 40fdb32a03d..802883f5f93 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { TERMINAL_VIEW_ID, IShellLaunchConfig, ITerminalConfigHelper, ITerminalNativeService, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, ITerminalProcessExtHostProxy, IShellDefinition, LinuxDistro, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_VIEW_ID, IShellLaunchConfig, ITerminalConfigHelper, ITerminalNativeService, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, ITerminalProcessExtHostProxy, IShellDefinition, LinuxDistro, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; @@ -14,7 +14,7 @@ import { TerminalTab } from 'vs/workbench/contrib/terminal/browser/terminalTab'; import { IInstantiationService, optional } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { TerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminalInstance'; -import { ITerminalService, ITerminalInstance, ITerminalTab, TerminalShellType, WindowsShellType, TerminalLinkHandlerCallback, LINK_INTERCEPT_THRESHOLD } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ITerminalService, ITerminalInstance, ITerminalTab, TerminalShellType, WindowsShellType, TerminalLinkHandlerCallback, LINK_INTERCEPT_THRESHOLD, ITerminalExternalLinkProvider } from 'vs/workbench/contrib/terminal/browser/terminal'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { IQuickInputService, IQuickPickItem, IPickOptions } from 'vs/platform/quickinput/common/quickInput'; @@ -54,6 +54,8 @@ export class TerminalService implements ITerminalService { private _extHostsReady: { [authority: string]: IExtHostReadyEntry | undefined } = {}; private _activeTabIndex: number; private _linkHandlers: { [key: string]: TerminalLinkHandlerCallback } = {}; + private _linkProviders: Set = new Set(); + private _linkProviderDisposables: Map = new Map(); public get activeTabIndex(): number { return this._activeTabIndex; } public get terminalInstances(): ITerminalInstance[] { return this._terminalInstances; } @@ -72,6 +74,8 @@ export class TerminalService implements ITerminalService { public get onInstanceDisposed(): Event { return this._onInstanceDisposed.event; } private readonly _onInstanceProcessIdReady = new Emitter(); public get onInstanceProcessIdReady(): Event { return this._onInstanceProcessIdReady.event; } + private readonly _onInstanceLinksReady = new Emitter(); + public get onInstanceLinksReady(): Event { return this._onInstanceLinksReady.event; } private readonly _onInstanceRequestSpawnExtHostProcess = new Emitter(); public get onInstanceRequestSpawnExtHostProcess(): Event { return this._onInstanceRequestSpawnExtHostProcess.event; } private readonly _onInstanceRequestStartExtensionTerminal = new Emitter(); @@ -128,6 +132,7 @@ export class TerminalService implements ITerminalService { const instance = this.getActiveInstance(); this._onActiveInstanceChanged.fire(instance ? instance : undefined); }); + this.onInstanceLinksReady(instance => this._setInstanceLinkProviders(instance)); this._handleContextKeys(); } @@ -147,18 +152,23 @@ export class TerminalService implements ITerminalService { return activeInstance ? activeInstance : this.createTerminal(undefined); } - public async requestSpawnExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { + public async requestSpawnExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { await this._extensionService.whenInstalledExtensionsRegistered(); // Wait for the remoteAuthority to be ready (and listening for events) before firing // the event to spawn the ext host process const conn = this._remoteAgentService.getConnection(); const remoteAuthority = conn ? conn.remoteAuthority : 'null'; await this._whenExtHostReady(remoteAuthority); - this._onInstanceRequestSpawnExtHostProcess.fire({ proxy, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, isWorkspaceShellAllowed }); + return new Promise(callback => { + this._onInstanceRequestSpawnExtHostProcess.fire({ proxy, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, isWorkspaceShellAllowed, callback }); + }); } - public requestStartExtensionTerminal(proxy: ITerminalProcessExtHostProxy, cols: number, rows: number): void { - this._onInstanceRequestStartExtensionTerminal.fire({ proxy, cols, rows }); + public requestStartExtensionTerminal(proxy: ITerminalProcessExtHostProxy, cols: number, rows: number): Promise { + // The initial request came from the extension host, no need to wait for it + return new Promise(callback => { + this._onInstanceRequestStartExtensionTerminal.fire({ proxy, cols, rows, callback }); + }); } public async extHostReady(remoteAuthority: string): Promise { @@ -424,6 +434,7 @@ export class TerminalService implements ITerminalService { instance.addDisposable(instance.onDisposed(this._onInstanceDisposed.fire, this._onInstanceDisposed)); instance.addDisposable(instance.onTitleChanged(this._onInstanceTitleChanged.fire, this._onInstanceTitleChanged)); instance.addDisposable(instance.onProcessIdReady(this._onInstanceProcessIdReady.fire, this._onInstanceProcessIdReady)); + instance.addDisposable(instance.onLinksReady(this._onInstanceLinksReady.fire, this._onInstanceLinksReady)); instance.addDisposable(instance.onDimensionsChanged(() => this._onInstanceDimensionsChanged.fire(instance))); instance.addDisposable(instance.onMaximumDimensionsChanged(() => this._onInstanceMaximumDimensionsChanged.fire(instance))); instance.addDisposable(instance.onFocus(this._onActiveInstanceChanged.fire, this._onActiveInstanceChanged)); @@ -473,6 +484,34 @@ export class TerminalService implements ITerminalService { }; } + public registerLinkProvider(linkProvider: ITerminalExternalLinkProvider): IDisposable { + const disposables: IDisposable[] = []; + this._linkProviders.add(linkProvider); + for (const instance of this.terminalInstances) { + if (instance.areLinksReady) { + disposables.push(instance.registerLinkProvider(linkProvider)); + } + } + this._linkProviderDisposables.set(linkProvider, disposables); + return { + dispose: () => { + const disposables = this._linkProviderDisposables.get(linkProvider) || []; + for (const disposable of disposables) { + disposable.dispose(); + } + this._linkProviders.delete(linkProvider); + } + }; + } + + private _setInstanceLinkProviders(instance: ITerminalInstance): void { + for (const linkProvider of this._linkProviders) { + const disposables = this._linkProviderDisposables.get(linkProvider); + const provider = instance.registerLinkProvider(linkProvider); + disposables?.push(provider); + } + } + private _getTabForInstance(instance: ITerminalInstance): ITerminalTab | undefined { return find(this._terminalTabs, tab => tab.terminalInstances.indexOf(instance) !== -1); } diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts b/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts index 55f3f2b7970..3bd49844533 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts @@ -6,28 +6,27 @@ import { Widget } from 'vs/base/browser/ui/widget'; import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import { ITerminalWidget, IHoverTarget, IHoverAnchor, HorizontalAnchorSide, VerticalAnchorSide } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { HoverWidget } from 'vs/workbench/contrib/terminal/browser/widgets/hoverWidget'; +import { ITerminalWidget } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import * as dom from 'vs/base/browser/dom'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { IHoverService, IHoverOptions } from 'vs/workbench/services/hover/browser/hover'; export class EnvironmentVariableInfoWidget extends Widget implements ITerminalWidget { readonly id = 'env-var-info'; private _domNode: HTMLElement | undefined; private _container: HTMLElement | undefined; - private _hoverWidget: HoverWidget | undefined; private _mouseMoveListener: IDisposable | undefined; + private _hoverOptions: IHoverOptions | undefined; get requiresAction() { return this._info.requiresAction; } constructor( private _info: IEnvironmentVariableInfo, - @IInstantiationService private readonly _instantiationService: IInstantiationService, - @IConfigurationService private readonly _configurationService: IConfigurationService + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IHoverService private readonly _hoverService: IHoverService ) { super(); } @@ -36,9 +35,11 @@ export class EnvironmentVariableInfoWidget extends Widget implements ITerminalWi this._container = container; this._domNode = document.createElement('div'); this._domNode.classList.add('terminal-env-var-info', 'codicon', `codicon-${this._info.getIcon()}`); + if (this.requiresAction) { + this._domNode.classList.add('requires-action'); + } container.appendChild(this._domNode); - const timeout = this._configurationService.getValue('editor.hover.delay'); const scheduler: RunOnceScheduler = new RunOnceScheduler(() => this._showHover(), timeout); this._register(scheduler); @@ -71,42 +72,21 @@ export class EnvironmentVariableInfoWidget extends Widget implements ITerminalWi } focus() { - this._showHover(); - this._hoverWidget?.focus(); + this._showHover(true); } - private _showHover() { - if (!this._domNode || !this._container || this._hoverWidget) { + private _showHover(focus?: boolean) { + if (!this._domNode || !this._container) { return; } - const target = new ElementHoverTarget(this._domNode); - const actions = this._info.getActions ? this._info.getActions() : undefined; - this._hoverWidget = this._instantiationService.createInstance(HoverWidget, this._container, target, new MarkdownString(this._info.getInfo()), () => { }, actions); - this._register(this._hoverWidget); - this._register(this._hoverWidget.onDispose(() => this._hoverWidget = undefined)); - } -} - -class ElementHoverTarget implements IHoverTarget { - readonly targetElements: readonly HTMLElement[]; - - constructor( - private _element: HTMLElement - ) { - this.targetElements = [this._element]; - } - - get anchor(): IHoverAnchor { - const position = dom.getDomNodePagePosition(this._element); - return { - x: position.left, - horizontalAnchorSide: HorizontalAnchorSide.Left, - y: document.documentElement.clientHeight - position.top - 1, - verticalAnchorSide: VerticalAnchorSide.Bottom, - fallbackY: position.top + position.height - }; - } - - dispose(): void { + if (!this._hoverOptions) { + const actions = this._info.getActions ? this._info.getActions() : undefined; + this._hoverOptions = { + target: this._domNode, + text: new MarkdownString(this._info.getInfo()), + actions + }; + } + this._hoverService.showHover(this._hoverOptions, focus); } } diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts b/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts index 438ae87c290..121573ea0f5 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts @@ -6,11 +6,12 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { Widget } from 'vs/base/browser/ui/widget'; -import { ITerminalWidget, IHoverAnchor, IHoverTarget, HorizontalAnchorSide, VerticalAnchorSide } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { HoverWidget } from 'vs/workbench/contrib/terminal/browser/widgets/hoverWidget'; +import { ITerminalWidget } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; import * as dom from 'vs/base/browser/dom'; import { IViewportRange } from 'xterm'; +import { IHoverTarget, IHoverService } from 'vs/workbench/services/hover/browser/hover'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorHoverHighlight } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; @@ -28,8 +29,8 @@ export class TerminalHover extends Disposable implements ITerminalWidget { constructor( private readonly _targetOptions: ILinkHoverTargetOptions, private readonly _text: IMarkdownString, - private readonly _linkHandler: (url: string) => void, - @IInstantiationService private readonly _instantiationService: IInstantiationService + private readonly _linkHandler: (url: string) => any, + @IHoverService private readonly _hoverService: IHoverService ) { super(); } @@ -40,92 +41,91 @@ export class TerminalHover extends Disposable implements ITerminalWidget { attach(container: HTMLElement): void { const target = new CellHoverTarget(container, this._targetOptions); - this._register(this._instantiationService.createInstance(HoverWidget, container, target, this._text, this._linkHandler, [])); + this._hoverService.showHover({ + target, + text: this._text, + linkHandler: this._linkHandler, + // .xterm-hover lets xterm know that the hover is part of a link + additionalClasses: ['xterm-hover'] + }); } } class CellHoverTarget extends Widget implements IHoverTarget { - private _domNode: HTMLElement; - private _isDisposed: boolean = false; + private _domNode: HTMLElement | undefined; + private readonly _targetElements: HTMLElement[] = []; - readonly targetElements: readonly HTMLElement[]; + get targetElements(): readonly HTMLElement[] { return this._targetElements; } constructor( - private readonly _container: HTMLElement, - o: ILinkHoverTargetOptions + container: HTMLElement, + private readonly _options: ILinkHoverTargetOptions ) { super(); - this._domNode = $('div.terminal-hover-targets'); - const targets: HTMLElement[] = []; - const rowCount = o.viewportRange.end.y - o.viewportRange.start.y + 1; + this._domNode = $('div.terminal-hover-targets.xterm-hover'); + const rowCount = this._options.viewportRange.end.y - this._options.viewportRange.start.y + 1; // Add top target row - const width = (o.viewportRange.end.y > o.viewportRange.start.y ? o.terminalDimensions.width - o.viewportRange.start.x : o.viewportRange.end.x - o.viewportRange.start.x + 1) * o.cellDimensions.width; + const width = (this._options.viewportRange.end.y > this._options.viewportRange.start.y ? this._options.terminalDimensions.width - this._options.viewportRange.start.x : this._options.viewportRange.end.x - this._options.viewportRange.start.x + 1) * this._options.cellDimensions.width; const topTarget = $('div.terminal-hover-target.hoverHighlight'); - topTarget.style.left = `${o.viewportRange.start.x * o.cellDimensions.width}px`; - topTarget.style.bottom = `${(o.terminalDimensions.height - o.viewportRange.start.y - 1) * o.cellDimensions.height}px`; + topTarget.style.left = `${this._options.viewportRange.start.x * this._options.cellDimensions.width}px`; + topTarget.style.bottom = `${(this._options.terminalDimensions.height - this._options.viewportRange.start.y - 1) * this._options.cellDimensions.height}px`; topTarget.style.width = `${width}px`; - topTarget.style.height = `${o.cellDimensions.height}px`; - targets.push(this._domNode.appendChild(topTarget)); + topTarget.style.height = `${this._options.cellDimensions.height}px`; + this._targetElements.push(this._domNode.appendChild(topTarget)); // Add middle target rows if (rowCount > 2) { const middleTarget = $('div.terminal-hover-target.hoverHighlight'); middleTarget.style.left = `0px`; - middleTarget.style.bottom = `${(o.terminalDimensions.height - o.viewportRange.start.y - 1 - (rowCount - 2)) * o.cellDimensions.height}px`; - middleTarget.style.width = `${o.terminalDimensions.width * o.cellDimensions.width}px`; - middleTarget.style.height = `${(rowCount - 2) * o.cellDimensions.height}px`; - targets.push(this._domNode.appendChild(middleTarget)); + middleTarget.style.bottom = `${(this._options.terminalDimensions.height - this._options.viewportRange.start.y - 1 - (rowCount - 2)) * this._options.cellDimensions.height}px`; + middleTarget.style.width = `${this._options.terminalDimensions.width * this._options.cellDimensions.width}px`; + middleTarget.style.height = `${(rowCount - 2) * this._options.cellDimensions.height}px`; + this._targetElements.push(this._domNode.appendChild(middleTarget)); } // Add bottom target row if (rowCount > 1) { const bottomTarget = $('div.terminal-hover-target.hoverHighlight'); bottomTarget.style.left = `0px`; - bottomTarget.style.bottom = `${(o.terminalDimensions.height - o.viewportRange.end.y - 1) * o.cellDimensions.height}px`; - bottomTarget.style.width = `${(o.viewportRange.end.x + 1) * o.cellDimensions.width}px`; - bottomTarget.style.height = `${o.cellDimensions.height}px`; - targets.push(this._domNode.appendChild(bottomTarget)); + bottomTarget.style.bottom = `${(this._options.terminalDimensions.height - this._options.viewportRange.end.y - 1) * this._options.cellDimensions.height}px`; + bottomTarget.style.width = `${(this._options.viewportRange.end.x + 1) * this._options.cellDimensions.width}px`; + bottomTarget.style.height = `${this._options.cellDimensions.height}px`; + this._targetElements.push(this._domNode.appendChild(bottomTarget)); } - this.targetElements = targets; - - if (o.modifierDownCallback && o.modifierUpCallback) { + if (this._options.modifierDownCallback && this._options.modifierUpCallback) { let down = false; this._register(dom.addDisposableListener(document, 'keydown', e => { if (e.ctrlKey && !down) { down = true; - o.modifierDownCallback!(); + this._options.modifierDownCallback!(); } })); this._register(dom.addDisposableListener(document, 'keyup', e => { if (!e.ctrlKey) { down = false; - o.modifierUpCallback!(); + this._options.modifierUpCallback!(); } })); } - this._container.appendChild(this._domNode); + container.appendChild(this._domNode); } dispose(): void { - if (!this._isDisposed) { - this._container.removeChild(this._domNode); - } - this._isDisposed = true; + this._domNode?.parentElement?.removeChild(this._domNode); super.dispose(); } - - get anchor(): IHoverAnchor { - const firstPosition = dom.getDomNodePagePosition(this.targetElements[0]); - return { - x: firstPosition.left, - horizontalAnchorSide: HorizontalAnchorSide.Left, - y: document.documentElement.clientHeight - firstPosition.top - 1, - verticalAnchorSide: VerticalAnchorSide.Bottom, - fallbackY: firstPosition.top + firstPosition.height - 1 - }; - } } + +registerThemingParticipant((theme, collector) => { + let editorHoverHighlightColor = theme.getColor(editorHoverHighlight); + if (editorHoverHighlightColor) { + if (editorHoverHighlightColor.isOpaque()) { + editorHoverHighlightColor = editorHoverHighlightColor.transparent(0.5); + } + collector.addRule(`.integrated-terminal .hoverHighlight { background-color: ${editorHoverHighlightColor}; }`); + } +}); diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/widgets.ts b/src/vs/workbench/contrib/terminal/browser/widgets/widgets.ts index d9071035e97..50bc2ee7e5e 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/widgets.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/widgets.ts @@ -12,32 +12,3 @@ export interface ITerminalWidget extends IDisposable { id: string; attach(container: HTMLElement): void; } - -export enum HorizontalAnchorSide { - Left, - Right -} - -export enum VerticalAnchorSide { - Top, - Bottom -} - -export interface IHoverAnchor { - x: number; - y: number; - horizontalAnchorSide: HorizontalAnchorSide; - verticalAnchorSide: VerticalAnchorSide; - /** - * Fallback Y value to try with opposite VerticalAlignment if the hover does not fit vertically. - */ - fallbackY: number; -} - -/** - * A target for a hover which can know about domain-specific locations. - */ -export interface IHoverTarget extends IDisposable { - readonly targetElements: readonly HTMLElement[]; - readonly anchor: IHoverAnchor; -} diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index dcb635fca96..7a7639f627f 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -12,6 +12,7 @@ import { URI } from 'vs/base/common/uri'; import { OperatingSystem } from 'vs/base/common/platform'; import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IExtensionPointDescriptor } from 'vs/workbench/services/extensions/common/extensionsRegistry'; export const TERMINAL_VIEW_ID = 'workbench.panel.terminal'; @@ -70,10 +71,6 @@ export const TERMINAL_ACTION_CATEGORY = nls.localize('terminalCategory', "Termin export const DEFAULT_LETTER_SPACING = 0; export const MINIMUM_LETTER_SPACING = -5; export const DEFAULT_LINE_HEIGHT = 1; -export const SHELL_PATH_INVALID_EXIT_CODE = -1; -export const SHELL_PATH_DIRECTORY_EXIT_CODE = -2; -export const SHELL_CWD_INVALID_EXIT_CODE = -3; -export const LEGACY_CONSOLE_MODE_EXIT_CODE = 3221225786; // microsoft/vscode#73790 export type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'; @@ -308,7 +305,7 @@ export interface ITerminalProcessManager extends IDisposable { readonly onEnvironmentVariableInfoChanged: Event; dispose(immediate?: boolean): void; - createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; + createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; write(data: string): void; setDimensions(cols: number, rows: number): void; @@ -364,12 +361,14 @@ export interface ISpawnExtHostProcessRequest { cols: number; rows: number; isWorkspaceShellAllowed: boolean; + callback: (error: ITerminalLaunchError | undefined) => void; } export interface IStartExtensionTerminalRequest { proxy: ITerminalProcessExtHostProxy; cols: number; rows: number; + callback: (error: ITerminalLaunchError | undefined) => void; } export interface IAvailableShellsRequest { @@ -402,6 +401,11 @@ export interface IWindowsShellHelper extends IDisposable { getShellName(): Promise; } +export interface ITerminalLaunchError { + message: string; + code?: number; +} + /** * An interface representing a raw terminal child process, this contains a subset of the * child_process.ChildProcess node.js interface. @@ -414,6 +418,14 @@ export interface ITerminalChildProcess { onProcessOverrideDimensions?: Event; onProcessResolvedShellLaunchConfig?: Event; + /** + * Starts the process. + * + * @returns undefined when the process was successfully started, otherwise an object containing + * information on what went wrong. + */ + start(): Promise; + /** * Shutdown the terminal process. * @@ -614,3 +626,41 @@ export const DEFAULT_COMMANDS_TO_SKIP_SHELL: string[] = [ 'workbench.action.quickOpenView', 'workbench.action.toggleMaximizedPanel' ]; + +export interface ITerminalContributions { + types?: ITerminalTypeContribution[]; +} + +export interface ITerminalTypeContribution { + title: string; + command: string; +} + +export const terminalContributionsDescriptor: IExtensionPointDescriptor = { + extensionPoint: 'terminal', + defaultExtensionKind: 'workspace', + jsonSchema: { + description: nls.localize('vscode.extension.contributes.terminal', 'Contributes terminal functionality.'), + type: 'object', + properties: { + types: { + type: 'array', + description: nls.localize('vscode.extension.contributes.terminal.types', "Defines additional terminal types that the user can create."), + items: { + type: 'object', + required: ['command', 'title'], + properties: { + command: { + description: nls.localize('vscode.extension.contributes.terminal.types.command', "Command to execute when the user creates this type of terminal."), + type: 'string', + }, + title: { + description: nls.localize('vscode.extension.contributes.terminal.types.title', "Title for this type of terminal."), + type: 'string', + }, + }, + }, + }, + }, + }, +}; diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts index 91a5f251a3a..d4cdef69ff4 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -218,7 +218,7 @@ export const terminalConfiguration: IConfigurationNode = { default: false }, 'terminal.integrated.commandsToSkipShell': { - markdownDescription: localize('terminal.integrated.commandsToSkipShell', "A set of command IDs whose keybindings will not be sent to the shell and instead always be handled by Code. This allows the use of keybindings that would normally be consumed by the shell to act the same as when the terminal is not focused, for example ctrl+p to launch Quick Open. Use the command prefixed with `-` to remove default commands from the list.\nDefault Skipped Commands:\n\n{0}", DEFAULT_COMMANDS_TO_SKIP_SHELL.sort().map(command => `- ${command}`).join('\n')), + markdownDescription: localize('terminal.integrated.commandsToSkipShell', "A set of command IDs whose keybindings will not be sent to the shell and instead always be handled by VS Code. This allows the use of keybindings that would normally be consumed by the shell to act the same as when the terminal is not focused, for example ctrl+p to launch Quick Open. Use the command prefixed with `-` to remove default commands from the list.\nDefault Skipped Commands:\n\n{0}", DEFAULT_COMMANDS_TO_SKIP_SHELL.sort().map(command => `- ${command}`).join('\n')), type: 'array', items: { type: 'string' diff --git a/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.contribution.ts b/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.contribution.ts new file mode 100644 index 00000000000..86183be9c77 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.contribution.ts @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ITerminalContributionService, TerminalContributionService } from './terminalExtensionPoints'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; + +registerSingleton(ITerminalContributionService, TerminalContributionService, true); diff --git a/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.ts b/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.ts new file mode 100644 index 00000000000..3bd6a63a328 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as extensionsRegistry from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { ITerminalTypeContribution, ITerminalContributions, terminalContributionsDescriptor } from 'vs/workbench/contrib/terminal/common/terminal'; +import { flatten } from 'vs/base/common/arrays'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +// terminal extension point +export const terminalsExtPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint(terminalContributionsDescriptor); + +export interface ITerminalContributionService { + readonly _serviceBrand: undefined; + + readonly terminalTypes: ReadonlyArray; +} + +export const ITerminalContributionService = createDecorator('terminalContributionsService'); + +export class TerminalContributionService implements ITerminalContributionService { + public readonly _serviceBrand = undefined; + + private _terminalTypes: ReadonlyArray = []; + + public get terminalTypes() { + return this._terminalTypes; + } + + constructor() { + terminalsExtPoint.setHandler(contributions => { + this._terminalTypes = flatten(contributions.filter(c => c.description.enableProposedApi).map(c => c.value?.types ?? [])); + }); + } +} diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts index 43d9e84ec57..9ea3808d5ee 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts @@ -15,24 +15,29 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { registerRemoteContributions } from 'vs/workbench/contrib/terminal/electron-browser/terminalRemote'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; +import { Disposable } from 'vs/base/common/lifecycle'; -export class TerminalNativeService implements ITerminalNativeService { +export class TerminalNativeService extends Disposable implements ITerminalNativeService { public _serviceBrand: undefined; public get linuxDistro(): LinuxDistro { return linuxDistro; } - private readonly _onOpenFileRequest = new Emitter(); + private readonly _onOpenFileRequest = this._register(new Emitter()); public get onOpenFileRequest(): Event { return this._onOpenFileRequest.event; } - private readonly _onOsResume = new Emitter(); + private readonly _onOsResume = this._register(new Emitter()); public get onOsResume(): Event { return this._onOsResume.event; } constructor( @IFileService private readonly _fileService: IFileService, @IInstantiationService readonly instantiationService: IInstantiationService, - @IRemoteAgentService remoteAgentService: IRemoteAgentService + @IRemoteAgentService remoteAgentService: IRemoteAgentService, + @IElectronService electronService: IElectronService ) { + super(); + ipcRenderer.on('vscode:openFiles', (event: unknown, request: IOpenFileRequest) => this._onOpenFileRequest.fire(request)); - ipcRenderer.on('vscode:osResume', () => this._onOsResume.fire()); + this._register(electronService.onOSResume(() => this._onOsResume.fire())); const connection = remoteAgentService.getConnection(); if (connection && connection.remoteAuthority) { diff --git a/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts index a362d720738..33aca264cf7 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts @@ -48,7 +48,7 @@ export async function getMainProcessParentEnv(): Promise { // For macOS we want the "root" environment as shells by default run as login shells. It // doesn't appear to be possible to get the "root" environment as `ps eww -o command` for // PID 1 (the parent of the main process when launched from the dock/finder) returns no - // environment, because of this we will fill in the root environment using a whitelist of + // environment, because of this we will fill in the root environment using a allowlist of // environment variables that we have. if (isMacintosh) { mainProcessParentEnv = {}; @@ -129,4 +129,4 @@ export async function findExecutable(command: string, cwd?: string, paths?: stri } const fullPath = path.join(cwd, command); return await exists(fullPath) ? fullPath : undefined; -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index 1c04b6137fd..36838ff5050 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as os from 'os'; import * as path from 'vs/base/common/path'; import * as platform from 'vs/base/common/platform'; import * as pty from 'node-pty'; @@ -11,22 +10,27 @@ import * as fs from 'fs'; import { Event, Emitter } from 'vs/base/common/event'; import { getWindowsBuildNumber } from 'vs/workbench/contrib/terminal/node/terminal'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IShellLaunchConfig, ITerminalChildProcess, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE, SHELL_CWD_INVALID_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalChildProcess, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { exec } from 'child_process'; import { ILogService } from 'vs/platform/log/common/log'; import { stat } from 'vs/base/node/pfs'; import { findExecutable } from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; import { URI } from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; export class TerminalProcess extends Disposable implements ITerminalChildProcess { private _exitCode: number | undefined; + private _exitMessage: string | undefined; private _closeTimeout: any; private _ptyProcess: pty.IPty | undefined; private _currentTitle: string = ''; private _processStartupComplete: Promise | undefined; private _isDisposed: boolean = false; private _titleInterval: NodeJS.Timer | null = null; - private _initialCwd: string; + private readonly _initialCwd: string; + private readonly _ptyOptions: pty.IPtyForkOptions | pty.IWindowsPtyForkOptions; + + public get exitMessage(): string | undefined { return this._exitMessage; } private readonly _onProcessData = this._register(new Emitter()); public get onProcessData(): Event { return this._onProcessData.event; } @@ -38,7 +42,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess public get onProcessTitleChanged(): Event { return this._onProcessTitleChanged.event; } constructor( - shellLaunchConfig: IShellLaunchConfig, + private readonly _shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, @@ -47,73 +51,80 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess @ILogService private readonly _logService: ILogService ) { super(); - let shellName: string; - if (os.platform() === 'win32') { - shellName = path.basename(shellLaunchConfig.executable || ''); + let name: string; + if (platform.isWindows) { + name = path.basename(this._shellLaunchConfig.executable || ''); } else { // Using 'xterm-256color' here helps ensure that the majority of Linux distributions will use a // color prompt as defined in the default ~/.bashrc file. - shellName = 'xterm-256color'; + name = 'xterm-256color'; } - this._initialCwd = cwd; - const useConpty = windowsEnableConpty && process.platform === 'win32' && getWindowsBuildNumber() >= 18309; - const options: pty.IPtyForkOptions | pty.IWindowsPtyForkOptions = { - name: shellName, + this._ptyOptions = { + name, cwd, env, cols, rows, useConpty, // This option will force conpty to not redraw the whole viewport on launch - conptyInheritCursor: useConpty && !!shellLaunchConfig.initialText + conptyInheritCursor: useConpty && !!_shellLaunchConfig.initialText }; - - // TODO: Pull verification out into its own function - const cwdVerification = stat(cwd).then(async stat => { - if (!stat.isDirectory()) { - return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); - } - return undefined; - }, async err => { - if (err && err.code === 'ENOENT') { - // So we can include in the error message the specified CWD - shellLaunchConfig.cwd = cwd; - return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); - } - return undefined; - }); - - const executableVerification = stat(shellLaunchConfig.executable!).then(async stat => { - if (!stat.isFile() && !stat.isSymbolicLink()) { - return Promise.reject(stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE); - } - return undefined; - }, async (err) => { - if (err && err.code === 'ENOENT') { - let cwd = shellLaunchConfig.cwd instanceof URI ? shellLaunchConfig.cwd.path : shellLaunchConfig.cwd!; - // Try to get path - const envPaths: string[] | undefined = (shellLaunchConfig.env && shellLaunchConfig.env.PATH) ? shellLaunchConfig.env.PATH.split(path.delimiter) : undefined; - const executable = await findExecutable(shellLaunchConfig.executable!, cwd, envPaths); - if (!executable) { - return Promise.reject(SHELL_PATH_INVALID_EXIT_CODE); - } - } - return undefined; - }); - - Promise.all([cwdVerification, executableVerification]).then(() => { - this.setupPtyProcess(shellLaunchConfig, options); - }).catch((exitCode: number) => { - return this._launchFailed(exitCode); - }); } - private _launchFailed(exitCode: number): void { - this._exitCode = exitCode; - this._queueProcessExit(); - this._processStartupComplete = Promise.resolve(undefined); + public async start(): Promise { + const results = await Promise.all([this._validateCwd(), this._validateExecutable()]); + const firstError = results.find(r => r !== undefined); + if (firstError) { + return firstError; + } + + try { + this.setupPtyProcess(this._shellLaunchConfig, this._ptyOptions); + return undefined; + } catch (err) { + this._logService.trace('IPty#spawn native exception', err); + return { message: `A native exception occurred during launch (${err.message})` }; + } + } + + private async _validateCwd(): Promise { + try { + const result = await stat(this._initialCwd); + if (!result.isDirectory()) { + return { message: localize('launchFail.cwdNotDirectory', "Starting directory (cwd) \"{0}\" is not a directory", this._initialCwd.toString()) }; + } + } catch (err) { + if (err?.code === 'ENOENT') { + return { message: localize('launchFail.cwdDoesNotExist', "Starting directory (cwd) \"{0}\" does not exist", this._initialCwd.toString()) }; + } + } + return undefined; + } + + private async _validateExecutable(): Promise { + const slc = this._shellLaunchConfig; + if (!slc.executable) { + throw new Error('IShellLaunchConfig.executable not set'); + } + try { + const result = await stat(slc.executable); + if (!result.isFile() && !result.isSymbolicLink()) { + return { message: localize('launchFail.executableIsNotFileOrSymlink', "Path to shell executable \"{0}\" is not a file of a symlink", slc.executable) }; + } + } catch (err) { + if (err?.code === 'ENOENT') { + // The executable isn't an absolute path, try find it on the PATH or CWD + let cwd = slc.cwd instanceof URI ? slc.cwd.path : slc.cwd!; + const envPaths: string[] | undefined = (slc.env && slc.env.PATH) ? slc.env.PATH.split(path.delimiter) : undefined; + const executable = await findExecutable(slc.executable!, cwd, envPaths); + if (!executable) { + return { message: localize('launchFail.executableDoesNotExist', "Path to shell executable \"{0}\" does not exist", slc.executable) }; + } + } + } + return undefined; } private setupPtyProcess(shellLaunchConfig: IShellLaunchConfig, options: pty.IPtyForkOptions): void { @@ -124,22 +135,19 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess this._processStartupComplete = new Promise(c => { this.onProcessReady(() => c()); }); - ptyProcess.on('data', data => { + ptyProcess.onData(data => { this._onProcessData.fire(data); if (this._closeTimeout) { clearTimeout(this._closeTimeout); this._queueProcessExit(); } }); - ptyProcess.on('exit', code => { - this._exitCode = code; + ptyProcess.onExit(e => { + this._exitCode = e.exitCode; this._queueProcessExit(); }); this._setupTitlePolling(ptyProcess); - // TODO: We should no longer need to delay this since pty.spawn is sync - setTimeout(() => { - this._sendProcessId(ptyProcess); - }, 500); + this._sendProcessId(ptyProcess.pid); } public dispose(): void { @@ -200,8 +208,8 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess this.dispose(); } - private _sendProcessId(ptyProcess: pty.IPty) { - this._onProcessReady.fire({ pid: ptyProcess.pid, cwd: this._initialCwd }); + private _sendProcessId(pid: number) { + this._onProcessReady.fire({ pid, cwd: this._initialCwd }); } private _sendProcessTitle(ptyProcess: pty.IPty): void { diff --git a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts index d38285c04f7..ff3a71ec746 100644 --- a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts +++ b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts @@ -343,7 +343,7 @@ const productIconThemeDescriptor = SyncActionDescriptor.from(SelectProductIconTh Registry.as(Extensions.WorkbenchActions).registerWorkbenchAction(productIconThemeDescriptor, 'Preferences: Product Icon Theme', category); -const developerCategory = localize('developer', "Developer"); +const developerCategory = localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); const generateColorThemeDescriptor = SyncActionDescriptor.from(GenerateColorThemeAction); Registry.as(Extensions.WorkbenchActions).registerWorkbenchAction(generateColorThemeDescriptor, 'Developer: Generate Color Theme From Current Settings', developerCategory); diff --git a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts index bd7cfc2b4c8..7b07eae3303 100644 --- a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts +++ b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts @@ -22,7 +22,7 @@ import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { IListVirtualDelegate, IIdentityProvider, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list'; import { ITreeNode, ITreeRenderer, ITreeContextMenuEvent, ITreeElement } from 'vs/base/browser/ui/tree/tree'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; -import { TreeResourceNavigator, WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; +import { WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ContextKeyExpr, IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -347,7 +347,7 @@ export class TimelinePane extends ViewPane { const editor = this.editorService.activeEditor; if (editor) { - uri = toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }); + uri = toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); } if ((uri?.toString(true) === this.uri?.toString(true) && uri !== undefined) || @@ -885,6 +885,12 @@ export class TimelinePane extends ViewPane { } return element.accessibilityInformation ? element.accessibilityInformation.label : localize('timeline.aria.item', "{0}: {1}", element.relativeTime ?? '', element.label); }, + getRole(element: TreeElement): string { + if (isLoadMoreCommand(element)) { + return 'treeitem'; + } + return element.accessibilityInformation && element.accessibilityInformation.role ? element.accessibilityInformation.role : 'treeitem'; + }, getWidgetAriaLabel(): string { return localize('timeline', "Timeline"); } @@ -892,37 +898,31 @@ export class TimelinePane extends ViewPane { keyboardNavigationLabelProvider: new TimelineKeyboardNavigationLabelProvider(), overrideStyles: { listBackground: this.getBackgroundColor(), - } }); - const customTreeNavigator = new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false }); - this._register(customTreeNavigator); this._register(this.tree.onContextMenu(e => this.onContextMenu(this.commands, e))); this._register(this.tree.onDidChangeSelection(e => this.ensureValidItems())); - this._register( - customTreeNavigator.onDidOpenResource(e => { - if (!e.browserEvent || !this.ensureValidItems()) { - return; - } + this._register(this.tree.onDidOpen(e => { + if (!e.browserEvent || !this.ensureValidItems()) { + return; + } - const selection = this.tree.getSelection(); - const item = selection.length === 1 ? selection[0] : undefined; - // eslint-disable-next-line eqeqeq - if (item == null) { - return; - } + const item = e.element; + // eslint-disable-next-line eqeqeq + if (item == null) { + return; + } - if (isTimelineItem(item)) { - if (item.command) { - this.commandService.executeCommand(item.command.id, ...(item.command.arguments || [])); - } + if (isTimelineItem(item)) { + if (item.command) { + this.commandService.executeCommand(item.command.id, ...(item.command.arguments || [])); } - else if (isLoadMoreCommand(item)) { - this.loadMore(item); - } - }) - ); + } + else if (isLoadMoreCommand(item)) { + this.loadMore(item); + } + })); } private loadMore(item: LoadMoreCommand) { diff --git a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts index 7c3019903e7..d25b380ca89 100644 --- a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts +++ b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts @@ -95,10 +95,10 @@ export class ReleaseNotesManager { return true; } - private loadReleaseNotes(version: string): Promise { + private async loadReleaseNotes(version: string): Promise { const match = /^(\d+\.\d+)\./.exec(version); if (!match) { - return Promise.reject(new Error('not found')); + throw new Error('not found'); } const versionLabel = match[1].replace(/\./g, '_'); @@ -138,17 +138,30 @@ export class ReleaseNotesManager { .replace(/kbstyle\(([^\)]+)\)/gi, kbstyle); }; - if (!this._releaseNotesCache.has(version)) { - this._releaseNotesCache.set(version, this._requestService.request({ url }, CancellationToken.None) - .then(asText) - .then(text => { - if (!text || !/^#\s/.test(text)) { // release notes always starts with `#` followed by whitespace - return Promise.reject(new Error('Invalid release notes')); - } + const fetchReleaseNotes = async () => { + let text; + try { + text = await asText(await this._requestService.request({ url }, CancellationToken.None)); + } catch { + throw new Error('Failed to fetch release notes'); + } - return Promise.resolve(text); - }) - .then(text => patchKeybindings(text))); + if (!text || !/^#\s/.test(text)) { // release notes always starts with `#` followed by whitespace + throw new Error('Invalid release notes'); + } + + return patchKeybindings(text); + }; + + if (!this._releaseNotesCache.has(version)) { + this._releaseNotesCache.set(version, (async () => { + try { + return await fetchReleaseNotes(); + } catch (err) { + this._releaseNotesCache.delete(version); + throw err; + } + })()); } return this._releaseNotesCache.get(version)!; diff --git a/src/vs/workbench/contrib/update/browser/update.ts b/src/vs/workbench/contrib/update/browser/update.ts index 8739dd769d6..c328064ed42 100644 --- a/src/vs/workbench/contrib/update/browser/update.ts +++ b/src/vs/workbench/contrib/update/browser/update.ts @@ -16,7 +16,6 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { IUpdateService, State as UpdateState, StateType, IUpdate } from 'vs/platform/update/common/update'; import * as semver from 'semver-umd'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ReleaseNotesManager } from './releaseNotesEditor'; import { isWindows } from 'vs/base/common/platform'; @@ -51,12 +50,12 @@ export class OpenLatestReleaseNotesInBrowserAction extends Action { super('update.openLatestReleaseNotes', nls.localize('releaseNotes', "Release Notes"), undefined, true); } - run(): Promise { + async run(): Promise { if (this.productService.releaseNotesUrl) { const uri = URI.parse(this.productService.releaseNotesUrl); - return this.openerService.open(uri); + await this.openerService.open(uri); } - return Promise.resolve(false); + throw new Error('This version of Visual Studio Code does not have release notes online'); } } @@ -71,18 +70,22 @@ export abstract class AbstractShowReleaseNotesAction extends Action { super(id, label, undefined, true); } - run(): Promise { + async run(): Promise { if (!this.enabled) { - return Promise.resolve(false); + return; } - this.enabled = false; - return showReleaseNotes(this.instantiationService, this.version) - .then(undefined, () => { - const action = this.instantiationService.createInstance(OpenLatestReleaseNotesInBrowserAction); - return action.run().then(() => false); - }); + try { + await showReleaseNotes(this.instantiationService, this.version); + } catch (err) { + const action = this.instantiationService.createInstance(OpenLatestReleaseNotesInBrowserAction); + try { + await action.run(); + } catch (err2) { + throw new Error(`${err.message} and ${err2.message}`); + } + } } } @@ -174,7 +177,6 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu @IStorageService private readonly storageService: IStorageService, @IInstantiationService private readonly instantiationService: IInstantiationService, @INotificationService private readonly notificationService: INotificationService, - @IDialogService private readonly dialogService: IDialogService, @IUpdateService private readonly updateService: IUpdateService, @IActivityService private readonly activityService: IActivityService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @@ -273,11 +275,7 @@ export class UpdateContribution extends Disposable implements IWorkbenchContribu } private onUpdateNotAvailable(): void { - this.dialogService.show( - severity.Info, - nls.localize('noUpdatesAvailable', "There are currently no updates available."), - [nls.localize('ok', "OK")] - ); + this.notificationService.info(nls.localize('noUpdatesAvailable', "There are currently no updates available.")); } // linux diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService.ts index 7529104c1ca..b68f3a102a1 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; import { Event } from 'vs/base/common/event'; import { UserDataAutoSyncService as BaseUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -11,26 +11,31 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { UserDataSyncTrigger } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; export class UserDataAutoSyncService extends BaseUserDataAutoSyncService { constructor( @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IUserDataSyncService userDataSyncService: IUserDataSyncService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IUserDataSyncAccountService authTokenService: IUserDataSyncAccountService, @IInstantiationService instantiationService: IInstantiationService, @IHostService hostService: IHostService, @ITelemetryService telemetryService: ITelemetryService, + @IUserDataSyncMachinesService userDataSyncMachinesService: IUserDataSyncMachinesService, + @IStorageService storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService, ) { - super(userDataSyncStoreService, userDataSyncEnablementService, userDataSyncService, logService, authTokenService, telemetryService); + super(userDataSyncStoreService, userDataSyncResourceEnablementService, userDataSyncService, logService, authTokenService, telemetryService, userDataSyncMachinesService, storageService, environmentService); this._register(Event.debounce(Event.any( Event.map(hostService.onDidChangeFocus, () => 'windowFocus'), instantiationService.createInstance(UserDataSyncTrigger).onDidTriggerSync, - userDataSyncService.onDidChangeLocal, - ), (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerAutoSync(sources))); + ), (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerSync(sources, true))); } } diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts index 7c7aa24f106..ef0e9e8afb3 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts @@ -26,6 +26,7 @@ class UserDataSyncReportIssueContribution extends Disposable implements IWorkben private onAutoSyncError(error: UserDataSyncError): void { switch (error.code) { case UserDataSyncErrorCode.LocalTooManyRequests: + case UserDataSyncErrorCode.TooManyRequests: this.notificationService.notify({ severity: Severity.Error, message: localize('too many requests', "Turned off syncing preferences on this device because it is making too many requests."), diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index 6dda6b23ef3..436487eab2f 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -29,7 +29,7 @@ import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/plat import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUserDataAutoSyncService, IUserDataSyncService, registerConfiguration, - SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME, IUserDataSyncEnablementService, + SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME, IUserDataSyncResourceEnablementService, SyncResourceConflicts, Conflict, getSyncResourceFromLocalPreview } from 'vs/platform/userDataSync/common/userDataSync'; import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWidgets'; @@ -53,7 +53,7 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { Codicon } from 'vs/base/common/codicons'; import { ViewContainerLocation, IViewContainersRegistry, Extensions, ViewContainer } from 'vs/workbench/common/views'; import { UserDataSyncViewPaneContainer, UserDataSyncDataViews } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncViews'; -import { IUserDataSyncWorkbenchService, CONTEXT_ENABLE_VIEWS, getSyncAreaLabel, AccountStatus, CONTEXT_SYNC_STATE, CONTEXT_SYNC_ENABLEMENT, CONTEXT_ACCOUNT_STATE, CONFIGURE_SYNC_COMMAND_ID, ENABLE_SYNC_VIEWS_COMMAND_ID, SHOW_SYNC_LOG_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync'; +import { IUserDataSyncWorkbenchService, CONTEXT_ENABLE_VIEWS, getSyncAreaLabel, AccountStatus, CONTEXT_SYNC_STATE, CONTEXT_SYNC_ENABLEMENT, CONTEXT_ACCOUNT_STATE, CONFIGURE_SYNC_COMMAND_ID, ENABLE_SYNC_VIEWS_COMMAND_ID, SHOW_SYNC_LOG_COMMAND_ID, SHOW_SYNCED_DATA_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync'; const CONTEXT_CONFLICTS_SOURCES = new RawContextKey('conflictsSources', ''); @@ -75,10 +75,10 @@ const syncNowCommand = { title: localize('sync now', "Preferences Sync: Sync Now"), description(userDataSyncService: IUserDataSyncService): string | undefined { if (userDataSyncService.status === SyncStatus.Syncing) { - return localize('sync is on with syncing', "syncing"); + return localize('syncing', "syncing"); } if (userDataSyncService.lastSyncTime) { - return localize('sync is on with time', "synced {0}", fromNow(userDataSyncService.lastSyncTime, true)); + return localize('synced with time', "synced {0}", fromNow(userDataSyncService.lastSyncTime, true)); } return undefined; } @@ -97,7 +97,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private readonly accountBadgeDisposable = this._register(new MutableDisposable()); constructor( - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService private readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, @IUserDataSyncWorkbenchService private readonly userDataSyncWorkbenchService: IUserDataSyncWorkbenchService, @IContextKeyService contextKeyService: IContextKeyService, @@ -110,7 +110,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo @IInstantiationService private readonly instantiationService: IInstantiationService, @IOutputService private readonly outputService: IOutputService, @IUserDataSyncAccountService readonly authTokenService: IUserDataSyncAccountService, - @IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService, + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, @ITextModelService private readonly textModelResolverService: ITextModelService, @IPreferencesService private readonly preferencesService: IPreferencesService, @ITelemetryService private readonly telemetryService: ITelemetryService, @@ -134,7 +134,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo this._register(Event.any( Event.debounce(userDataSyncService.onDidChangeStatus, () => undefined, 500), - this.userDataSyncEnablementService.onDidChangeEnablement, + this.userDataAutoSyncService.onDidChangeEnablement, this.userDataSyncWorkbenchService.onDidChangeAccountStatus )(() => { this.updateAccountBadge(); @@ -143,6 +143,8 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo this._register(userDataSyncService.onDidChangeConflicts(() => this.onDidChangeConflicts(this.userDataSyncService.conflicts))); this._register(userDataSyncService.onSyncErrors(errors => this.onSynchronizerErrors(errors))); this._register(userDataAutoSyncService.onError(error => this.onAutoSyncError(error))); + this._register(userDataAutoSyncService.onTurnOnSync(() => this.turningOnSync = true)); + this._register(userDataAutoSyncService.onDidTurnOnSync(() => this.turningOnSync = false)); this.registerActions(); this.registerViews(); @@ -176,7 +178,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo // close stale conflicts editor previews if (conflictsEditorInputs.length) { conflictsEditorInputs.forEach(input => { - if (!conflicts.some(({ local }) => isEqual(local, input.master.resource))) { + if (!conflicts.some(({ local }) => isEqual(local, input.primary.resource))) { input.dispose(); } }); @@ -268,11 +270,19 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private onAutoSyncError(error: UserDataSyncError): void { switch (error.code) { - case UserDataSyncErrorCode.TurnedOff: case UserDataSyncErrorCode.SessionExpired: this.notificationService.notify({ severity: Severity.Info, - message: localize('turned off', "Preferences sync was turned off from another device."), + message: localize('session expired', "Preferences sync was turned off because current session is expired, please sign in again to turn on sync."), + actions: { + primary: [new Action('turn on sync', localize('turn on sync', "Turn on Preferences Sync..."), undefined, true, () => this.turnOn())] + } + }); + break; + case UserDataSyncErrorCode.TurnedOff: + this.notificationService.notify({ + severity: Severity.Info, + message: localize('turned off', "Preferences sync was turned off from another device, please sign in again to turn on sync."), actions: { primary: [new Action('turn on sync', localize('turn on sync', "Turn on Preferences Sync..."), undefined, true, () => this.turnOn())] } @@ -288,7 +298,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo case UserDataSyncErrorCode.Incompatible: case UserDataSyncErrorCode.Gone: case UserDataSyncErrorCode.UpgradeRequired: - this.disableSync(); + this.userDataSyncWorkbenchService.turnoff(false); this.notificationService.notify({ severity: Severity.Error, message: localize('error upgrade required', "Preferences sync is disabled because the current version ({0}, {1}) is not compatible with the sync service. Please update before turning on sync.", this.productService.version, this.productService.commit), @@ -338,7 +348,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo return; } const resource = source === SyncResource.Settings ? this.workbenchEnvironmentService.settingsResource : this.workbenchEnvironmentService.keybindingsResource; - if (isEqual(resource, toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER }))) { + if (isEqual(resource, toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }))) { // Do not show notification if the file in error is active return; } @@ -383,7 +393,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo let badge: IBadge | undefined = undefined; - if (this.userDataSyncService.status !== SyncStatus.Uninitialized && this.userDataSyncEnablementService.isEnabled() && this.userDataSyncWorkbenchService.accountStatus === AccountStatus.Unavailable) { + if (this.userDataSyncService.status !== SyncStatus.Uninitialized && this.userDataAutoSyncService.isEnabled() && this.userDataSyncWorkbenchService.accountStatus === AccountStatus.Unavailable) { badge = new NumberBadge(1, () => localize('sign in to sync preferences', "Sign in to Sync Preferences")); } @@ -402,7 +412,6 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } private async turnOn(): Promise { - this.turningOnSync = true; try { if (!this.storageService.getBoolean('sync.donotAskPreviewConfirmation', StorageScope.GLOBAL, false)) { if (!await this.askForConfirmation()) { @@ -438,8 +447,6 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } } this.notificationService.error(localize('turn on failed', "Error while starting Sync: {0}", toErrorMessage(e))); - } finally { - this.turningOnSync = false; } } @@ -486,7 +493,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo quickPick.ignoreFocusOut = true; const items = this.getConfigureSyncQuickPickItems(); quickPick.items = items; - quickPick.selectedItems = items.filter(item => this.userDataSyncEnablementService.isResourceEnabled(item.id)); + quickPick.selectedItems = items.filter(item => this.userDataSyncResourceEnablementService.isResourceEnabled(item.id)); let accepted: boolean = false; disposables.add(Event.any(quickPick.onDidAccept, quickPick.onDidCustom)(() => { accepted = true; @@ -529,10 +536,10 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private updateConfiguration(items: ConfigureSyncQuickPickItem[], selectedItems: ReadonlyArray): void { for (const item of items) { - const wasEnabled = this.userDataSyncEnablementService.isResourceEnabled(item.id); + const wasEnabled = this.userDataSyncResourceEnablementService.isResourceEnabled(item.id); const isEnabled = !!selectedItems.filter(selected => selected.id === item.id)[0]; if (wasEnabled !== isEnabled) { - this.userDataSyncEnablementService.setResourceEnablement(item.id!, isEnabled); + this.userDataSyncResourceEnablementService.setResourceEnablement(item.id!, isEnabled); } } } @@ -549,7 +556,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo quickPick.ok = true; const items = this.getConfigureSyncQuickPickItems(); quickPick.items = items; - quickPick.selectedItems = items.filter(item => this.userDataSyncEnablementService.isResourceEnabled(item.id)); + quickPick.selectedItems = items.filter(item => this.userDataSyncResourceEnablementService.isResourceEnabled(item.id)); disposables.add(quickPick.onDidAccept(async () => { if (quickPick.selectedItems.length) { this.updateConfiguration(items, quickPick.selectedItems); @@ -570,39 +577,35 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo message: localize('turn off sync confirmation', "Do you want to turn off sync?"), detail: localize('turn off sync detail', "Your settings, keybindings, extensions and UI State will no longer be synced."), primaryButton: localize('turn off', "Turn Off"), - checkbox: { + checkbox: this.userDataSyncWorkbenchService.accountStatus === AccountStatus.Available ? { label: localize('turn off sync everywhere', "Turn off sync on all your devices and clear the data from the cloud.") - } + } : undefined }); if (result.confirmed) { return this.userDataSyncWorkbenchService.turnoff(!!result.checkboxChecked); } } - private disableSync(source?: SyncResource): void { - if (source === undefined) { - this.userDataSyncEnablementService.setEnablement(false); - } else { - switch (source) { - case SyncResource.Settings: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Settings, false); - case SyncResource.Keybindings: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Keybindings, false); - case SyncResource.Snippets: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Snippets, false); - case SyncResource.Extensions: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Extensions, false); - case SyncResource.GlobalState: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.GlobalState, false); - } + private disableSync(source: SyncResource): void { + switch (source) { + case SyncResource.Settings: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.Settings, false); + case SyncResource.Keybindings: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.Keybindings, false); + case SyncResource.Snippets: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.Snippets, false); + case SyncResource.Extensions: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.Extensions, false); + case SyncResource.GlobalState: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.GlobalState, false); } } private getConflictsEditorInputs(syncResource: SyncResource): DiffEditorInput[] { return this.editorService.editors.filter(input => { - const resource = input instanceof DiffEditorInput ? input.master.resource : input.resource; + const resource = input instanceof DiffEditorInput ? input.primary.resource : input.resource; return resource && getSyncResourceFromLocalPreview(resource!, this.workbenchEnvironmentService) === syncResource; }) as DiffEditorInput[]; } private getAllConflictsEditorInputs(): IEditorInput[] { return this.editorService.editors.filter(input => { - const resource = input instanceof DiffEditorInput ? input.master.resource : input.resource; + const resource = input instanceof DiffEditorInput ? input.primary.resource : input.resource; return resource && getSyncResourceFromLocalPreview(resource!, this.workbenchEnvironmentService) !== undefined; }); } @@ -642,7 +645,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } private registerActions(): void { - if (this.userDataSyncEnablementService.canToggleEnablement()) { + if (this.userDataAutoSyncService.canToggleEnablement()) { this.registerTurnOnSyncAction(); this.registerTurnOffSyncAction(); } @@ -891,9 +894,11 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo items.push({ type: 'separator' }); } items.push({ id: configureSyncCommand.id, label: configureSyncCommand.title }); + items.push({ id: showSyncSettingsCommand.id, label: showSyncSettingsCommand.title }); + items.push({ id: SHOW_SYNCED_DATA_COMMAND_ID, label: localize('show synced data', "Preferences Sync: Show Synced Data") }); items.push({ type: 'separator' }); items.push({ id: syncNowCommand.id, label: syncNowCommand.title, description: syncNowCommand.description(that.userDataSyncService) }); - if (that.userDataSyncEnablementService.canToggleEnablement()) { + if (that.userDataAutoSyncService.canToggleEnablement()) { const account = that.userDataSyncWorkbenchService.current; items.push({ id: turnOffSyncCommand.id, label: turnOffSyncCommand.title, description: account ? `${account.accountName} (${that.authenticationService.getDisplayName(account.authenticationProviderId)})` : undefined }); } @@ -945,8 +950,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo }); } run(accessor: ServicesAccessor): Promise { - accessor.get(ITelemetryService).publicLog2(`sync/actions/${syncNowCommand.id}`); - return that.userDataSyncService.sync(); + return that.userDataAutoSyncService.triggerSync([syncNowCommand.id], false); } })); } diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts index c81d616476c..7fb10cb47a8 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts @@ -7,16 +7,15 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IViewsRegistry, Extensions, ITreeViewDescriptor, ITreeViewDataProvider, ITreeItem, TreeItemCollapsibleState, IViewsService, TreeViewItemHandleArg, ViewContainer, IViewDescriptorService } from 'vs/workbench/common/views'; import { localize } from 'vs/nls'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { TreeViewPane, TreeView } from 'vs/workbench/browser/parts/views/treeView'; +import { TreeViewPane } from 'vs/workbench/browser/parts/views/treeView'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { ALL_SYNC_RESOURCES, SyncResource, IUserDataSyncService, ISyncResourceHandle, SyncStatus, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { ALL_SYNC_RESOURCES, SyncResource, IUserDataSyncService, ISyncResourceHandle as IResourceHandle, SyncStatus, IUserDataSyncResourceEnablementService, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { registerAction2, Action2, MenuId } from 'vs/platform/actions/common/actions'; -import { ContextKeyExpr, ContextKeyEqualsExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpr, ContextKeyEqualsExpr } from 'vs/platform/contextkey/common/contextkey'; import { URI } from 'vs/base/common/uri'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { FolderThemeIcon, IThemeService } from 'vs/platform/theme/common/themeService'; import { fromNow } from 'vs/base/common/date'; -import { pad } from 'vs/base/common/strings'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { Event } from 'vs/base/common/event'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -35,12 +34,15 @@ import { IUserDataSyncWorkbenchService, CONTEXT_SYNC_STATE, getSyncAreaLabel, CO import { IUserDataSyncMachinesService, IUserDataSyncMachine } from 'vs/platform/userDataSync/common/userDataSyncMachines'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { generateUuid } from 'vs/base/common/uuid'; +import { TreeView } from 'vs/workbench/contrib/views/browser/treeView'; +import { flatten } from 'vs/base/common/arrays'; export class UserDataSyncViewPaneContainer extends ViewPaneContainer { constructor( containerId: string, + @IDialogService private readonly dialogService: IDialogService, + @IUserDataSyncWorkbenchService private readonly userDataSyncWorkbenchService: IUserDataSyncWorkbenchService, @ICommandService private readonly commandService: ICommandService, @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, @ITelemetryService telemetryService: ITelemetryService, @@ -63,6 +65,24 @@ export class UserDataSyncViewPaneContainer extends ViewPaneContainer { ]; } + getSecondaryActions(): IAction[] { + return [ + new Action('workbench.actions.syncData.reset', localize('workbench.actions.syncData.reset', "Reset Synced Data"), undefined, true, () => this.reset()), + ]; + } + + private async reset(): Promise { + const result = await this.dialogService.confirm({ + message: localize('reset', "This will clear your synced data from the cloud and stop sync on all your devices."), + title: localize('reset title', "Reset Synced Data"), + type: 'info', + primaryButton: localize('reset button', "Reset"), + }); + if (result.confirmed) { + await this.userDataSyncWorkbenchService.turnoff(true); + } + } + } export class UserDataSyncDataViews extends Disposable { @@ -70,45 +90,41 @@ export class UserDataSyncDataViews extends Disposable { constructor( container: ViewContainer, @IInstantiationService private readonly instantiationService: IInstantiationService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, - @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, + @IUserDataSyncResourceEnablementService private readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, ) { super(); this.registerViews(container); } private registerViews(container: ViewContainer): void { - const remoteView = this.registerDataView(container, true, true); - this.registerRemoteViewActions(remoteView); - - this.registerDataView(container, false, false); + this.registerSyncedDataView(container); this.registerMachinesView(container); + + this.registerActivityView(container, true); + this.registerActivityView(container, false); } - private registerDataView(container: ViewContainer, remote: boolean, showByDefault: boolean): TreeView { - const id = `workbench.views.sync.${remote ? 'remote' : 'local'}DataView`; - const showByDefaultContext = new RawContextKey(id, showByDefault); - const viewEnablementContext = showByDefaultContext.bindTo(this.contextKeyService); - const name = remote ? localize('remote title', "Synced Data") : localize('local title', "Local Backup"); + private registerSyncedDataView(container: ViewContainer): void { + const id = `workbench.views.syncedDataView`; + const name = localize('remote title', "Synced Data"); const treeView = this.instantiationService.createInstance(TreeView, id, name); - treeView.showCollapseAllAction = true; treeView.showRefreshAction = true; const disposable = treeView.onDidChangeVisibility(visible => { if (visible && !treeView.dataProvider) { disposable.dispose(); - treeView.dataProvider = remote ? this.instantiationService.createInstance(RemoteUserDataSyncHistoryViewDataProvider) - : this.instantiationService.createInstance(LocalUserDataSyncHistoryViewDataProvider); + treeView.dataProvider = this.instantiationService.createInstance(SyncedDataViewDataProvider); } }); - this._register(Event.any(this.userDataSyncEnablementService.onDidChangeResourceEnablement, this.userDataSyncEnablementService.onDidChangeEnablement)(() => treeView.refresh())); + this._register(Event.any(this.userDataSyncResourceEnablementService.onDidChangeResourceEnablement, this.userDataAutoSyncService.onDidChangeEnablement)(() => treeView.refresh())); const viewsRegistry = Registry.as(Extensions.ViewsRegistry); viewsRegistry.registerViews([{ id, name, ctorDescriptor: new SyncDescriptor(TreeViewPane), - when: ContextKeyExpr.and(CONTEXT_SYNC_STATE.notEqualsTo(SyncStatus.Uninitialized), CONTEXT_ACCOUNT_STATE.isEqualTo(AccountStatus.Available), CONTEXT_ENABLE_VIEWS, showByDefaultContext), + when: ContextKeyExpr.and(CONTEXT_SYNC_STATE.notEqualsTo(SyncStatus.Uninitialized), CONTEXT_ACCOUNT_STATE.isEqualTo(AccountStatus.Available), CONTEXT_ENABLE_VIEWS), canToggleVisibility: true, - canMoveView: true, + canMoveView: false, treeView, collapsed: false, order: 100, @@ -117,10 +133,8 @@ export class UserDataSyncDataViews extends Disposable { registerAction2(class extends Action2 { constructor() { super({ - id: remote ? SHOW_SYNCED_DATA_COMMAND_ID : 'workbench.userDataSync.actions.showLocalBackupData', - title: remote ? - { value: localize('workbench.action.showSyncRemoteBackup', "Show Synced Data"), original: `Show Synced Data` } - : { value: localize('workbench.action.showSyncLocalBackup', "Show Local Backup"), original: `Show Local Backup` }, + id: SHOW_SYNCED_DATA_COMMAND_ID, + title: { value: localize('workbench.action.showSyncRemoteBackup', "Show Synced Data"), original: `Show Synced Data` }, category: { value: localize('sync preferences', "Preferences Sync"), original: `Preferences Sync` }, menu: { id: MenuId.CommandPalette, @@ -134,7 +148,6 @@ export class UserDataSyncDataViews extends Disposable { const commandService = accessor.get(ICommandService); await commandService.executeCommand(ENABLE_SYNC_VIEWS_COMMAND_ID); - viewEnablementContext.set(true); const viewContainer = viewDescriptorService.getViewContainerByViewId(id); if (viewContainer) { @@ -154,7 +167,6 @@ export class UserDataSyncDataViews extends Disposable { }); this.registerDataViewActions(id); - return treeView; } private registerMachinesView(container: ViewContainer): void { @@ -169,7 +181,7 @@ export class UserDataSyncDataViews extends Disposable { treeView.dataProvider = dataProvider; } }); - this._register(Event.any(this.userDataSyncEnablementService.onDidChangeResourceEnablement, this.userDataSyncEnablementService.onDidChangeEnablement)(() => treeView.refresh())); + this._register(Event.any(this.userDataSyncResourceEnablementService.onDidChangeResourceEnablement, this.userDataAutoSyncService.onDidChangeEnablement)(() => treeView.refresh())); const viewsRegistry = Registry.as(Extensions.ViewsRegistry); viewsRegistry.registerViews([{ id, @@ -177,7 +189,7 @@ export class UserDataSyncDataViews extends Disposable { ctorDescriptor: new SyncDescriptor(TreeViewPane), when: ContextKeyExpr.and(CONTEXT_SYNC_STATE.notEqualsTo(SyncStatus.Uninitialized), CONTEXT_ACCOUNT_STATE.isEqualTo(AccountStatus.Available), CONTEXT_ENABLE_VIEWS), canToggleVisibility: true, - canMoveView: true, + canMoveView: false, treeView, collapsed: false, order: 200, @@ -186,12 +198,12 @@ export class UserDataSyncDataViews extends Disposable { registerAction2(class extends Action2 { constructor() { super({ - id: `workbench.actions.sync.editCurrentMachineName`, - title: localize('workbench.actions.sync.editCurrentMachineName', "Edit Name"), + id: `workbench.actions.sync.editMachineName`, + title: localize('workbench.actions.sync.editMachineName', "Edit Name"), icon: Codicon.edit, menu: { id: MenuId.ViewItemContext, - when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', id), ContextKeyEqualsExpr.create('viewItem', 'sync-machine')), + when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', id)), group: 'inline', }, }); @@ -203,6 +215,56 @@ export class UserDataSyncDataViews extends Disposable { } } }); + + registerAction2(class extends Action2 { + constructor() { + super({ + id: `workbench.actions.sync.turnOffSyncOnMachine`, + title: localize('workbench.actions.sync.turnOffSyncOnMachine', "Turn off Preferences Sync"), + menu: { + id: MenuId.ViewItemContext, + when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', id), ContextKeyEqualsExpr.create('viewItem', 'sync-machine')), + }, + }); + } + async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { + if (await dataProvider.disable(handle.$treeItemHandle)) { + await treeView.refresh(); + } + } + }); + + } + + private registerActivityView(container: ViewContainer, remote: boolean): void { + const id = `workbench.views.sync.${remote ? 'remote' : 'local'}Activity`; + const name = remote ? localize('remote sync activity title', "Sync Activity (Remote)") : localize('local sync activity title', "Sync Activity (Local)"); + const treeView = this.instantiationService.createInstance(TreeView, id, name); + treeView.showCollapseAllAction = true; + treeView.showRefreshAction = true; + const disposable = treeView.onDidChangeVisibility(visible => { + if (visible && !treeView.dataProvider) { + disposable.dispose(); + treeView.dataProvider = remote ? this.instantiationService.createInstance(RemoteUserDataSyncActivityViewDataProvider) + : this.instantiationService.createInstance(LocalUserDataSyncActivityViewDataProvider); + } + }); + this._register(Event.any(this.userDataSyncResourceEnablementService.onDidChangeResourceEnablement, this.userDataAutoSyncService.onDidChangeEnablement)(() => treeView.refresh())); + const viewsRegistry = Registry.as(Extensions.ViewsRegistry); + viewsRegistry.registerViews([{ + id, + name, + ctorDescriptor: new SyncDescriptor(TreeViewPane), + when: ContextKeyExpr.and(CONTEXT_SYNC_STATE.notEqualsTo(SyncStatus.Uninitialized), CONTEXT_ACCOUNT_STATE.isEqualTo(AccountStatus.Available), CONTEXT_ENABLE_VIEWS), + canToggleVisibility: true, + canMoveView: false, + treeView, + collapsed: false, + order: 300, + hideByDefault: true, + }], container); + + this.registerDataViewActions(id); } private registerDataViewActions(viewId: string) { @@ -229,7 +291,7 @@ export class UserDataSyncDataViews extends Disposable { super({ id: `workbench.actions.sync.replaceCurrent`, title: localize('workbench.actions.sync.replaceCurrent', "Restore"), - icon: { id: 'codicon/cloud-download' }, + icon: { id: 'codicon/discard' }, menu: { id: MenuId.ViewItemContext, when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', viewId), ContextKeyExpr.regex('viewItem', /sync-resource-.*/i)), @@ -242,7 +304,7 @@ export class UserDataSyncDataViews extends Disposable { const userDataSyncService = accessor.get(IUserDataSyncService); const { resource, syncResource } = <{ resource: string, syncResource: SyncResource }>JSON.parse(handle.$treeItemHandle); const result = await dialogService.confirm({ - message: localize('confirm replace', "Would you like to replace your current {0} with selected?", getSyncAreaLabel(syncResource)), + message: localize({ key: 'confirm replace', comment: ['A confirmation message to replace current user data (settings, extensions, keybindings, snippets) with selected version'] }, "Would you like to replace your current {0} with selected?", getSyncAreaLabel(syncResource)), type: 'info', title: localize('preferences sync', "Preferences Sync") }); @@ -255,8 +317,8 @@ export class UserDataSyncDataViews extends Disposable { registerAction2(class extends Action2 { constructor() { super({ - id: `workbench.actions.sync.commpareWithLocal`, - title: localize('workbench.actions.sync.commpareWithLocal', "Open Changes"), + id: `workbench.actions.sync.compareWithLocal`, + title: localize({ key: 'workbench.actions.sync.compareWithLocal', comment: ['This is an action title to show the changes between local and remote version of resources'] }, "Open Changes"), }); } async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { @@ -278,50 +340,23 @@ export class UserDataSyncDataViews extends Disposable { }); } - private registerRemoteViewActions(view: TreeView) { - this.registerResetAction(view); - } - - private registerResetAction(view: TreeView) { - registerAction2(class extends Action2 { - constructor() { - super({ - id: `workbench.actions.syncData.reset`, - title: localize('workbench.actions.syncData.reset', "Reset Synced Data"), - menu: { - id: MenuId.ViewTitle, - when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', view.id)), - }, - }); - } - async run(accessor: ServicesAccessor): Promise { - const dialogService = accessor.get(IDialogService); - const userDataSyncWorkbenchService = accessor.get(IUserDataSyncWorkbenchService); - const result = await dialogService.confirm({ - message: localize('reset', "This will clear your synced data from the cloud and stop sync on all your devices."), - title: localize('reset title', "Reset Synced Data"), - type: 'info', - primaryButton: localize('reset button', "Reset"), - }); - if (result.confirmed) { - await userDataSyncWorkbenchService.turnoff(true); - await view.refresh(); - } - } - }); - } } -interface SyncResourceTreeItem extends ITreeItem { - resource: SyncResource; - resourceHandle: ISyncResourceHandle; +interface ISyncResourceHandle extends IResourceHandle { + syncResource: SyncResource } -abstract class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvider { +interface SyncResourceHandleTreeItem extends ITreeItem { + syncResourceHandle: ISyncResourceHandle; +} + +abstract class UserDataSyncActivityViewDataProvider implements ITreeViewDataProvider { + + private syncResourceHandlesPromise: Promise | undefined; constructor( @IUserDataSyncService protected readonly userDataSyncService: IUserDataSyncService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataAutoSyncService protected readonly userDataAutoSyncService: IUserDataAutoSyncService, @INotificationService private readonly notificationService: INotificationService, ) { } @@ -330,12 +365,8 @@ abstract class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvi if (!element) { return await this.getRoots(); } - const syncResource = ALL_SYNC_RESOURCES.filter(key => key === element.handle)[0] as SyncResource; - if (syncResource) { - return await this.getChildrenForSyncResource(syncResource); - } - if ((element).resourceHandle) { - return await this.getChildrenForSyncResourceTreeItem(element); + if ((element).syncResourceHandle) { + return await this.getChildrenForSyncResourceTreeItem(element); } return []; } catch (error) { @@ -344,44 +375,27 @@ abstract class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvi } } - protected async getRoots(): Promise { - return ALL_SYNC_RESOURCES.map(resourceKey => ({ - handle: resourceKey, - collapsibleState: TreeItemCollapsibleState.Collapsed, - label: { label: getSyncAreaLabel(resourceKey) }, - description: !this.userDataSyncEnablementService.isEnabled() || this.userDataSyncEnablementService.isResourceEnabled(resourceKey) ? undefined : localize('not syncing', "Not syncing"), - themeIcon: FolderThemeIcon, - contextValue: resourceKey - })); + private async getRoots(): Promise { + this.syncResourceHandlesPromise = undefined; + + const syncResourceHandles = await this.getSyncResourceHandles(); + + return syncResourceHandles.map(syncResourceHandle => { + const handle = JSON.stringify({ resource: syncResourceHandle.uri.toString(), syncResource: syncResourceHandle.syncResource }); + return { + handle, + collapsibleState: TreeItemCollapsibleState.Collapsed, + label: { label: getSyncAreaLabel(syncResourceHandle.syncResource) }, + description: fromNow(syncResourceHandle.created, true), + themeIcon: FolderThemeIcon, + syncResourceHandle, + contextValue: `sync-resource-${syncResourceHandle.syncResource}` + }; + }); } - protected async getChildrenForSyncResource(syncResource: SyncResource): Promise { - const refHandles = await this.getSyncResourceHandles(syncResource); - if (refHandles.length) { - return refHandles.map(({ uri, created }) => { - const handle = JSON.stringify({ resource: uri.toString(), syncResource }); - return { - handle, - collapsibleState: TreeItemCollapsibleState.Collapsed, - label: { label: label(new Date(created)) }, - description: fromNow(created, true), - resourceUri: uri, - resource: syncResource, - resourceHandle: { uri, created }, - contextValue: `sync-resource-${syncResource}` - }; - }); - } else { - return [{ - handle: generateUuid(), - collapsibleState: TreeItemCollapsibleState.None, - label: { label: localize('no data', "No Data") }, - }]; - } - } - - protected async getChildrenForSyncResourceTreeItem(element: SyncResourceTreeItem): Promise { - const associatedResources = await this.userDataSyncService.getAssociatedResources((element).resource, (element).resourceHandle); + protected async getChildrenForSyncResourceTreeItem(element: SyncResourceHandleTreeItem): Promise { + const associatedResources = await this.userDataSyncService.getAssociatedResources((element).syncResourceHandle.syncResource, (element).syncResourceHandle); return associatedResources.map(({ resource, comparableResource }) => { const handle = JSON.stringify({ resource: resource.toString(), comparableResource: comparableResource?.toString() }); return { @@ -389,32 +403,42 @@ abstract class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvi collapsibleState: TreeItemCollapsibleState.None, resourceUri: resource, command: { id: `workbench.actions.sync.commpareWithLocal`, title: '', arguments: [{ $treeViewId: '', $treeItemHandle: handle }] }, - contextValue: `sync-associatedResource-${(element).resource}` + contextValue: `sync-associatedResource-${(element).syncResourceHandle.syncResource}` }; }); } - protected abstract getSyncResourceHandles(syncResource: SyncResource): Promise; + private getSyncResourceHandles(): Promise { + if (this.syncResourceHandlesPromise === undefined) { + this.syncResourceHandlesPromise = Promise.all(ALL_SYNC_RESOURCES.map(async syncResource => { + const resourceHandles = await this.getResourceHandles(syncResource); + return resourceHandles.map(resourceHandle => ({ ...resourceHandle, syncResource })); + })).then(result => flatten(result).sort((a, b) => b.created - a.created)); + } + return this.syncResourceHandlesPromise; + } + + protected abstract getResourceHandles(syncResource: SyncResource): Promise; } -class LocalUserDataSyncHistoryViewDataProvider extends UserDataSyncHistoryViewDataProvider { +class LocalUserDataSyncActivityViewDataProvider extends UserDataSyncActivityViewDataProvider { - protected getSyncResourceHandles(syncResource: SyncResource): Promise { + protected getResourceHandles(syncResource: SyncResource): Promise { return this.userDataSyncService.getLocalSyncResourceHandles(syncResource); } } -class RemoteUserDataSyncHistoryViewDataProvider extends UserDataSyncHistoryViewDataProvider { +class RemoteUserDataSyncActivityViewDataProvider extends UserDataSyncActivityViewDataProvider { private machinesPromise: Promise | undefined; constructor( @IUserDataSyncService userDataSyncService: IUserDataSyncService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService, @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, @INotificationService notificationService: INotificationService, ) { - super(userDataSyncService, userDataSyncEnablementService, notificationService); + super(userDataSyncService, userDataAutoSyncService, notificationService); } async getChildren(element?: ITreeItem): Promise { @@ -431,27 +455,30 @@ class RemoteUserDataSyncHistoryViewDataProvider extends UserDataSyncHistoryViewD return this.machinesPromise; } - protected getSyncResourceHandles(syncResource: SyncResource): Promise { + protected getResourceHandles(syncResource: SyncResource): Promise { return this.userDataSyncService.getRemoteSyncResourceHandles(syncResource); } - protected async getChildrenForSyncResourceTreeItem(element: SyncResourceTreeItem): Promise { + protected async getChildrenForSyncResourceTreeItem(element: SyncResourceHandleTreeItem): Promise { const children = await super.getChildrenForSyncResourceTreeItem(element); - const machineId = await this.userDataSyncService.getMachineId(element.resource, element.resourceHandle); + const machineId = await this.userDataSyncService.getMachineId(element.syncResourceHandle.syncResource, element.syncResourceHandle); if (machineId) { const machines = await this.getMachines(); const machine = machines.find(({ id }) => id === machineId); - children.push({ - handle: machineId, - label: { label: machine?.name || machineId }, - collapsibleState: TreeItemCollapsibleState.None, - themeIcon: Codicon.vm, - }); + children[0].description = machine?.isCurrent ? localize({ key: 'current', comment: ['Represents current machine'] }, "Current") : machine?.name; } return children; } } +class SyncedDataViewDataProvider extends RemoteUserDataSyncActivityViewDataProvider { + + protected async getResourceHandles(syncResource: SyncResource): Promise { + const resourceHandles = await this.userDataSyncService.getRemoteSyncResourceHandles(syncResource); + return resourceHandles.length ? [resourceHandles[0]] : []; + } +} + class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider { private machinesPromise: Promise | undefined; @@ -461,7 +488,10 @@ class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider { @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, @IQuickInputService private readonly quickInputService: IQuickInputService, @INotificationService private readonly notificationService: INotificationService, - ) { } + @IDialogService private readonly dialogService: IDialogService, + @IUserDataSyncWorkbenchService private readonly userDataSyncWorkbenchService: IUserDataSyncWorkbenchService, + ) { + } async getChildren(element?: ITreeItem): Promise { if (!element) { @@ -492,6 +522,32 @@ class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider { return this.machinesPromise; } + async disable(machineId: string): Promise { + const machines = await this.getMachines(); + const machine = machines.find(({ id }) => id === machineId); + if (!machine) { + throw new Error(localize('not found', "machine not found with id: {0}", machineId)); + } + + const result = await this.dialogService.confirm({ + type: 'info', + message: localize('turn off sync on machine', "Are you sure you want to turn off sync on {0}?", machine.name), + primaryButton: localize('turn off', "Turn off"), + }); + + if (!result.confirmed) { + return false; + } + + if (machine.isCurrent) { + await this.userDataSyncWorkbenchService.turnoff(false); + } else { + await this.userDataSyncMachinesService.setEnablement(machineId, false); + } + + return true; + } + async rename(machineId: string): Promise { const disposableStore = new DisposableStore(); const inputBox = disposableStore.add(this.quickInputService.createInputBox()); @@ -531,10 +587,3 @@ class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider { }); } } - -function label(date: Date): string { - return date.toLocaleDateString() + - ' ' + pad(date.getHours(), 2) + - ':' + pad(date.getMinutes(), 2) + - ':' + pad(date.getSeconds(), 2); -} diff --git a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService.ts b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService.ts index bb6b3b63107..bf841f93119 100644 --- a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService.ts +++ b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService.ts @@ -5,38 +5,44 @@ import { IUserDataAutoSyncService, UserDataSyncError } from 'vs/platform/userDataSync/common/userDataSync'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; -import { Disposable } from 'vs/base/common/lifecycle'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event } from 'vs/base/common/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { UserDataSyncTrigger } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger'; +import { UserDataAutoSyncEnablementService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -export class UserDataAutoSyncService extends Disposable implements IUserDataAutoSyncService { +export class UserDataAutoSyncService extends UserDataAutoSyncEnablementService implements IUserDataAutoSyncService { declare readonly _serviceBrand: undefined; private readonly channel: IChannel; + get onTurnOnSync(): Event { return this.channel.listen('onTurnOnSync'); } + get onDidTurnOnSync(): Event { return Event.map(this.channel.listen('onDidTurnOnSync'), e => e ? UserDataSyncError.toUserDataSyncError(e) : undefined); } get onError(): Event { return Event.map(this.channel.listen('onError'), e => UserDataSyncError.toUserDataSyncError(e)); } constructor( + @IStorageService storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService, @IInstantiationService instantiationService: IInstantiationService, - @ISharedProcessService sharedProcessService: ISharedProcessService + @ISharedProcessService sharedProcessService: ISharedProcessService, ) { - super(); + super(storageService, environmentService); this.channel = sharedProcessService.getChannel('userDataAutoSync'); - this._register(instantiationService.createInstance(UserDataSyncTrigger).onDidTriggerSync(source => this.triggerAutoSync([source]))); + this._register(instantiationService.createInstance(UserDataSyncTrigger).onDidTriggerSync(source => this.triggerSync([source], true))); } - triggerAutoSync(sources: string[]): Promise { - return this.channel.call('triggerAutoSync', [sources]); + triggerSync(sources: string[], hasToLimitSync: boolean): Promise { + return this.channel.call('triggerSync', [sources, hasToLimitSync]); } - enable(): void { - this.channel.call('enable'); + turnOn(pullFirst: boolean): Promise { + return this.channel.call('turnOn', [pullFirst]); } - disable(): void { - this.channel.call('disable'); + turnOff(everywhere: boolean): Promise { + return this.channel.call('turnOff', [everywhere]); } } diff --git a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts index 5c7c757451f..479722486ae 100644 --- a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts @@ -47,9 +47,10 @@ class UserDataSyncReportIssueContribution extends Disposable implements IWorkben private onAutoSyncError(error: UserDataSyncError): void { switch (error.code) { case UserDataSyncErrorCode.LocalTooManyRequests: + case UserDataSyncErrorCode.TooManyRequests: this.notificationService.notify({ severity: Severity.Error, - message: localize('too many requests', "Turned off syncing preferences on this device because it is making too many requests. Please report an issue by providing the sync logs."), + message: localize({ key: 'too many requests', comment: ['Preferences Sync is the name of the feature'] }, "Preferences sync is disabled because the current device is making too many requests. Please report an issue by providing the sync logs."), actions: { primary: [ new Action('Show Sync Logs', localize('show sync logs', "Show Log"), undefined, true, () => this.commandService.executeCommand(SHOW_SYNC_LOG_COMMAND_ID)), diff --git a/src/vs/workbench/browser/parts/views/media/views.css b/src/vs/workbench/contrib/views/browser/media/views.css similarity index 98% rename from src/vs/workbench/browser/parts/views/media/views.css rename to src/vs/workbench/contrib/views/browser/media/views.css index e2e85381244..8b30fccc585 100644 --- a/src/vs/workbench/browser/parts/views/media/views.css +++ b/src/vs/workbench/contrib/views/browser/media/views.css @@ -7,7 +7,8 @@ .file-icon-themable-tree.align-icons-and-twisties .monaco-tl-twistie:not(.force-twistie):not(.collapsible), .file-icon-themable-tree .align-icon-with-twisty .monaco-tl-twistie:not(.force-twistie):not(.collapsible), -.file-icon-themable-tree.hide-arrows .monaco-tl-twistie:not(.force-twistie) { +.file-icon-themable-tree.hide-arrows .monaco-tl-twistie:not(.force-twistie), +.file-icon-themable-tree .monaco-tl-twistie.force-no-twistie { background-image: none !important; width: 0 !important; padding-right: 0 !important; diff --git a/src/vs/workbench/contrib/views/browser/treeView.ts b/src/vs/workbench/contrib/views/browser/treeView.ts new file mode 100644 index 00000000000..10e0efdbfa1 --- /dev/null +++ b/src/vs/workbench/contrib/views/browser/treeView.ts @@ -0,0 +1,1016 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/views'; +import { Event, Emitter } from 'vs/base/common/event'; +import { IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IAction, ActionRunner } from 'vs/base/common/actions'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IMenuService, MenuId, MenuItemAction, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; +import { ContextAwareMenuEntryActionViewItem, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { IContextKeyService, ContextKeyExpr, ContextKeyEqualsExpr, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { ITreeView, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeItemLabel, IViewDescriptorService, ViewContainer, ViewContainerLocation, ResolvableTreeItem } from 'vs/workbench/common/views'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { IProgressService } from 'vs/platform/progress/common/progress'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import * as DOM from 'vs/base/browser/dom'; +import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels'; +import { ActionBar, IActionViewItemProvider, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { URI } from 'vs/base/common/uri'; +import { dirname, basename } from 'vs/base/common/resources'; +import { LIGHT, FileThemeIcon, FolderThemeIcon, registerThemingParticipant, ThemeIcon, IThemeService } from 'vs/platform/theme/common/themeService'; +import { FileKind } from 'vs/platform/files/common/files'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; +import { localize } from 'vs/nls'; +import { timeout } from 'vs/base/common/async'; +import { textLinkForeground, textCodeBlockBackground, focusBorder, listFilterMatchHighlight, listFilterMatchHighlightBorder } from 'vs/platform/theme/common/colorRegistry'; +import { isString } from 'vs/base/common/types'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; +import { ITreeRenderer, ITreeNode, IAsyncDataSource, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; +import { FuzzyScore, createMatches } from 'vs/base/common/filters'; +import { CollapseAllAction } from 'vs/base/browser/ui/tree/treeDefaults'; +import { isFalsyOrWhitespace } from 'vs/base/common/strings'; +import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme'; +import { IHoverService, IHoverOptions } from 'vs/workbench/services/hover/browser/hover'; + +class Root implements ITreeItem { + label = { label: 'root' }; + handle = '0'; + parentHandle: string | undefined = undefined; + collapsibleState = TreeItemCollapsibleState.Expanded; + children: ITreeItem[] | undefined = undefined; +} + +const noDataProviderMessage = localize('no-dataprovider', "There is no data provider registered that can provide view data."); + +class Tree extends WorkbenchAsyncDataTree { } + +export class TreeView extends Disposable implements ITreeView { + + private isVisible: boolean = false; + private _hasIconForParentNode = false; + private _hasIconForLeafNode = false; + + private readonly collapseAllContextKey: RawContextKey; + private readonly collapseAllContext: IContextKey; + private readonly refreshContextKey: RawContextKey; + private readonly refreshContext: IContextKey; + + private focused: boolean = false; + private domNode!: HTMLElement; + private treeContainer!: HTMLElement; + private _messageValue: string | undefined; + private _canSelectMany: boolean = false; + private messageElement!: HTMLDivElement; + private tree: Tree | undefined; + private treeLabels: ResourceLabels | undefined; + + private root: ITreeItem; + private elementsToRefresh: ITreeItem[] = []; + + private readonly _onDidExpandItem: Emitter = this._register(new Emitter()); + readonly onDidExpandItem: Event = this._onDidExpandItem.event; + + private readonly _onDidCollapseItem: Emitter = this._register(new Emitter()); + readonly onDidCollapseItem: Event = this._onDidCollapseItem.event; + + private _onDidChangeSelection: Emitter = this._register(new Emitter()); + readonly onDidChangeSelection: Event = this._onDidChangeSelection.event; + + private readonly _onDidChangeVisibility: Emitter = this._register(new Emitter()); + readonly onDidChangeVisibility: Event = this._onDidChangeVisibility.event; + + private readonly _onDidChangeActions: Emitter = this._register(new Emitter()); + readonly onDidChangeActions: Event = this._onDidChangeActions.event; + + private readonly _onDidChangeWelcomeState: Emitter = this._register(new Emitter()); + readonly onDidChangeWelcomeState: Event = this._onDidChangeWelcomeState.event; + + private readonly _onDidChangeTitle: Emitter = this._register(new Emitter()); + readonly onDidChangeTitle: Event = this._onDidChangeTitle.event; + + private readonly _onDidCompleteRefresh: Emitter = this._register(new Emitter()); + + constructor( + readonly id: string, + private _title: string, + @IThemeService private readonly themeService: IThemeService, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @ICommandService private readonly commandService: ICommandService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IProgressService protected readonly progressService: IProgressService, + @IContextMenuService private readonly contextMenuService: IContextMenuService, + @IKeybindingService private readonly keybindingService: IKeybindingService, + @INotificationService private readonly notificationService: INotificationService, + @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, + @IContextKeyService contextKeyService: IContextKeyService + ) { + super(); + this.root = new Root(); + this.collapseAllContextKey = new RawContextKey(`treeView.${this.id}.enableCollapseAll`, false); + this.collapseAllContext = this.collapseAllContextKey.bindTo(contextKeyService); + this.refreshContextKey = new RawContextKey(`treeView.${this.id}.enableRefresh`, false); + this.refreshContext = this.refreshContextKey.bindTo(contextKeyService); + + this._register(this.themeService.onDidFileIconThemeChange(() => this.doRefresh([this.root]) /** soft refresh **/)); + this._register(this.themeService.onDidColorThemeChange(() => this.doRefresh([this.root]) /** soft refresh **/)); + this._register(this.configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('explorer.decorations')) { + this.doRefresh([this.root]); /** soft refresh **/ + } + })); + this._register(this.viewDescriptorService.onDidChangeLocation(({ views, from, to }) => { + if (views.some(v => v.id === this.id)) { + this.tree?.updateOptions({ overrideStyles: { listBackground: this.viewLocation === ViewContainerLocation.Sidebar ? SIDE_BAR_BACKGROUND : PANEL_BACKGROUND } }); + } + })); + this.registerActions(); + + this.create(); + } + + get viewContainer(): ViewContainer { + return this.viewDescriptorService.getViewContainerByViewId(this.id)!; + } + + get viewLocation(): ViewContainerLocation { + return this.viewDescriptorService.getViewLocationById(this.id)!; + } + + private _dataProvider: ITreeViewDataProvider | undefined; + get dataProvider(): ITreeViewDataProvider | undefined { + return this._dataProvider; + } + + set dataProvider(dataProvider: ITreeViewDataProvider | undefined) { + if (this.tree === undefined) { + this.createTree(); + } + + if (dataProvider) { + this._dataProvider = new class implements ITreeViewDataProvider { + private _isEmpty: boolean = true; + private _onDidChangeEmpty: Emitter = new Emitter(); + public onDidChangeEmpty: Event = this._onDidChangeEmpty.event; + + get isTreeEmpty(): boolean { + return this._isEmpty; + } + + async getChildren(node: ITreeItem): Promise { + let children: ITreeItem[]; + if (node && node.children) { + children = node.children; + } else { + children = await (node instanceof Root ? dataProvider.getChildren() : dataProvider.getChildren(node)); + node.children = children; + } + if (node instanceof Root) { + const oldEmpty = this._isEmpty; + this._isEmpty = children.length === 0; + if (oldEmpty !== this._isEmpty) { + this._onDidChangeEmpty.fire(); + } + } + return children; + } + }; + if (this._dataProvider.onDidChangeEmpty) { + this._register(this._dataProvider.onDidChangeEmpty(() => this._onDidChangeWelcomeState.fire())); + } + this.updateMessage(); + this.refresh(); + } else { + this._dataProvider = undefined; + this.updateMessage(); + } + + this._onDidChangeWelcomeState.fire(); + } + + private _message: string | undefined; + get message(): string | undefined { + return this._message; + } + + set message(message: string | undefined) { + this._message = message; + this.updateMessage(); + this._onDidChangeWelcomeState.fire(); + } + + get title(): string { + return this._title; + } + + set title(name: string) { + this._title = name; + this._onDidChangeTitle.fire(this._title); + } + + get canSelectMany(): boolean { + return this._canSelectMany; + } + + set canSelectMany(canSelectMany: boolean) { + this._canSelectMany = canSelectMany; + } + + get hasIconForParentNode(): boolean { + return this._hasIconForParentNode; + } + + get hasIconForLeafNode(): boolean { + return this._hasIconForLeafNode; + } + + get visible(): boolean { + return this.isVisible; + } + + get showCollapseAllAction(): boolean { + return !!this.collapseAllContext.get(); + } + + set showCollapseAllAction(showCollapseAllAction: boolean) { + this.collapseAllContext.set(showCollapseAllAction); + } + + get showRefreshAction(): boolean { + return !!this.refreshContext.get(); + } + + set showRefreshAction(showRefreshAction: boolean) { + this.refreshContext.set(showRefreshAction); + } + + private registerActions() { + const that = this; + this._register(registerAction2(class extends Action2 { + constructor() { + super({ + id: `workbench.actions.treeView.${that.id}.refresh`, + title: localize('refresh', "Refresh"), + menu: { + id: MenuId.ViewTitle, + when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', that.id), that.refreshContextKey), + group: 'navigation', + order: Number.MAX_SAFE_INTEGER - 1, + }, + icon: { id: 'codicon/refresh' } + }); + } + async run(): Promise { + return that.refresh(); + } + })); + this._register(registerAction2(class extends Action2 { + constructor() { + super({ + id: `workbench.actions.treeView.${that.id}.collapseAll`, + title: localize('collapseAll', "Collapse All"), + menu: { + id: MenuId.ViewTitle, + when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', that.id), that.collapseAllContextKey), + group: 'navigation', + order: Number.MAX_SAFE_INTEGER, + }, + icon: { id: 'codicon/collapse-all' } + }); + } + async run(): Promise { + if (that.tree) { + return new CollapseAllAction(that.tree, true).run(); + } + } + })); + } + + setVisibility(isVisible: boolean): void { + isVisible = !!isVisible; + if (this.isVisible === isVisible) { + return; + } + + this.isVisible = isVisible; + + if (this.tree) { + if (this.isVisible) { + DOM.show(this.tree.getHTMLElement()); + } else { + DOM.hide(this.tree.getHTMLElement()); // make sure the tree goes out of the tabindex world by hiding it + } + + if (this.isVisible && this.elementsToRefresh.length) { + this.doRefresh(this.elementsToRefresh); + this.elementsToRefresh = []; + } + } + + this._onDidChangeVisibility.fire(this.isVisible); + } + + focus(reveal: boolean = true): void { + if (this.tree && this.root.children && this.root.children.length > 0) { + // Make sure the current selected element is revealed + const selectedElement = this.tree.getSelection()[0]; + if (selectedElement && reveal) { + this.tree.reveal(selectedElement, 0.5); + } + + // Pass Focus to Viewer + this.tree.domFocus(); + } else if (this.tree) { + this.tree.domFocus(); + } else { + this.domNode.focus(); + } + } + + show(container: HTMLElement): void { + DOM.append(container, this.domNode); + } + + private create() { + this.domNode = DOM.$('.tree-explorer-viewlet-tree-view'); + this.messageElement = DOM.append(this.domNode, DOM.$('.message')); + this.treeContainer = DOM.append(this.domNode, DOM.$('.customview-tree')); + DOM.addClass(this.treeContainer, 'file-icon-themable-tree'); + DOM.addClass(this.treeContainer, 'show-file-icons'); + const focusTracker = this._register(DOM.trackFocus(this.domNode)); + this._register(focusTracker.onDidFocus(() => this.focused = true)); + this._register(focusTracker.onDidBlur(() => this.focused = false)); + } + + private createTree() { + const actionViewItemProvider = (action: IAction) => action instanceof MenuItemAction ? this.instantiationService.createInstance(ContextAwareMenuEntryActionViewItem, action) : undefined; + const treeMenus = this._register(this.instantiationService.createInstance(TreeMenus, this.id)); + this.treeLabels = this._register(this.instantiationService.createInstance(ResourceLabels, this)); + const dataSource = this.instantiationService.createInstance(TreeDataSource, this, (task: Promise) => this.progressService.withProgress({ location: this.id }, () => task)); + const aligner = new Aligner(this.themeService); + const renderer = this.instantiationService.createInstance(TreeRenderer, this.id, treeMenus, this.treeLabels, actionViewItemProvider, aligner); + const widgetAriaLabel = this._title; + + this.tree = this._register(this.instantiationService.createInstance(Tree, this.id, this.treeContainer, new TreeViewDelegate(), [renderer], + dataSource, { + identityProvider: new TreeViewIdentityProvider(), + accessibilityProvider: { + getAriaLabel(element: ITreeItem): string { + if (element.accessibilityInformation) { + return element.accessibilityInformation.label; + } + + return isString(element.tooltip) ? element.tooltip : element.label ? element.label.label : ''; + }, + getRole(element: ITreeItem): string | undefined { + return element.accessibilityInformation?.role ?? 'treeitem'; + }, + getWidgetAriaLabel(): string { + return widgetAriaLabel; + } + }, + keyboardNavigationLabelProvider: { + getKeyboardNavigationLabel: (item: ITreeItem) => { + return item.label ? item.label.label : (item.resourceUri ? basename(URI.revive(item.resourceUri)) : undefined); + } + }, + expandOnlyOnTwistieClick: (e: ITreeItem) => !!e.command, + collapseByDefault: (e: ITreeItem): boolean => { + return e.collapsibleState !== TreeItemCollapsibleState.Expanded; + }, + multipleSelectionSupport: this.canSelectMany, + overrideStyles: { + listBackground: this.viewLocation === ViewContainerLocation.Sidebar ? SIDE_BAR_BACKGROUND : PANEL_BACKGROUND + } + }) as WorkbenchAsyncDataTree); + aligner.tree = this.tree; + const actionRunner = new MultipleSelectionActionRunner(this.notificationService, () => this.tree!.getSelection()); + renderer.actionRunner = actionRunner; + + this.tree.contextKeyService.createKey(this.id, true); + this._register(this.tree.onContextMenu(e => this.onContextMenu(treeMenus, e, actionRunner))); + this._register(this.tree.onDidChangeSelection(e => this._onDidChangeSelection.fire(e.elements))); + this._register(this.tree.onDidChangeCollapseState(e => { + if (!e.node.element) { + return; + } + + const element: ITreeItem = Array.isArray(e.node.element.element) ? e.node.element.element[0] : e.node.element.element; + if (e.node.collapsed) { + this._onDidCollapseItem.fire(element); + } else { + this._onDidExpandItem.fire(element); + } + })); + this.tree.setInput(this.root).then(() => this.updateContentAreas()); + + this._register(this.tree.onDidOpen(e => { + if (!e.browserEvent) { + return; + } + const selection = this.tree!.getSelection(); + if ((selection.length === 1) && selection[0].command) { + this.commandService.executeCommand(selection[0].command.id, ...(selection[0].command.arguments || [])); + } + })); + + } + + private onContextMenu(treeMenus: TreeMenus, treeEvent: ITreeContextMenuEvent, actionRunner: MultipleSelectionActionRunner): void { + const node: ITreeItem | null = treeEvent.element; + if (node === null) { + return; + } + const event: UIEvent = treeEvent.browserEvent; + + event.preventDefault(); + event.stopPropagation(); + + this.tree!.setFocus([node]); + const actions = treeMenus.getResourceContextActions(node); + if (!actions.length) { + return; + } + this.contextMenuService.showContextMenu({ + getAnchor: () => treeEvent.anchor, + + getActions: () => actions, + + getActionViewItem: (action) => { + const keybinding = this.keybindingService.lookupKeybinding(action.id); + if (keybinding) { + return new ActionViewItem(action, action, { label: true, keybinding: keybinding.getLabel() }); + } + return undefined; + }, + + onHide: (wasCancelled?: boolean) => { + if (wasCancelled) { + this.tree!.domFocus(); + } + }, + + getActionsContext: () => ({ $treeViewId: this.id, $treeItemHandle: node.handle }), + + actionRunner + }); + } + + protected updateMessage(): void { + if (this._message) { + this.showMessage(this._message); + } else if (!this.dataProvider) { + this.showMessage(noDataProviderMessage); + } else { + this.hideMessage(); + } + this.updateContentAreas(); + } + + private showMessage(message: string): void { + DOM.removeClass(this.messageElement, 'hide'); + this.resetMessageElement(); + this._messageValue = message; + if (!isFalsyOrWhitespace(this._message)) { + this.messageElement.textContent = this._messageValue; + } + this.layout(this._height, this._width); + } + + private hideMessage(): void { + this.resetMessageElement(); + DOM.addClass(this.messageElement, 'hide'); + this.layout(this._height, this._width); + } + + private resetMessageElement(): void { + DOM.clearNode(this.messageElement); + } + + private _height: number = 0; + private _width: number = 0; + layout(height: number, width: number) { + if (height && width) { + this._height = height; + this._width = width; + const treeHeight = height - DOM.getTotalHeight(this.messageElement); + this.treeContainer.style.height = treeHeight + 'px'; + if (this.tree) { + this.tree.layout(treeHeight, width); + } + } + } + + getOptimalWidth(): number { + if (this.tree) { + const parentNode = this.tree.getHTMLElement(); + const childNodes = ([] as HTMLElement[]).slice.call(parentNode.querySelectorAll('.outline-item-label > a')); + return DOM.getLargestChildWidth(parentNode, childNodes); + } + return 0; + } + + async refresh(elements?: ITreeItem[]): Promise { + if (this.dataProvider && this.tree) { + if (this.refreshing) { + await Event.toPromise(this._onDidCompleteRefresh.event); + } + if (!elements) { + elements = [this.root]; + // remove all waiting elements to refresh if root is asked to refresh + this.elementsToRefresh = []; + } + for (const element of elements) { + element.children = undefined; // reset children + } + if (this.isVisible) { + return this.doRefresh(elements); + } else { + if (this.elementsToRefresh.length) { + const seen: Set = new Set(); + this.elementsToRefresh.forEach(element => seen.add(element.handle)); + for (const element of elements) { + if (!seen.has(element.handle)) { + this.elementsToRefresh.push(element); + } + } + } else { + this.elementsToRefresh.push(...elements); + } + } + } + return undefined; + } + + async expand(itemOrItems: ITreeItem | ITreeItem[]): Promise { + const tree = this.tree; + if (tree) { + itemOrItems = Array.isArray(itemOrItems) ? itemOrItems : [itemOrItems]; + await Promise.all(itemOrItems.map(element => { + return tree.expand(element, false); + })); + } + } + + setSelection(items: ITreeItem[]): void { + if (this.tree) { + this.tree.setSelection(items); + } + } + + setFocus(item: ITreeItem): void { + if (this.tree) { + this.focus(); + this.tree.setFocus([item]); + } + } + + async reveal(item: ITreeItem): Promise { + if (this.tree) { + return this.tree.reveal(item); + } + } + + private refreshing: boolean = false; + private async doRefresh(elements: ITreeItem[]): Promise { + const tree = this.tree; + if (tree && this.visible) { + this.refreshing = true; + await Promise.all(elements.map(element => tree.updateChildren(element, true, true))); + this.refreshing = false; + this._onDidCompleteRefresh.fire(); + this.updateContentAreas(); + if (this.focused) { + this.focus(false); + } + } + } + + private updateContentAreas(): void { + const isTreeEmpty = !this.root.children || this.root.children.length === 0; + // Hide tree container only when there is a message and tree is empty and not refreshing + if (this._messageValue && isTreeEmpty && !this.refreshing) { + DOM.addClass(this.treeContainer, 'hide'); + this.domNode.setAttribute('tabindex', '0'); + } else { + DOM.removeClass(this.treeContainer, 'hide'); + this.domNode.removeAttribute('tabindex'); + } + } +} + +class TreeViewIdentityProvider implements IIdentityProvider { + getId(element: ITreeItem): { toString(): string; } { + return element.handle; + } +} + +class TreeViewDelegate implements IListVirtualDelegate { + + getHeight(element: ITreeItem): number { + return TreeRenderer.ITEM_HEIGHT; + } + + getTemplateId(element: ITreeItem): string { + return TreeRenderer.TREE_TEMPLATE_ID; + } +} + +class TreeDataSource implements IAsyncDataSource { + + constructor( + private treeView: ITreeView, + private withProgress: (task: Promise) => Promise + ) { + } + + hasChildren(element: ITreeItem): boolean { + return !!this.treeView.dataProvider && (element.collapsibleState !== TreeItemCollapsibleState.None); + } + + async getChildren(element: ITreeItem): Promise { + if (this.treeView.dataProvider) { + return this.withProgress(this.treeView.dataProvider.getChildren(element)); + } + return []; + } +} + +// todo@joh,sandy make this proper and contributable from extensions +registerThemingParticipant((theme, collector) => { + + const matchBackgroundColor = theme.getColor(listFilterMatchHighlight); + if (matchBackgroundColor) { + collector.addRule(`.file-icon-themable-tree .monaco-list-row .content .monaco-highlighted-label .highlight { color: unset !important; background-color: ${matchBackgroundColor}; }`); + collector.addRule(`.monaco-tl-contents .monaco-highlighted-label .highlight { color: unset !important; background-color: ${matchBackgroundColor}; }`); + } + const matchBorderColor = theme.getColor(listFilterMatchHighlightBorder); + if (matchBorderColor) { + collector.addRule(`.file-icon-themable-tree .monaco-list-row .content .monaco-highlighted-label .highlight { color: unset !important; border: 1px dotted ${matchBorderColor}; box-sizing: border-box; }`); + collector.addRule(`.monaco-tl-contents .monaco-highlighted-label .highlight { color: unset !important; border: 1px dotted ${matchBorderColor}; box-sizing: border-box; }`); + } + const link = theme.getColor(textLinkForeground); + if (link) { + collector.addRule(`.tree-explorer-viewlet-tree-view > .message a { color: ${link}; }`); + } + const focusBorderColor = theme.getColor(focusBorder); + if (focusBorderColor) { + collector.addRule(`.tree-explorer-viewlet-tree-view > .message a:focus { outline: 1px solid ${focusBorderColor}; outline-offset: -1px; }`); + } + const codeBackground = theme.getColor(textCodeBlockBackground); + if (codeBackground) { + collector.addRule(`.tree-explorer-viewlet-tree-view > .message code { background-color: ${codeBackground}; }`); + } +}); + +interface ITreeExplorerTemplateData { + elementDisposable: IDisposable; + container: HTMLElement; + resourceLabel: IResourceLabel; + icon: HTMLElement; + actionBar: ActionBar; +} + +class TreeRenderer extends Disposable implements ITreeRenderer { + static readonly ITEM_HEIGHT = 22; + static readonly TREE_TEMPLATE_ID = 'treeExplorer'; + + private _actionRunner: MultipleSelectionActionRunner | undefined; + private readonly hoverDelay: number; + + constructor( + private treeViewId: string, + private menus: TreeMenus, + private labels: ResourceLabels, + private actionViewItemProvider: IActionViewItemProvider, + private aligner: Aligner, + @IThemeService private readonly themeService: IThemeService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @ILabelService private readonly labelService: ILabelService, + @IHoverService private readonly hoverService: IHoverService + ) { + super(); + this.hoverDelay = this.configurationService.getValue('editor.hover.delay'); + } + + get templateId(): string { + return TreeRenderer.TREE_TEMPLATE_ID; + } + + set actionRunner(actionRunner: MultipleSelectionActionRunner) { + this._actionRunner = actionRunner; + } + + renderTemplate(container: HTMLElement): ITreeExplorerTemplateData { + DOM.addClass(container, 'custom-view-tree-node-item'); + + const icon = DOM.append(container, DOM.$('.custom-view-tree-node-item-icon')); + + const resourceLabel = this.labels.create(container, { supportHighlights: true }); + const actionsContainer = DOM.append(resourceLabel.element, DOM.$('.actions')); + const actionBar = new ActionBar(actionsContainer, { + actionViewItemProvider: this.actionViewItemProvider + }); + + return { resourceLabel, icon, actionBar, container, elementDisposable: Disposable.None }; + } + + renderElement(element: ITreeNode, index: number, templateData: ITreeExplorerTemplateData): void { + templateData.elementDisposable.dispose(); + const node = element.element; + const resource = node.resourceUri ? URI.revive(node.resourceUri) : null; + const treeItemLabel: ITreeItemLabel | undefined = node.label ? node.label : (resource ? { label: basename(resource) } : undefined); + const description = isString(node.description) ? node.description : resource && node.description === true ? this.labelService.getUriLabel(dirname(resource), { relative: true }) : undefined; + const label = treeItemLabel ? treeItemLabel.label : undefined; + const matches = (treeItemLabel && treeItemLabel.highlights && label) ? treeItemLabel.highlights.map(([start, end]) => { + if (start < 0) { + start = label.length + start; + } + if (end < 0) { + end = label.length + end; + } + if ((start >= label.length) || (end > label.length)) { + return ({ start: 0, end: 0 }); + } + if (start > end) { + const swap = start; + start = end; + end = swap; + } + return ({ start, end }); + }) : undefined; + const icon = this.themeService.getColorTheme().type === LIGHT ? node.icon : node.iconDark; + const iconUrl = icon ? URI.revive(icon) : null; + const canResolve = node instanceof ResolvableTreeItem && node.hasResolve; + const title = node.tooltip ? (isString(node.tooltip) ? node.tooltip : undefined) : (resource ? undefined : (canResolve ? undefined : label)); + + // reset + templateData.actionBar.clear(); + + if (resource || this.isFileKindThemeIcon(node.themeIcon)) { + const fileDecorations = this.configurationService.getValue<{ colors: boolean, badges: boolean }>('explorer.decorations'); + templateData.resourceLabel.setResource({ name: label, description, resource: resource ? resource : URI.parse('missing:_icon_resource') }, { fileKind: this.getFileKind(node), title, hideIcon: !!iconUrl, fileDecorations, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches: matches ? matches : createMatches(element.filterData) }); + } else { + templateData.resourceLabel.setResource({ name: label, description }, { title, hideIcon: true, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches: matches ? matches : createMatches(element.filterData) }); + } + + templateData.icon.title = title ? title : ''; + + if (iconUrl) { + templateData.icon.className = 'custom-view-tree-node-item-icon'; + templateData.icon.style.backgroundImage = DOM.asCSSUrl(iconUrl); + + } else { + let iconClass: string | undefined; + if (node.themeIcon && !this.isFileKindThemeIcon(node.themeIcon)) { + iconClass = ThemeIcon.asClassName(node.themeIcon); + } + templateData.icon.className = iconClass ? `custom-view-tree-node-item-icon ${iconClass}` : ''; + templateData.icon.style.backgroundImage = ''; + } + + templateData.actionBar.context = { $treeViewId: this.treeViewId, $treeItemHandle: node.handle }; + templateData.actionBar.push(this.menus.getResourceActions(node), { icon: true, label: false }); + if (this._actionRunner) { + templateData.actionBar.actionRunner = this._actionRunner; + } + this.setAlignment(templateData.container, node); + const disposableStore = new DisposableStore(); + templateData.elementDisposable = disposableStore; + disposableStore.add(this.themeService.onDidFileIconThemeChange(() => this.setAlignment(templateData.container, node))); + this.setupHovers(node, templateData.container, disposableStore, label); + } + + private setupHovers(node: ITreeItem, htmlElement: HTMLElement, disposableStore: DisposableStore, label: string | undefined): void { + if ((node.tooltip && isString(node.tooltip)) || !(node instanceof ResolvableTreeItem) || !node.hasResolve) { + return; + } + const resolvableNode: ResolvableTreeItem = node; + const hoverService = this.hoverService; + const hoverDelay = this.hoverDelay; + let hoverOptions: IHoverOptions | undefined; + function mouseOver(this: HTMLElement, e: MouseEvent): any { + let isHovering = true; + function mouseLeave(this: HTMLElement, e: MouseEvent): any { + isHovering = false; + } + this.addEventListener(DOM.EventType.MOUSE_LEAVE, mouseLeave, { passive: true }); + setTimeout(async () => { + await resolvableNode.resolve(); + const tooltip = resolvableNode.tooltip ?? label; + if (isHovering && tooltip) { + if (!hoverOptions) { + hoverOptions = { text: isString(tooltip) ? { value: tooltip } : tooltip, target: this }; + } + hoverService.showHover(hoverOptions); + } + this.removeEventListener(DOM.EventType.MOUSE_LEAVE, mouseLeave); + }, hoverDelay); + } + htmlElement.addEventListener(DOM.EventType.MOUSE_OVER, mouseOver, { passive: true }); + disposableStore.add({ + dispose: () => { + htmlElement.removeEventListener(DOM.EventType.MOUSE_OVER, mouseOver); + } + }); + } + + private setAlignment(container: HTMLElement, treeItem: ITreeItem) { + DOM.toggleClass(container.parentElement!, 'align-icon-with-twisty', this.aligner.alignIconWithTwisty(treeItem)); + } + + private isFileKindThemeIcon(icon: ThemeIcon | undefined): boolean { + if (icon) { + return icon.id === FileThemeIcon.id || icon.id === FolderThemeIcon.id; + } else { + return false; + } + } + + private getFileKind(node: ITreeItem): FileKind { + if (node.themeIcon) { + switch (node.themeIcon.id) { + case FileThemeIcon.id: + return FileKind.FILE; + case FolderThemeIcon.id: + return FileKind.FOLDER; + } + } + return node.collapsibleState === TreeItemCollapsibleState.Collapsed || node.collapsibleState === TreeItemCollapsibleState.Expanded ? FileKind.FOLDER : FileKind.FILE; + } + + disposeElement(resource: ITreeNode, index: number, templateData: ITreeExplorerTemplateData): void { + templateData.elementDisposable.dispose(); + } + + disposeTemplate(templateData: ITreeExplorerTemplateData): void { + templateData.resourceLabel.dispose(); + templateData.actionBar.dispose(); + templateData.elementDisposable.dispose(); + } +} + +class Aligner extends Disposable { + private _tree: WorkbenchAsyncDataTree | undefined; + + constructor(private themeService: IThemeService) { + super(); + } + + set tree(tree: WorkbenchAsyncDataTree) { + this._tree = tree; + } + + public alignIconWithTwisty(treeItem: ITreeItem): boolean { + if (treeItem.collapsibleState !== TreeItemCollapsibleState.None) { + return false; + } + if (!this.hasIcon(treeItem)) { + return false; + } + + if (this._tree) { + const parent: ITreeItem = this._tree.getParentElement(treeItem) || this._tree.getInput(); + if (this.hasIcon(parent)) { + return false; + } + return !!parent.children && parent.children.every(c => c.collapsibleState === TreeItemCollapsibleState.None || !this.hasIcon(c)); + } else { + return false; + } + } + + private hasIcon(node: ITreeItem): boolean { + const icon = this.themeService.getColorTheme().type === LIGHT ? node.icon : node.iconDark; + if (icon) { + return true; + } + if (node.resourceUri || node.themeIcon) { + const fileIconTheme = this.themeService.getFileIconTheme(); + const isFolder = node.themeIcon ? node.themeIcon.id === FolderThemeIcon.id : node.collapsibleState !== TreeItemCollapsibleState.None; + if (isFolder) { + return fileIconTheme.hasFileIcons && fileIconTheme.hasFolderIcons; + } + return fileIconTheme.hasFileIcons; + } + return false; + } +} + +class MultipleSelectionActionRunner extends ActionRunner { + + constructor(notificationService: INotificationService, private getSelectedResources: (() => ITreeItem[])) { + super(); + this._register(this.onDidRun(e => { + if (e.error) { + notificationService.error(localize('command-error', 'Error running command {1}: {0}. This is likely caused by the extension that contributes {1}.', e.error.message, e.action.id)); + } + })); + } + + runAction(action: IAction, context: TreeViewItemHandleArg): Promise { + const selection = this.getSelectedResources(); + let selectionHandleArgs: TreeViewItemHandleArg[] | undefined = undefined; + let actionInSelected: boolean = false; + if (selection.length > 1) { + selectionHandleArgs = selection.map(selected => { + if (selected.handle === context.$treeItemHandle) { + actionInSelected = true; + } + return { $treeViewId: context.$treeViewId, $treeItemHandle: selected.handle }; + }); + } + + if (!actionInSelected) { + selectionHandleArgs = undefined; + } + + return action.run(...[context, selectionHandleArgs]); + } +} + +class TreeMenus extends Disposable implements IDisposable { + + constructor( + private id: string, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IMenuService private readonly menuService: IMenuService, + @IContextMenuService private readonly contextMenuService: IContextMenuService + ) { + super(); + } + + getResourceActions(element: ITreeItem): IAction[] { + return this.getActions(MenuId.ViewItemContext, { key: 'viewItem', value: element.contextValue }).primary; + } + + getResourceContextActions(element: ITreeItem): IAction[] { + return this.getActions(MenuId.ViewItemContext, { key: 'viewItem', value: element.contextValue }).secondary; + } + + private getActions(menuId: MenuId, context: { key: string, value?: string }): { primary: IAction[]; secondary: IAction[]; } { + const contextKeyService = this.contextKeyService.createScoped(); + contextKeyService.createKey('view', this.id); + contextKeyService.createKey(context.key, context.value); + + const menu = this.menuService.createMenu(menuId, contextKeyService); + const primary: IAction[] = []; + const secondary: IAction[] = []; + const result = { primary, secondary }; + createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, this.contextMenuService, g => /^inline/.test(g)); + + menu.dispose(); + contextKeyService.dispose(); + + return result; + } +} + +export class CustomTreeView extends TreeView { + + private activated: boolean = false; + + constructor( + id: string, + title: string, + @IThemeService themeService: IThemeService, + @IInstantiationService instantiationService: IInstantiationService, + @ICommandService commandService: ICommandService, + @IConfigurationService configurationService: IConfigurationService, + @IProgressService progressService: IProgressService, + @IContextMenuService contextMenuService: IContextMenuService, + @IKeybindingService keybindingService: IKeybindingService, + @INotificationService notificationService: INotificationService, + @IViewDescriptorService viewDescriptorService: IViewDescriptorService, + @IContextKeyService contextKeyService: IContextKeyService, + @IHoverService hoverService: IHoverService, + @IExtensionService private readonly extensionService: IExtensionService, + ) { + super(id, title, themeService, instantiationService, commandService, configurationService, progressService, contextMenuService, keybindingService, notificationService, viewDescriptorService, contextKeyService); + } + + setVisibility(isVisible: boolean): void { + super.setVisibility(isVisible); + if (this.visible) { + this.activate(); + } + } + + private activate() { + if (!this.activated) { + this.progressService.withProgress({ location: this.id }, () => this.extensionService.activateByEvent(`onView:${this.id}`)) + .then(() => timeout(2000)) + .then(() => { + this.updateMessage(); + }); + this.activated = true; + } + } +} diff --git a/src/vs/workbench/contrib/watermark/browser/watermark.ts b/src/vs/workbench/contrib/watermark/browser/watermark.ts index de9c26428a0..a4a16842150 100644 --- a/src/vs/workbench/contrib/watermark/browser/watermark.ts +++ b/src/vs/workbench/contrib/watermark/browser/watermark.ts @@ -15,7 +15,6 @@ import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/ import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { GlobalNewUntitledFileAction } from 'vs/workbench/contrib/files/browser/fileActions'; import { OpenFolderAction, OpenFileFolderAction, OpenFileAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ShowAllCommandsAction } from 'vs/workbench/contrib/quickaccess/browser/commandsQuickAccess'; import { Parts, IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; @@ -28,6 +27,7 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { assertIsDefined } from 'vs/base/common/types'; import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; +import { NEW_UNTITLED_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileCommands'; const $ = dom.$; @@ -43,7 +43,7 @@ const openFileNonMacOnly: WatermarkEntry = { text: nls.localize('watermark.openF const openFolderNonMacOnly: WatermarkEntry = { text: nls.localize('watermark.openFolder', "Open Folder"), id: OpenFolderAction.ID, mac: false }; const openFileOrFolderMacOnly: WatermarkEntry = { text: nls.localize('watermark.openFileFolder', "Open File or Folder"), id: OpenFileFolderAction.ID, mac: true }; const openRecent: WatermarkEntry = { text: nls.localize('watermark.openRecent', "Open Recent"), id: 'workbench.action.openRecent' }; -const newUntitledFile: WatermarkEntry = { text: nls.localize('watermark.newUntitledFile', "New Untitled File"), id: GlobalNewUntitledFileAction.ID }; +const newUntitledFile: WatermarkEntry = { text: nls.localize('watermark.newUntitledFile', "New Untitled File"), id: NEW_UNTITLED_FILE_COMMAND_ID }; const newUntitledFileMacOnly: WatermarkEntry = assign({ mac: true }, newUntitledFile); const toggleTerminal: WatermarkEntry = { text: nls.localize({ key: 'watermark.toggleTerminal', comment: ['toggle is a verb here'] }, "Toggle Terminal"), id: TERMINAL_COMMAND_ID.TOGGLE }; const findInFiles: WatermarkEntry = { text: nls.localize('watermark.findInFiles', "Find in Files"), id: FindInFilesActionId }; diff --git a/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts b/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts index 0c12198ddfb..1c8b5d00161 100644 --- a/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts @@ -15,6 +15,7 @@ import { WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } fr import { areWebviewInputOptionsEqual } from 'vs/workbench/contrib/webview/browser/webviewWorkbenchService'; import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { ILogService } from 'vs/platform/log/common/log'; export const enum WebviewMessageChannels { onmessage = 'onmessage', @@ -83,8 +84,9 @@ export abstract class BaseWebview extends Disposable { contentOptions: WebviewContentOptions, public readonly extension: WebviewExtensionDescription | undefined, private readonly webviewThemeDataProvider: WebviewThemeDataProvider, + @ILogService private readonly _logService: ILogService, @ITelemetryService private readonly _telemetryService: ITelemetryService, - @IEnvironmentService private readonly _environementService: IEnvironmentService, + @IEnvironmentService private readonly _environmentService: IEnvironmentService, @IWorkbenchEnvironmentService protected readonly workbenchEnvironmentService: IWorkbenchEnvironmentService, ) { super(); @@ -98,6 +100,8 @@ export abstract class BaseWebview extends Disposable { this._element = this.createElement(options, contentOptions); const subscription = this._register(this.on(WebviewMessageChannels.webviewReady, () => { + this._logService.debug(`Webview(${this.id}): webview ready`); + if (this.element) { addClass(this.element, 'ready'); } @@ -222,7 +226,7 @@ export abstract class BaseWebview extends Disposable { this._hasAlertedAboutMissingCsp = true; if (this.extension && this.extension.id) { - if (this._environementService.isExtensionDevelopment) { + if (this._environmentService.isExtensionDevelopment) { this._onMissingCsp.fire(this.extension.id); } @@ -240,7 +244,8 @@ export abstract class BaseWebview extends Disposable { } public reload(): void { - this.doUpdateContent(); + this.doUpdateContent(this.content); + const subscription = this._register(this.on(WebviewMessageChannels.didLoad, () => { this._onDidReload.fire(); subscription.dispose(); @@ -248,25 +253,26 @@ export abstract class BaseWebview extends Disposable { } public set html(value: string) { - this.content = { + this.doUpdateContent({ html: value, options: this.content.options, state: this.content.state, - }; - this.doUpdateContent(); + }); } public set contentOptions(options: WebviewContentOptions) { + this._logService.debug(`Webview(${this.id}): will update content options`); + if (areWebviewInputOptionsEqual(options, this.content.options)) { + this._logService.debug(`Webview(${this.id}): skipping content options update`); return; } - this.content = { + this.doUpdateContent({ html: this.content.html, options: options, state: this.content.state, - }; - this.doUpdateContent(); + }); } public set localResourcesRoot(resources: URI[]) { @@ -285,7 +291,11 @@ export abstract class BaseWebview extends Disposable { this._send('initial-scroll-position', value); } - private doUpdateContent() { + private doUpdateContent(newContent: WebviewContent) { + this._logService.debug(`Webview(${this.id}): will update content`); + + this.content = newContent; + this._send('content', { contents: this.content.html, options: this.content.options, diff --git a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts index 00818b92b0c..d995538a6d5 100644 --- a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts +++ b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts @@ -113,7 +113,11 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewOv const webview = this._webviewService.createWebviewElement(this.id, this._options, this._contentOptions, this.extension); this._webview.value = webview; webview.state = this._state; - webview.html = this._html; + + if (this._html) { + webview.html = this._html; + } + if (this._options.tryRestoreScrollPosition) { webview.initialScrollProgress = this._initialScrollProgress; } diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js index 4015cadcc3e..eafc07ad8cd 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/host.js +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -5,6 +5,7 @@ // @ts-check (function () { const id = document.location.search.match(/\bid=([\w-]+)/)[1]; + const onElectron = /platform=electron/.test(document.location.search); const hostMessaging = new class HostMessaging { constructor() { @@ -36,6 +37,10 @@ }(); const workerReady = new Promise(async (resolveWorkerReady) => { + if (onElectron) { + return resolveWorkerReady(); + } + if (!areServiceWorkersEnabled()) { console.log('Service Workers are not enabled. Webviews will not work properly'); return resolveWorkerReady(); @@ -90,14 +95,21 @@ } } - (/** @type {any} */ (window)).createWebviewManager({ + /** @type {import('./main').WebviewHost} */ + const host = { postMessage: hostMessaging.postMessage.bind(hostMessaging), onMessage: hostMessaging.onMessage.bind(hostMessaging), ready: workerReady, - fakeLoad: true, - rewriteCSP: (csp, endpoint) => { - const endpointUrl = new URL(endpoint); - csp.setAttribute('content', csp.replace(/(vscode-webview-resource|vscode-resource):(?=(\s|;|$))/g, endpointUrl.origin)); - } - }); + fakeLoad: !onElectron, + rewriteCSP: onElectron + ? (csp) => { + return csp.replace(/vscode-resource:(?=(\s|;|$))/g, 'vscode-webview-resource:'); + } + : (csp, endpoint) => { + const endpointUrl = new URL(endpoint); + return csp.replace(/(vscode-webview-resource|vscode-resource):(?=(\s|;|$))/g, endpointUrl.origin); + } + }; + + (/** @type {any} */ (window)).createWebviewManager(host); }()); diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 3b683f5ea47..4ee58ff8c0e 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -367,7 +367,7 @@ try { csp.setAttribute('content', host.rewriteCSP(csp.getAttribute('content'), data.endpoint)); } catch (e) { - console.error('Could not rewrite csp'); + console.error(`Could not rewrite csp: ${e}`); } } diff --git a/src/vs/workbench/contrib/webview/browser/webview.ts b/src/vs/workbench/contrib/webview/browser/webview.ts index 1d359d78f52..b9202d78cf3 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.ts @@ -53,7 +53,14 @@ export interface IWebviewService { setIcons(id: string, value: WebviewIcons | undefined): void; } +export const enum WebviewContentPurpose { + NotebookRenderer = 'notebookRenderer', + CustomEditor = 'customEditor', +} + export interface WebviewOptions { + // The purpose of the webview; this is (currently) only used for filtering in js-debug + readonly purpose?: WebviewContentPurpose; readonly customClasses?: string; readonly enableFindWidget?: boolean; readonly tryRestoreScrollPosition?: boolean; @@ -135,4 +142,4 @@ export interface WebviewOverlay extends Webview { layoutWebviewOverElement(element: HTMLElement, dimension?: Dimension): void; } -export const webviewDeveloperCategory = nls.localize('developer', "Developer"); +export const webviewDeveloperCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); diff --git a/src/vs/workbench/contrib/webview/browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/browser/webviewCommands.ts index 9f949d73926..b3fb9164a2e 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewCommands.ts @@ -32,7 +32,7 @@ export class ShowWebViewEditorFindWidgetAction extends Action2 { } public run(accessor: ServicesAccessor): void { - getActiveWebviewEditor(accessor)?.showFind(); + getActiveWebview(accessor)?.showFind(); } } @@ -53,7 +53,7 @@ export class HideWebViewEditorFindCommand extends Action2 { } public run(accessor: ServicesAccessor): void { - getActiveWebviewEditor(accessor)?.hideFind(); + getActiveWebview(accessor)?.hideFind(); } } @@ -74,7 +74,7 @@ export class WebViewEditorFindNextCommand extends Action2 { } public run(accessor: ServicesAccessor): void { - getActiveWebviewEditor(accessor)?.runFindAction(false); + getActiveWebview(accessor)?.runFindAction(false); } } @@ -95,7 +95,7 @@ export class WebViewEditorFindPreviousCommand extends Action2 { } public run(accessor: ServicesAccessor): void { - getActiveWebviewEditor(accessor)?.runFindAction(true); + getActiveWebview(accessor)?.runFindAction(true); } } @@ -117,7 +117,7 @@ export class SelectAllWebviewEditorCommand extends Action2 { } public run(accessor: ServicesAccessor): void { - getActiveWebviewEditor(accessor)?.selectAll(); + getActiveWebview(accessor)?.selectAll(); } } @@ -142,7 +142,7 @@ export class ReloadWebviewAction extends Action { } } -export function getActiveWebviewEditor(accessor: ServicesAccessor): Webview | undefined { +export function getActiveWebview(accessor: ServicesAccessor): Webview | undefined { const editorService = accessor.get(IEditorService); const activeEditor = editorService.activeEditor; return activeEditor instanceof WebviewInput ? activeEditor.webview : undefined; diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditor.ts b/src/vs/workbench/contrib/webview/browser/webviewEditor.ts index 381feea138d..c6aa9b647d1 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditor.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditor.ts @@ -12,11 +12,11 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; +import { IEditorDropService } from 'vs/workbench/services/editor/browser/editorDropService'; import { EditorInput, EditorOptions } from 'vs/workbench/common/editor'; import { WebviewOverlay } from 'vs/workbench/contrib/webview/browser/webview'; import { WebviewInput } from 'vs/workbench/contrib/webview/browser/webviewEditorInput'; -import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IHostService } from 'vs/workbench/services/host/browser/host'; @@ -39,7 +39,7 @@ export class WebviewEditor extends BaseEditor { @IThemeService themeService: IThemeService, @IStorageService storageService: IStorageService, @IEditorService private readonly _editorService: IEditorService, - @IEditorGroupsService private readonly _editorGroupsService: IEditorGroupsService, + @IEditorDropService private readonly _editorDropService: IEditorDropService, @IHostService private readonly _hostService: IHostService, ) { super(WebviewEditor.ID, telemetryService, themeService, storageService); @@ -146,11 +146,9 @@ export class WebviewEditor extends BaseEditor { this._webviewVisibleDisposables.clear(); // Webviews are not part of the normal editor dom, so we have to register our own drag and drop handler on them. - if (this._editorGroupsService instanceof EditorPart) { - this._webviewVisibleDisposables.add(this._editorGroupsService.createEditorDropTarget(input.webview.container, { - groupContainsPredicate: (group) => this.group?.id === group.group.id - })); - } + this._webviewVisibleDisposables.add(this._editorDropService.createEditorDropTarget(input.webview.container, { + containsGroup: (group) => this.group?.id === group.group.id + })); this._webviewVisibleDisposables.add(DOM.addDisposableListener(window, DOM.EventType.DRAG_START, () => { this.webview?.windowDidDragStart(); diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index d629a6165fd..5c16fda583d 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -4,20 +4,24 @@ *--------------------------------------------------------------------------------------------*/ import { addDisposableListener } from 'vs/base/browser/dom'; +import { streamToBuffer } from 'vs/base/common/buffer'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { IRequestService } from 'vs/platform/request/common/request'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { loadLocalResource, WebviewResourceResponse } from 'vs/platform/webview/common/resourceLoader'; +import { WebviewPortMappingManager } from 'vs/platform/webview/common/webviewPortMapping'; import { BaseWebview, WebviewMessageChannels } from 'vs/workbench/contrib/webview/browser/baseWebviewElement'; -import { Webview, WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; -import { WebviewPortMappingManager } from 'vs/workbench/contrib/webview/common/portMapping'; import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; +import { Webview, WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { isWeb } from 'vs/base/common/platform'; export class IFrameWebview extends BaseWebview implements Webview { private readonly _portMappingManager: WebviewPortMappingManager; @@ -30,19 +34,17 @@ export class IFrameWebview extends BaseWebview implements Web webviewThemeDataProvider: WebviewThemeDataProvider, @ITunnelService tunnelService: ITunnelService, @IFileService private readonly fileService: IFileService, - @IConfigurationService private readonly _configurationService: IConfigurationService, + @IRequestService private readonly requestService: IRequestService, @ITelemetryService telemetryService: ITelemetryService, - @IEnvironmentService environementService: IEnvironmentService, - @IWorkbenchEnvironmentService workbenchEnvironmentService: IWorkbenchEnvironmentService, + @IEnvironmentService environmentService: IEnvironmentService, + @IWorkbenchEnvironmentService private readonly _workbenchEnvironmentService: IWorkbenchEnvironmentService, + @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService, + @ILogService logService: ILogService, ) { - super(id, options, contentOptions, extension, webviewThemeDataProvider, telemetryService, environementService, workbenchEnvironmentService); - - if (!this.useExternalEndpoint && (!workbenchEnvironmentService.options || typeof workbenchEnvironmentService.webviewExternalEndpoint !== 'string')) { - throw new Error('To use iframe based webviews, you must configure `environmentService.webviewExternalEndpoint`'); - } + super(id, options, contentOptions, extension, webviewThemeDataProvider, logService, telemetryService, environmentService, _workbenchEnvironmentService); this._portMappingManager = this._register(new WebviewPortMappingManager( - () => this.extension ? this.extension.location : undefined, + () => this.extension?.location, () => this.content.options.portMapping || [], tunnelService )); @@ -57,19 +59,27 @@ export class IFrameWebview extends BaseWebview implements Web this._register(this.on(WebviewMessageChannels.loadLocalhost, (entry: any) => { this.localLocalhost(entry.origin); })); + + this.initElement(extension, options); } - protected createElement(options: WebviewOptions, contentOptions: WebviewContentOptions) { + protected createElement(options: WebviewOptions, _contentOptions: WebviewContentOptions) { + // Do not start loading the webview yet. + // Wait the end of the ctor when all listeners have been hooked up. const element = document.createElement('iframe'); element.className = `webview ${options.customClasses || ''}`; element.sandbox.add('allow-scripts', 'allow-same-origin', 'allow-forms'); - element.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.id}`); element.style.border = 'none'; element.style.width = '100%'; element.style.height = '100%'; return element; } + protected initElement(extension: WebviewExtensionDescription | undefined, options: WebviewOptions) { + // The extensionId and purpose in the URL are used for filtering in js-debug: + this.element!.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.id}&extensionId=${extension?.id.value ?? ''}&purpose=${options.purpose}`); + } + private get externalEndpoint(): string { const endpoint = this.workbenchEnvironmentService.webviewExternalEndpoint!.replace('{{uuid}}', this.id); if (endpoint[endpoint.length - 1] === '/') { @@ -78,10 +88,6 @@ export class IFrameWebview extends BaseWebview implements Web return endpoint; } - private get useExternalEndpoint(): boolean { - return isWeb || this._configurationService.getValue('webview.experimental.useExternalEndpoint'); - } - public mountTo(parent: HTMLElement) { if (this.element) { parent.appendChild(this.element); @@ -92,7 +98,7 @@ export class IFrameWebview extends BaseWebview implements Web super.html = this.preprocessHtml(value); } - private preprocessHtml(value: string): string { + protected preprocessHtml(value: string): string { return value .replace(/(["'])(?:vscode-resource):(\/\/([^\s\/'"]+?)(?=\/))?([^\s'"]+?)(["'])/gi, (match, startQuote, _1, scheme, path, endQuote) => { if (scheme) { @@ -108,7 +114,7 @@ export class IFrameWebview extends BaseWebview implements Web }); } - protected get extraContentOptions() { + protected get extraContentOptions(): any { return { endpoint: this.externalEndpoint, }; @@ -134,15 +140,42 @@ export class IFrameWebview extends BaseWebview implements Web private async loadResource(requestPath: string, uri: URI) { try { - const result = await loadLocalResource(uri, this.fileService, this.extension ? this.extension.location : undefined, - this.content.options.localResourceRoots || []); + const remoteAuthority = this._workbenchEnvironmentService.configuration.remoteAuthority; + const remoteConnectionData = remoteAuthority ? this._remoteAuthorityResolverService.getConnectionData(remoteAuthority) : null; + const extensionLocation = this.extension?.location; + + // If we are loading a file resource from a remote extension, rewrite the uri to go remote + let rewriteUri: undefined | ((uri: URI) => URI); + if (extensionLocation?.scheme === REMOTE_HOST_SCHEME) { + rewriteUri = (uri) => { + if (uri.scheme === Schemas.file && extensionLocation?.scheme === REMOTE_HOST_SCHEME) { + return URI.from({ + scheme: REMOTE_HOST_SCHEME, + authority: extensionLocation.authority, + path: '/vscode-resource', + query: JSON.stringify({ + requestResourcePath: uri.path + }) + }); + } + return uri; + }; + } + + const result = await loadLocalResource(uri, { + extensionLocation: extensionLocation, + roots: this.content.options.localResourceRoots || [], + remoteConnectionData, + rewriteUri, + }, this.fileService, this.requestService); if (result.type === WebviewResourceResponse.Type.Success) { + const { buffer } = await streamToBuffer(result.stream); return this._send('did-load-resource', { status: 200, path: requestPath, mime: result.mimeType, - data: result.buffer.buffer, + data: buffer, }); } } catch { @@ -156,7 +189,9 @@ export class IFrameWebview extends BaseWebview implements Web } private async localLocalhost(origin: string) { - const redirect = await this._portMappingManager.getRedirect(origin); + const authority = this._workbenchEnvironmentService.configuration.remoteAuthority; + const resolveAuthority = authority ? await this._remoteAuthorityResolverService.resolveAuthority(authority) : undefined; + const redirect = resolveAuthority ? await this._portMappingManager.getRedirect(resolveAuthority.authority, origin) : undefined; return this._send('did-load-localhost', { origin, location: redirect diff --git a/src/vs/workbench/contrib/webview/electron-browser/iframeWebviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/iframeWebviewElement.ts new file mode 100644 index 00000000000..facaa43b65a --- /dev/null +++ b/src/vs/workbench/contrib/webview/electron-browser/iframeWebviewElement.ts @@ -0,0 +1,138 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ThrottledDelayer } from 'vs/base/common/async'; +import { Schemas } from 'vs/base/common/network'; +import { URI } from 'vs/base/common/uri'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { IRequestService } from 'vs/platform/request/common/request'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; +import { WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; +import { IFrameWebview } from 'vs/workbench/contrib/webview/browser/webviewElement'; +import { rewriteVsCodeResourceUrls, WebviewResourceRequestManager } from 'vs/workbench/contrib/webview/electron-browser/resourceLoading'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; + +/** + * Webview backed by an iframe but that uses Electron APIs to power the webview. + */ +export class ElectronIframeWebview extends IFrameWebview { + + private readonly _resourceRequestManager: WebviewResourceRequestManager; + private _messagePromise = Promise.resolve(); + + private readonly _focusDelayer = this._register(new ThrottledDelayer(10)); + private _elementFocusImpl!: (options?: FocusOptions | undefined) => void; + + constructor( + id: string, + options: WebviewOptions, + contentOptions: WebviewContentOptions, + extension: WebviewExtensionDescription | undefined, + webviewThemeDataProvider: WebviewThemeDataProvider, + @ITunnelService tunnelService: ITunnelService, + @IFileService fileService: IFileService, + @IRequestService requestService: IRequestService, + @ITelemetryService telemetryService: ITelemetryService, + @IEnvironmentService environmentService: IEnvironmentService, + @IWorkbenchEnvironmentService _workbenchEnvironmentService: IWorkbenchEnvironmentService, + @IRemoteAuthorityResolverService _remoteAuthorityResolverService: IRemoteAuthorityResolverService, + @ILogService logService: ILogService, + @IInstantiationService instantiationService: IInstantiationService, + ) { + super(id, options, contentOptions, extension, webviewThemeDataProvider, + tunnelService, fileService, requestService, telemetryService, environmentService, _workbenchEnvironmentService, _remoteAuthorityResolverService, logService); + + this._resourceRequestManager = this._register(instantiationService.createInstance(WebviewResourceRequestManager, id, extension, this.content.options, Promise.resolve(undefined))); + } + + protected createElement(options: WebviewOptions, contentOptions: WebviewContentOptions) { + const element = super.createElement(options, contentOptions); + this._elementFocusImpl = element.focus.bind(element); + element.focus = () => { + this.doFocus(); + }; + return element; + } + + protected initElement(extension: WebviewExtensionDescription | undefined, options: WebviewOptions) { + // The extensionId and purpose in the URL are used for filtering in js-debug: + this.element!.setAttribute('src', `${Schemas.vscodeWebview}://${this.id}/index.html?id=${this.id}&platform=electron&extensionId=${extension?.id.value ?? ''}&purpose=${options.purpose}`); + } + + public set contentOptions(options: WebviewContentOptions) { + this._resourceRequestManager.update(options); + super.contentOptions = options; + } + + public set localResourcesRoot(resources: URI[]) { + this._resourceRequestManager.update({ + ...this.contentOptions, + localResourceRoots: resources, + }); + super.localResourcesRoot = resources; + } + + protected get extraContentOptions() { + return {}; + } + + protected async doPostMessage(channel: string, data?: any): Promise { + this._messagePromise = this._messagePromise + .then(() => this._resourceRequestManager.ensureReady()) + .then(() => { + this.element?.contentWindow!.postMessage({ channel, args: data }, '*'); + }); + } + + protected preprocessHtml(value: string): string { + return rewriteVsCodeResourceUrls(this.id, value); + } + + public focus(): void { + this.doFocus(); + + // Handle focus change programmatically (do not rely on event from ) + this.handleFocusChange(true); + } + + private doFocus() { + if (!this.element) { + return; + } + + // Workaround for https://github.com/microsoft/vscode/issues/75209 + // .focus is async for imframes so for a sequence of actions such as: + // + // 1. Open webview + // 1. Show quick pick from command palette + // + // We end up focusing the webview after showing the quick pick, which causes + // the quick pick to instantly dismiss. + // + // Workaround this by debouncing the focus and making sure we are not focused on an input + // when we try to re-focus. + this._focusDelayer.trigger(async () => { + if (!this.focused || !this.element) { + return; + } + + if (document.activeElement?.tagName === 'INPUT') { + return; + } + try { + this._elementFocusImpl(); + } catch { + // noop + } + this._send('focus'); + }); + } +} diff --git a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js index 5a2ab5c3fdb..293eecf7851 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js +++ b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js @@ -63,7 +63,7 @@ newFrame.contentWindow.addEventListener('mousemove', tryDispatchSyntheticMouseEvent); }, rewriteCSP: (csp) => { - return csp; + return csp.replace(/vscode-resource:(?=(\s|;|$))/g, 'vscode-webview-resource:'); }, }; diff --git a/src/vs/workbench/contrib/webview/electron-browser/pre/index.html b/src/vs/workbench/contrib/webview/electron-browser/pre/index.html new file mode 100644 index 00000000000..591caaf7d3a --- /dev/null +++ b/src/vs/workbench/contrib/webview/electron-browser/pre/index.html @@ -0,0 +1,8 @@ + + + +Virtual Document + + + + diff --git a/src/vs/workbench/contrib/webview/electron-browser/resourceLoading.ts b/src/vs/workbench/contrib/webview/electron-browser/resourceLoading.ts new file mode 100644 index 00000000000..90ea5bb94dd --- /dev/null +++ b/src/vs/workbench/contrib/webview/electron-browser/resourceLoading.ts @@ -0,0 +1,134 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { equals } from 'vs/base/common/arrays'; +import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; +import * as modes from 'vs/editor/common/modes'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService'; +import { WebviewContentOptions, WebviewExtensionDescription } from 'vs/workbench/contrib/webview/browser/webview'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { Schemas } from 'vs/base/common/network'; + +/** + * Try to rewrite `vscode-resource:` urls in html + */ +export function rewriteVsCodeResourceUrls( + id: string, + html: string, +): string { + return html + .replace(/(["'])vscode-resource:(\/\/([^\s\/'"]+?)(?=\/))?([^\s'"]+?)(["'])/gi, (_match, startQuote, _1, scheme, path, endQuote) => { + if (scheme) { + return `${startQuote}${Schemas.vscodeWebviewResource}://${id}/${scheme}${path}${endQuote}`; + } + if (!path.startsWith('//')) { + // Add an empty authority if we don't already have one + path = '//' + path; + } + return `${startQuote}${Schemas.vscodeWebviewResource}://${id}/file${path}${endQuote}`; + }); +} + +/** + * Manages the loading of resources inside of a webview. + */ +export class WebviewResourceRequestManager extends Disposable { + + private readonly _webviewManagerService: IWebviewManagerService; + + private _localResourceRoots: ReadonlyArray; + private _portMappings: ReadonlyArray; + + private _ready: Promise; + + constructor( + private readonly id: string, + private readonly extension: WebviewExtensionDescription | undefined, + initialContentOptions: WebviewContentOptions, + getWebContentsId: Promise, + @ILogService private readonly _logService: ILogService, + @IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService, + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IMainProcessService mainProcessService: IMainProcessService, + ) { + super(); + + this._logService.debug(`WebviewResourceRequestManager(${this.id}): init`); + + this._webviewManagerService = createChannelSender(mainProcessService.getChannel('webview')); + + this._localResourceRoots = initialContentOptions.localResourceRoots || []; + this._portMappings = initialContentOptions.portMapping || []; + + const remoteAuthority = environmentService.configuration.remoteAuthority; + const remoteConnectionData = remoteAuthority ? remoteAuthorityResolverService.getConnectionData(remoteAuthority) : null; + + this._ready = getWebContentsId.then(async (webContentsId) => { + this._logService.debug(`WebviewResourceRequestManager(${this.id}): did-start-loading`); + + await this._webviewManagerService.registerWebview(this.id, webContentsId, { + extensionLocation: this.extension?.location.toJSON(), + localResourceRoots: this._localResourceRoots.map(x => x.toJSON()), + remoteConnectionData: remoteConnectionData, + portMappings: this._portMappings, + }); + + this._logService.debug(`WebviewResourceRequestManager(${this.id}): did register`); + }); + + if (remoteAuthority) { + this._register(remoteAuthorityResolverService.onDidChangeConnectionData(() => { + const update = this._webviewManagerService.updateWebviewMetadata(this.id, { + remoteConnectionData: remoteAuthority ? remoteAuthorityResolverService.getConnectionData(remoteAuthority) : null, + }); + this._ready = this._ready.then(() => update); + })); + } + + this._register(toDisposable(() => this._webviewManagerService.unregisterWebview(this.id))); + } + + public update(options: WebviewContentOptions) { + const localResourceRoots = options.localResourceRoots || []; + const portMappings = options.portMapping || []; + + if (!this.needsUpdate(localResourceRoots, portMappings)) { + return; + } + + this._localResourceRoots = localResourceRoots; + this._portMappings = portMappings; + + this._logService.debug(`WebviewResourceRequestManager(${this.id}): will update`); + + const update = this._webviewManagerService.updateWebviewMetadata(this.id, { + localResourceRoots: localResourceRoots.map(x => x.toJSON()), + portMappings: portMappings, + }).then(() => { + this._logService.debug(`WebviewResourceRequestManager(${this.id}): did update`); + }); + + this._ready = this._ready.then(() => update); + } + + private needsUpdate( + localResourceRoots: readonly URI[], + portMappings: readonly modes.IWebviewPortMapping[], + ): boolean { + return !( + equals(this._localResourceRoots, localResourceRoots, (a, b) => a.toString() === b.toString()) + && equals(this._portMappings, portMappings, (a, b) => a.extensionHostPort === b.extensionHostPort && a.webviewPort === b.webviewPort) + ); + } + + public ensureReady(): Promise { + return this._ready; + } +} diff --git a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts index ed4ad60e2ed..5344b204ab9 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts @@ -3,15 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { isMacintosh } from 'vs/base/common/platform'; -import { SyncActionDescriptor, registerAction2 } from 'vs/platform/actions/common/actions'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { MultiCommand, RedoCommand, SelectAllCommand, UndoCommand } from 'vs/editor/browser/editorExtensions'; +import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/clipboard'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; -import { IWebviewService, webviewDeveloperCategory } from 'vs/workbench/contrib/webview/browser/webview'; -import { WebviewEditor } from 'vs/workbench/contrib/webview/browser/webviewEditor'; +import { IWebviewService, webviewDeveloperCategory, WebviewOverlay } from 'vs/workbench/contrib/webview/browser/webview'; +import { getActiveWebview } from 'vs/workbench/contrib/webview/browser/webviewCommands'; import * as webviewCommands from 'vs/workbench/contrib/webview/electron-browser/webviewCommands'; +import { ElectronWebviewBasedWebview } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; import { ElectronWebviewService } from 'vs/workbench/contrib/webview/electron-browser/webviewService'; registerSingleton(IWebviewService, ElectronWebviewService, true); @@ -23,17 +25,45 @@ actionRegistry.registerWorkbenchAction( webviewCommands.OpenWebviewDeveloperToolsAction.ALIAS, webviewDeveloperCategory); -function registerWebViewCommands(editorId: string): void { - const contextKeyExpr = ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', editorId), ContextKeyExpr.not('editorFocus') /* https://github.com/Microsoft/vscode/issues/58668 */)!; - - // These commands are only needed on MacOS where we have to disable the menu bar commands - if (isMacintosh) { - registerAction2(class extends webviewCommands.CopyWebviewEditorCommand { constructor() { super(contextKeyExpr); } }); - registerAction2(class extends webviewCommands.PasteWebviewEditorCommand { constructor() { super(contextKeyExpr); } }); - registerAction2(class extends webviewCommands.CutWebviewEditorCommand { constructor() { super(contextKeyExpr); } }); - registerAction2(class extends webviewCommands.UndoWebviewEditorCommand { constructor() { super(contextKeyExpr); } }); - registerAction2(class extends webviewCommands.RedoWebviewEditorCommand { constructor() { super(contextKeyExpr); } }); +function getActiveElectronBasedWebview(accessor: ServicesAccessor): ElectronWebviewBasedWebview | undefined { + const webview = getActiveWebview(accessor); + if (!webview) { + return undefined; } + + // Make sure we are really focused on the webview + if (!['WEBVIEW', 'IFRAME'].includes(document.activeElement?.tagName ?? '')) { + return undefined; + } + + if (webview instanceof ElectronWebviewBasedWebview) { + return webview; + } else if ('getInnerWebview' in (webview as WebviewOverlay)) { + const innerWebview = (webview as WebviewOverlay).getInnerWebview(); + if (innerWebview instanceof ElectronWebviewBasedWebview) { + return innerWebview; + } + } + + return undefined; } -registerWebViewCommands(WebviewEditor.ID); +const PRIORITY = 100; + +function overrideCommandForWebview(command: MultiCommand | undefined, f: (webview: ElectronWebviewBasedWebview) => void) { + command?.addImplementation(PRIORITY, accessor => { + const webview = getActiveElectronBasedWebview(accessor); + if (webview) { + f(webview); + return true; + } + return false; + }); +} + +overrideCommandForWebview(UndoCommand, webview => webview.undo()); +overrideCommandForWebview(RedoCommand, webview => webview.redo()); +overrideCommandForWebview(SelectAllCommand, webview => webview.selectAll()); +overrideCommandForWebview(CopyAction, webview => webview.copy()); +overrideCommandForWebview(PasteAction, webview => webview.paste()); +overrideCommandForWebview(CutAction, webview => webview.cut()); diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts index 1486280626c..08ccb9be4d8 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts @@ -5,16 +5,7 @@ import { WebviewTag } from 'electron'; import { Action } from 'vs/base/common/actions'; -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import * as nls from 'vs/nls'; -import { Action2 } from 'vs/platform/actions/common/actions'; -import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; -import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; -import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { WebviewOverlay, webviewHasOwnEditFunctionsContextKey } from 'vs/workbench/contrib/webview/browser/webview'; -import { getActiveWebviewEditor } from 'vs/workbench/contrib/webview/browser/webviewCommands'; -import { ElectronWebviewBasedWebview } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; export class OpenWebviewDeveloperToolsAction extends Action { static readonly ID = 'workbench.action.webview.openDeveloperTools'; @@ -37,128 +28,3 @@ export class OpenWebviewDeveloperToolsAction extends Action { return true; } } - -export class CopyWebviewEditorCommand extends Action2 { - public static readonly ID = 'editor.action.webvieweditor.copy'; - public static readonly LABEL = nls.localize('editor.action.webvieweditor.copy', "Copy2"); - - constructor(contextKeyExpr: ContextKeyExpression, readonly getActiveElectronBasedWebviewDelegate: (accessor: ServicesAccessor) => ElectronWebviewBasedWebview | undefined = getActiveElectronBasedWebview) { - super({ - id: CopyWebviewEditorCommand.ID, - title: CopyWebviewEditorCommand.LABEL, - keybinding: { - when: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - primary: KeyMod.CtrlCmd | KeyCode.KEY_C, - weight: KeybindingWeight.EditorContrib - } - }); - } - - public run(accessor: ServicesAccessor): void { - this.getActiveElectronBasedWebviewDelegate(accessor)?.copy(); - } -} - -export class PasteWebviewEditorCommand extends Action2 { - public static readonly ID = 'editor.action.webvieweditor.paste'; - public static readonly LABEL = nls.localize('editor.action.webvieweditor.paste', 'Paste'); - - constructor(contextKeyExpr: ContextKeyExpression, readonly getActiveElectronBasedWebviewDelegate: (accessor: ServicesAccessor) => ElectronWebviewBasedWebview | undefined = getActiveElectronBasedWebview) { - super({ - id: PasteWebviewEditorCommand.ID, - title: PasteWebviewEditorCommand.LABEL, - keybinding: { - when: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - primary: KeyMod.CtrlCmd | KeyCode.KEY_V, - weight: KeybindingWeight.EditorContrib - } - }); - } - - public run(accessor: ServicesAccessor): void { - this.getActiveElectronBasedWebviewDelegate(accessor)?.paste(); - } -} - -export class CutWebviewEditorCommand extends Action2 { - public static readonly ID = 'editor.action.webvieweditor.cut'; - public static readonly LABEL = nls.localize('editor.action.webvieweditor.cut', 'Cut'); - - constructor(contextKeyExpr: ContextKeyExpression, readonly getActiveElectronBasedWebviewDelegate: (accessor: ServicesAccessor) => ElectronWebviewBasedWebview | undefined = getActiveElectronBasedWebview) { - super({ - id: CutWebviewEditorCommand.ID, - title: CutWebviewEditorCommand.LABEL, - keybinding: { - when: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey)), - primary: KeyMod.CtrlCmd | KeyCode.KEY_X, - weight: KeybindingWeight.EditorContrib - } - }); - } - - public run(accessor: ServicesAccessor): void { - this.getActiveElectronBasedWebviewDelegate(accessor)?.cut(); - } -} - -export class UndoWebviewEditorCommand extends Action2 { - public static readonly ID = 'editor.action.webvieweditor.undo'; - public static readonly LABEL = nls.localize('editor.action.webvieweditor.undo', "Undo"); - - constructor(contextKeyExpr: ContextKeyExpression, readonly getActiveElectronBasedWebviewDelegate: (accessor: ServicesAccessor) => ElectronWebviewBasedWebview | undefined = getActiveElectronBasedWebview) { - super({ - id: UndoWebviewEditorCommand.ID, - title: UndoWebviewEditorCommand.LABEL, - keybinding: { - when: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey), ContextKeyExpr.not(webviewHasOwnEditFunctionsContextKey)), - primary: KeyMod.CtrlCmd | KeyCode.KEY_Z, - weight: KeybindingWeight.EditorContrib - } - }); - } - - public run(accessor: ServicesAccessor): void { - this.getActiveElectronBasedWebviewDelegate(accessor)?.undo(); - } -} - -export class RedoWebviewEditorCommand extends Action2 { - public static readonly ID = 'editor.action.webvieweditor.redo'; - public static readonly LABEL = nls.localize('editor.action.webvieweditor.redo', "Redo"); - - constructor(contextKeyExpr: ContextKeyExpression, readonly getActiveElectronBasedWebviewDelegate: (accessor: ServicesAccessor) => ElectronWebviewBasedWebview | undefined = getActiveElectronBasedWebview) { - super({ - id: RedoWebviewEditorCommand.ID, - title: RedoWebviewEditorCommand.LABEL, - keybinding: { - when: ContextKeyExpr.and(contextKeyExpr, ContextKeyExpr.not(InputFocusedContextKey), ContextKeyExpr.not(webviewHasOwnEditFunctionsContextKey)), - primary: KeyMod.CtrlCmd | KeyCode.KEY_Y, - secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z], - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z }, - weight: KeybindingWeight.EditorContrib - } - }); - } - - public run(accessor: ServicesAccessor): void { - this.getActiveElectronBasedWebviewDelegate(accessor)?.redo(); - } -} - -function getActiveElectronBasedWebview(accessor: ServicesAccessor): ElectronWebviewBasedWebview | undefined { - const webview = getActiveWebviewEditor(accessor); - if (!webview) { - return undefined; - } - - if (webview instanceof ElectronWebviewBasedWebview) { - return webview; - } else if ('getInnerWebview' in (webview as WebviewOverlay)) { - const innerWebview = (webview as WebviewOverlay).getInnerWebview(); - if (innerWebview instanceof ElectronWebviewBasedWebview) { - return innerWebview; - } - } - - return undefined; -} diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index 6df573e39fa..0ad394f8d3d 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -3,206 +3,30 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { FindInPageOptions, OnBeforeRequestListenerDetails, OnHeadersReceivedListenerDetails, Response, WebContents, WebviewTag } from 'electron'; +import { FindInPageOptions, WebviewTag } from 'electron'; import { addDisposableListener } from 'vs/base/browser/dom'; -import { equals } from 'vs/base/common/arrays'; import { ThrottledDelayer } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; import { once } from 'vs/base/common/functional'; -import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { isMacintosh } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; -import * as modes from 'vs/editor/common/modes'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { ILogService } from 'vs/platform/log/common/log'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { loadLocalResource, WebviewResourceResponse } from 'vs/platform/webview/common/resourceLoader'; +import { webviewPartitionId } from 'vs/platform/webview/common/resourceLoader'; import { IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService'; import { BaseWebview, WebviewMessageChannels } from 'vs/workbench/contrib/webview/browser/baseWebviewElement'; -import { Webview, WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; -import { WebviewPortMappingManager } from 'vs/workbench/contrib/webview/common/portMapping'; import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; +import { Webview, WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { WebviewFindDelegate, WebviewFindWidget } from '../browser/webviewFindWidget'; - -export function registerFileProtocol( - contents: WebContents, - protocol: string, - fileService: IFileService, - extensionLocation: URI | undefined, - getRoots: () => ReadonlyArray -) { - contents.session.protocol.registerBufferProtocol(protocol, async (request, callback: any) => { - try { - const result = await loadLocalResource(URI.parse(request.url), fileService, extensionLocation, getRoots()); - if (result.type === WebviewResourceResponse.Type.Success) { - return callback({ - data: Buffer.from(result.buffer.buffer), - mimeType: result.mimeType - }); - } - if (result.type === WebviewResourceResponse.Type.AccessDenied) { - console.error('Webview: Cannot load resource outside of protocol root'); - return callback({ error: -10 /* ACCESS_DENIED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ }); - } - } catch { - // noop - } - - return callback({ error: -2 /* FAILED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ }); - }); -} - -class WebviewTagHandle extends Disposable { - - private _webContents: undefined | WebContents | 'destroyed'; - - public constructor( - public readonly webview: WebviewTag, - ) { - super(); - - this._register(addDisposableListener(this.webview, 'destroyed', () => { - this._webContents = 'destroyed'; - })); - - this._register(addDisposableListener(this.webview, 'did-start-loading', once(() => { - const contents = this.webContents; - if (contents) { - this._onFirstLoad.fire(contents); - this._register(toDisposable(() => { - contents.removeAllListeners(); - })); - } - }))); - } - - private readonly _onFirstLoad = this._register(new Emitter()); - public readonly onFirstLoad = this._onFirstLoad.event; - - public get webContents(): WebContents | undefined { - if (this._webContents === 'destroyed') { - return undefined; - } - if (this._webContents) { - return this._webContents; - } - this._webContents = this.webview.getWebContents(); - return this._webContents; - } -} - -type OnBeforeRequestDelegate = (details: OnBeforeRequestListenerDetails) => Promise; -type OnHeadersReceivedDelegate = (details: OnHeadersReceivedListenerDetails) => { cancel: boolean; } | undefined; - -class WebviewSession extends Disposable { - - private readonly _onBeforeRequestDelegates: Array = []; - private readonly _onHeadersReceivedDelegates: Array = []; - - public constructor( - webviewHandle: WebviewTagHandle, - ) { - super(); - - this._register(webviewHandle.onFirstLoad(contents => { - contents.session.webRequest.onBeforeRequest(async (details, callback) => { - for (const delegate of this._onBeforeRequestDelegates) { - const result = await delegate(details); - if (typeof result !== 'undefined') { - callback(result); - return; - } - } - callback({}); - }); - - contents.session.webRequest.onHeadersReceived((details, callback) => { - for (const delegate of this._onHeadersReceivedDelegates) { - const result = delegate(details); - if (typeof result !== 'undefined') { - callback(result); - return; - } - } - callback({ cancel: false }); - }); - })); - } - - public onBeforeRequest(delegate: OnBeforeRequestDelegate) { - this._onBeforeRequestDelegates.push(delegate); - } - - public onHeadersReceived(delegate: OnHeadersReceivedDelegate) { - this._onHeadersReceivedDelegates.push(delegate); - } -} - -class WebviewProtocolProvider extends Disposable { - - private _ready?: Promise; - - private _localResourceRoots: ReadonlyArray; - - constructor( - handle: WebviewTagHandle, - extension: WebviewExtensionDescription | undefined, - initialLocalResourceRoots: ReadonlyArray, - fileService: IFileService, - ) { - super(); - - this._localResourceRoots = initialLocalResourceRoots; - - this._ready = new Promise((resolve, reject) => { - this._register(handle.onFirstLoad(contents => { - try { - registerFileProtocol(contents, Schemas.oldVscodeWebviewResource, fileService, extension?.location, () => this._localResourceRoots); - resolve(); - } catch { - reject(); - } - })); - }); - } - - public update(localResourceRoots: ReadonlyArray) { - if (equals(this._localResourceRoots, localResourceRoots, (a, b) => a.toString() === b.toString())) { - return; - } - - this._localResourceRoots = localResourceRoots; - } - - async synchronize(): Promise { - return this._ready; - } -} - -class WebviewPortMappingProvider extends Disposable { - - constructor( - session: WebviewSession, - getExtensionLocation: () => URI | undefined, - mappings: () => ReadonlyArray, - tunnelService: ITunnelService, - ) { - super(); - const manager = this._register(new WebviewPortMappingManager(getExtensionLocation, mappings, tunnelService)); - - session.onBeforeRequest(async details => { - const redirect = await manager.getRedirect(details.url); - return redirect ? { redirectURL: redirect } : undefined; - }); - } -} +import { WebviewResourceRequestManager, rewriteVsCodeResourceUrls } from './resourceLoading'; class WebviewKeyboardHandler { @@ -281,9 +105,9 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme private _webviewFindWidget: WebviewFindWidget | undefined; private _findStarted: boolean = false; - private readonly _protocolProvider: WebviewProtocolProvider; + private readonly _resourceRequestManager: WebviewResourceRequestManager; + private _messagePromise = Promise.resolve(); - private readonly _domReady: Promise; private readonly _focusDelayer = this._register(new ThrottledDelayer(10)); private _elementFocusImpl!: (options?: FocusOptions | undefined) => void; @@ -293,50 +117,59 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme contentOptions: WebviewContentOptions, extension: WebviewExtensionDescription | undefined, private readonly _webviewThemeDataProvider: WebviewThemeDataProvider, + @ILogService private readonly _myLogService: ILogService, @IInstantiationService instantiationService: IInstantiationService, - @IFileService fileService: IFileService, - @ITunnelService tunnelService: ITunnelService, @ITelemetryService telemetryService: ITelemetryService, - @IEnvironmentService environementService: IEnvironmentService, + @IEnvironmentService environmentService: IEnvironmentService, @IWorkbenchEnvironmentService workbenchEnvironmentService: IWorkbenchEnvironmentService, @IConfigurationService configurationService: IConfigurationService, @IMainProcessService mainProcessService: IMainProcessService, ) { - super(id, options, contentOptions, extension, _webviewThemeDataProvider, telemetryService, environementService, workbenchEnvironmentService); + super(id, options, contentOptions, extension, _webviewThemeDataProvider, _myLogService, telemetryService, environmentService, workbenchEnvironmentService); - const webviewAndContents = this._register(new WebviewTagHandle(this.element!)); - const session = this._register(new WebviewSession(webviewAndContents)); + /* __GDPR__ + "webview.createWebview" : { + "extension": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "enableFindWidget": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } + } + */ + telemetryService.publicLog('webview.createWebview', { + enableFindWidget: !!options.enableFindWidget, + extension: extension?.id.value, + }); - this._protocolProvider = this._register(new WebviewProtocolProvider(webviewAndContents, extension, this.content.options.localResourceRoots || [], fileService)); + this._myLogService.debug(`Webview(${this.id}): init`); - this._register(new WebviewPortMappingProvider( - session, - () => this.extension ? this.extension.location : undefined, - () => (this.content.options.portMapping || []), - tunnelService, - )); + const webviewId = new Promise((resolve, reject) => { + const sub = this._register(addDisposableListener(this.element!, 'dom-ready', once(() => { + if (!this.element) { + reject(); + throw new Error('No element'); + } + resolve(this.element.getWebContentsId()); + sub.dispose(); + }))); + }); + this._resourceRequestManager = this._register(instantiationService.createInstance(WebviewResourceRequestManager, id, extension, this.content.options, webviewId)); - this._register(addDisposableListener(this.element!, 'did-start-loading', once(() => { + this._register(addDisposableListener(this.element!, 'dom-ready', once(() => { this._register(ElectronWebviewBasedWebview.getWebviewKeyboardHandler(configurationService, mainProcessService).add(this.element!)); }))); - this._domReady = new Promise(resolve => { - const subscription = this._register(this.on(WebviewMessageChannels.webviewReady, () => { - subscription.dispose(); - resolve(); - })); - }); - this._register(addDisposableListener(this.element!, 'console-message', function (e: { level: number; message: string; line: number; sourceId: string; }) { console.log(`[Embedded Page] ${e.message}`); })); + this._register(addDisposableListener(this.element!, 'dom-ready', () => { + this._myLogService.debug(`Webview(${this.id}): dom-ready`); + // Workaround for https://github.com/electron/electron/issues/14474 if (this.element && (this.focused || document.activeElement === this.element)) { this.element.blur(); this.element.focus(); } })); + this._register(addDisposableListener(this.element!, 'crashed', () => { console.error('embedded page crashed'); })); @@ -360,6 +193,8 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme })); this._register(this.on('did-set-content', () => { + this._myLogService.debug(`Webview(${this.id}): did-set-content`); + if (this.element) { this.element.style.flex = ''; this.element.style.width = '100%'; @@ -380,16 +215,22 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme this.styledFindWidget(); } + + this.element!.preload = require.toUrl('./pre/electron-index.js'); + this.element!.src = `${Schemas.vscodeWebview}://${this.id}/electron-browser/index.html`; } protected createElement(options: WebviewOptions) { + // Do not start loading the webview yet. + // Wait the end of the ctor when all listeners have been hooked up. const element = document.createElement('webview'); this._elementFocusImpl = element.focus.bind(element); element.focus = () => { this.doFocus(); }; - element.setAttribute('partition', `webview${Date.now()}`); + + element.setAttribute('partition', webviewPartitionId); element.setAttribute('webpreferences', 'contextIsolation=yes'); element.className = `webview ${options.customClasses || ''}`; @@ -398,29 +239,29 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme element.style.height = '0'; element.style.outline = '0'; - element.preload = require.toUrl('./pre/electron-index.js'); - element.src = 'data:text/html;charset=utf-8,%3C%21DOCTYPE%20html%3E%0D%0A%3Chtml%20lang%3D%22en%22%20style%3D%22width%3A%20100%25%3B%20height%3A%20100%25%22%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3EVirtual%20Document%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%20style%3D%22margin%3A%200%3B%20overflow%3A%20hidden%3B%20width%3A%20100%25%3B%20height%3A%20100%25%22%20role%3D%22document%22%3E%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E'; return element; } public set contentOptions(options: WebviewContentOptions) { - this._protocolProvider.update(options.localResourceRoots || []); + this._myLogService.debug(`Webview(${this.id}): will set content options`); + this._resourceRequestManager.update(options); super.contentOptions = options; } public set localResourcesRoot(resources: URI[]) { - this._protocolProvider.update(resources || []); + this._resourceRequestManager.update({ + ...this.contentOptions, + localResourceRoots: resources, + }); super.localResourcesRoot = resources; } protected readonly extraContentOptions = {}; public set html(value: string) { - super.html = this.preprocessHtml(value); - } + this._myLogService.debug(`Webview(${this.id}): will set html`); - private preprocessHtml(value: string): string { - return value; + super.html = rewriteVsCodeResourceUrls(this.id, value); } public mountTo(parent: HTMLElement) { @@ -435,11 +276,14 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme } protected async doPostMessage(channel: string, data?: any): Promise { - await Promise.all([ - this._protocolProvider.synchronize(), - this._domReady, - ]); - this.element?.send(channel, data); + this._myLogService.debug(`Webview(${this.id}): will post message on '${channel}'`); + + this._messagePromise = this._messagePromise + .then(() => this._resourceRequestManager.ensureReady()) + .then(() => { + this._myLogService.debug(`Webview(${this.id}): did post message on '${channel}'`); + return this.element?.send(channel, data); + }); } public focus(): void { @@ -463,7 +307,7 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme // We end up focusing the webview after showing the quick pick, which causes // the quick pick to instantly dismiss. // - // Workarount this by debouncing the focus and making sure we are not focused on an input + // Workaround this by debouncing the focus and making sure we are not focused on an input // when we try to re-focus. this._focusDelayer.trigger(async () => { if (!this.focused || !this.element) { @@ -587,7 +431,7 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme protected on(channel: WebviewMessageChannels | string, handler: (data: T) => void): IDisposable { if (!this.element) { - return Disposable.None; + throw new Error('Cannot add event listener. No webview element found.'); } return addDisposableListener(this.element, 'ipc-message', (event) => { if (!this.element) { diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts index 037ba636611..44f3d38b9e9 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts @@ -6,10 +6,10 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { DynamicWebviewEditorOverlay } from 'vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay'; -import { IWebviewService, WebviewContentOptions, WebviewElement, WebviewExtensionDescription, WebviewIcons, WebviewOptions, WebviewOverlay } from 'vs/workbench/contrib/webview/browser/webview'; -import { IFrameWebview } from 'vs/workbench/contrib/webview/browser/webviewElement'; -import { WebviewIconManager } from 'vs/workbench/contrib/webview/browser/webviewIconManager'; import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; +import { IWebviewService, WebviewContentOptions, WebviewElement, WebviewExtensionDescription, WebviewIcons, WebviewOptions, WebviewOverlay } from 'vs/workbench/contrib/webview/browser/webview'; +import { WebviewIconManager } from 'vs/workbench/contrib/webview/browser/webviewIconManager'; +import { ElectronIframeWebview } from 'vs/workbench/contrib/webview/electron-browser/iframeWebviewElement'; import { ElectronWebviewBasedWebview } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; export class ElectronWebviewService implements IWebviewService { @@ -32,12 +32,8 @@ export class ElectronWebviewService implements IWebviewService { contentOptions: WebviewContentOptions, extension: WebviewExtensionDescription | undefined, ): WebviewElement { - const useExternalEndpoint = this._configService.getValue('webview.experimental.useExternalEndpoint'); - if (useExternalEndpoint) { - return this._instantiationService.createInstance(IFrameWebview, id, options, contentOptions, extension, this._webviewThemeDataProvider); - } else { - return this._instantiationService.createInstance(ElectronWebviewBasedWebview, id, options, contentOptions, extension, this._webviewThemeDataProvider); - } + const useIframes = this._configService.getValue('webview.experimental.useIframes'); + return this._instantiationService.createInstance(useIframes ? ElectronIframeWebview : ElectronWebviewBasedWebview, id, options, contentOptions, extension, this._webviewThemeDataProvider); } createWebviewOverlay( diff --git a/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts b/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts index 30f321498e8..7b6e2e716b8 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts @@ -40,7 +40,7 @@ export default () => `
  • ${escape(localize('welcomePage.tipsAndTricks', "Tips and Tricks"))}
  • ${escape(localize('welcomePage.productDocumentation', "Product documentation"))}
  • ${escape(localize('welcomePage.gitHubRepository', "GitHub repository"))}
  • -
  • ${escape(localize('welcomePage.stackOverflow', "Stack Overflow"))}
  • +
  • ${escape(localize('welcomePage.stackOverflow', "Stack Overflow"))}
  • ${escape(localize('welcomePage.newsletterSignup', "Join our Newsletter"))}
  • @@ -50,11 +50,11 @@ export default () => `

    ${escape(localize('welcomePage.customize', "Customize"))}

    -
    -
    diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts b/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts index 7cc9d291293..d4378989b5f 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts +++ b/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts @@ -309,7 +309,7 @@ export class WalkThroughPart extends BaseEditor { model.snippets.forEach((snippet, i) => { const model = snippet.textEditorModel; const id = `snippet-${model.uri.fragment}`; - const div = innerContent.querySelector(`#${id.replace(/\./g, '\\.')}`) as HTMLElement; + const div = innerContent.querySelector(`#${id.replace(/[\\.]/g, '\\$&')}`) as HTMLElement; const options = this.getEditorOptions(snippet.textEditorModel.getModeId()); const telemetryData = { diff --git a/src/vs/workbench/electron-browser/actions/developerActions.ts b/src/vs/workbench/electron-browser/actions/developerActions.ts index 41520472442..dbb005763d7 100644 --- a/src/vs/workbench/electron-browser/actions/developerActions.ts +++ b/src/vs/workbench/electron-browser/actions/developerActions.ts @@ -30,5 +30,5 @@ export class ToggleSharedProcessAction extends Action { const registry = Registry.as(Extensions.WorkbenchActions); -const developerCategory = nls.localize('developer', "Developer"); +const developerCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleSharedProcessAction), 'Developer: Toggle Shared Process', developerCategory); diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 4aaee4d11c9..252fb8975c4 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -64,6 +64,8 @@ import { AutoSaveMode, IFilesConfigurationService } from 'vs/workbench/services/ import { Event } from 'vs/base/common/event'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { clearAllFontInfos } from 'vs/editor/browser/config/configuration'; +import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IAddressProvider, IAddress } from 'vs/platform/remote/common/remoteAgentConnection'; export class NativeWindow extends Disposable { @@ -107,7 +109,8 @@ export class NativeWindow extends Disposable { @IWorkingCopyService private readonly workingCopyService: IWorkingCopyService, @IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService, @IStorageService private readonly storageService: IStorageService, - @IProductService private readonly productService: IProductService + @IProductService private readonly productService: IProductService, + @IRemoteAuthorityResolverService private readonly remoteAuthorityResolverService: IRemoteAuthorityResolverService, ) { super(); @@ -136,7 +139,7 @@ export class NativeWindow extends Disposable { if (request.from === 'touchbar') { const activeEditor = this.editorService.activeEditor; if (activeEditor) { - const resource = toResource(activeEditor, { supportSideBySide: SideBySideEditor.MASTER }); + const resource = toResource(activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY }); if (resource) { args.push(resource); } @@ -248,7 +251,7 @@ export class NativeWindow extends Disposable { // macOS OS integration if (isMacintosh) { this._register(this.editorService.onDidActiveEditorChange(() => { - const file = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER, filterByScheme: Schemas.file }); + const file = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.PRIMARY, filterByScheme: Schemas.file }); // Represented Filename this.updateRepresentedFilename(file?.fsPath); @@ -397,8 +400,8 @@ export class NativeWindow extends Disposable { // Handle open calls this.setupOpenHandlers(); - // Emit event when vscode is ready - this.lifecycleService.when(LifecyclePhase.Ready).then(() => ipcRenderer.send('vscode:workbenchReady', this.electronService.windowId)); + // Notify main side when window ready + this.lifecycleService.when(LifecyclePhase.Ready).then(() => this.electronService.notifyReady()); // Integrity warning this.integrityService.isPure().then(res => this.titleService.updateProperties({ isPure: res.isPure })); @@ -471,7 +474,13 @@ export class NativeWindow extends Disposable { if (options?.allowTunneling) { const portMappingRequest = extractLocalHostUriMetaDataForPortMapping(uri); if (portMappingRequest) { - const tunnel = await this.tunnelService.openTunnel(undefined, portMappingRequest.port); + const remoteAuthority = this.environmentService.configuration.remoteAuthority; + const addressProvider: IAddressProvider | undefined = remoteAuthority ? { + getAddress: async (): Promise => { + return (await this.remoteAuthorityResolverService.resolveAuthority(remoteAuthority)).authority; + } + } : undefined; + const tunnel = await this.tunnelService.openTunnel(addressProvider, undefined, portMappingRequest.port); if (tunnel) { return { resolved: uri.with({ authority: `127.0.0.1:${tunnel.tunnelLocalPort}` }), diff --git a/src/vs/workbench/electron-sandbox/desktop.contribution.ts b/src/vs/workbench/electron-sandbox/desktop.contribution.ts index 87280ecbcec..0296383f560 100644 --- a/src/vs/workbench/electron-sandbox/desktop.contribution.ts +++ b/src/vs/workbench/electron-sandbox/desktop.contribution.ts @@ -89,7 +89,7 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; // Actions: Developer (function registerDeveloperActions(): void { - const developerCategory = nls.localize('developer', "Developer"); + const developerCategory = nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"); registry.registerWorkbenchAction(SyncActionDescriptor.from(ReloadWindowWithExtensionsDisabledAction), 'Developer: Reload With Extensions Disabled', developerCategory); registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleDevToolsAction), 'Developer: Toggle Developer Tools', developerCategory); diff --git a/src/vs/workbench/services/authentication/browser/authenticationService.ts b/src/vs/workbench/services/authentication/browser/authenticationService.ts index c43a7e7078e..6a2e8562974 100644 --- a/src/vs/workbench/services/authentication/browser/authenticationService.ts +++ b/src/vs/workbench/services/authentication/browser/authenticationService.ts @@ -37,6 +37,9 @@ export interface IAuthenticationService { supportsMultipleAccounts(providerId: string): boolean; login(providerId: string, scopes: string[]): Promise; logout(providerId: string, sessionId: string): Promise; + + manageTrustedExtensionsForAccount(providerId: string, accountName: string): Promise; + signOutOfAccount(providerId: string, accountName: string): Promise; } export interface AllowedExtension { @@ -234,7 +237,13 @@ export class AuthenticationService extends Disposable implements IAuthentication group: '2_signInRequests', command: { id: `${extensionId}signIn`, - title: nls.localize('signInRequest', "Sign in to use {0} (1)", extensionName) + title: nls.localize( + { + key: 'signInRequest', + comment: ['The placeholder {0} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count.'] + }, + "Sign in to use {0} (1)", + extensionName) } }); @@ -330,6 +339,24 @@ export class AuthenticationService extends Disposable implements IAuthentication throw new Error(`No authentication provider '${id}' is currently registered.`); } } + + async manageTrustedExtensionsForAccount(id: string, accountName: string): Promise { + const authProvider = this._authenticationProviders.get(id); + if (authProvider) { + return authProvider.manageTrustedExtensions(accountName); + } else { + throw new Error(`No authentication provider '${id}' is currently registered.`); + } + } + + async signOutOfAccount(id: string, accountName: string): Promise { + const authProvider = this._authenticationProviders.get(id); + if (authProvider) { + return authProvider.signOut(accountName); + } else { + throw new Error(`No authentication provider '${id}' is currently registered.`); + } + } } registerSingleton(IAuthenticationService, AuthenticationService); diff --git a/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts b/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts index 4ddd27af47f..ca37d322d6c 100644 --- a/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts +++ b/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts @@ -3,243 +3,20 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { mergeSort } from 'vs/base/common/arrays'; -import { dispose, IDisposable, IReference, toDisposable } from 'vs/base/common/lifecycle'; -import { URI } from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; +import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { IBulkEditOptions, IBulkEditResult, IBulkEditService, IBulkEditPreviewHandler } from 'vs/editor/browser/services/bulkEditService'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; -import { Range } from 'vs/editor/common/core/range'; -import { Selection } from 'vs/editor/common/core/selection'; -import { EndOfLineSequence, IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; import { WorkspaceFileEdit, WorkspaceTextEdit, WorkspaceEdit } from 'vs/editor/common/modes'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; -import { localize } from 'vs/nls'; -import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; import { IProgress, IProgressStep, Progress } from 'vs/platform/progress/common/progress'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; -import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { SingleModelEditStackElement, MultiModelEditStackElement } from 'vs/editor/common/model/editStack'; - -type ValidationResult = { canApply: true } | { canApply: false, reason: URI }; - -class ModelEditTask implements IDisposable { - - public readonly model: ITextModel; - - protected _edits: IIdentifiedSingleEditOperation[]; - private _expectedModelVersionId: number | undefined; - protected _newEol: EndOfLineSequence | undefined; - - constructor(private readonly _modelReference: IReference) { - this.model = this._modelReference.object.textEditorModel; - this._edits = []; - } - - dispose() { - this._modelReference.dispose(); - } - - addEdit(resourceEdit: WorkspaceTextEdit): void { - this._expectedModelVersionId = resourceEdit.modelVersionId; - const { edit } = resourceEdit; - - if (typeof edit.eol === 'number') { - // honor eol-change - this._newEol = edit.eol; - } - if (!edit.range && !edit.text) { - // lacks both a range and the text - return; - } - if (Range.isEmpty(edit.range) && !edit.text) { - // no-op edit (replace empty range with empty text) - return; - } - - // create edit operation - let range: Range; - if (!edit.range) { - range = this.model.getFullModelRange(); - } else { - range = Range.lift(edit.range); - } - this._edits.push(EditOperation.replaceMove(range, edit.text)); - } - - validate(): ValidationResult { - if (typeof this._expectedModelVersionId === 'undefined' || this.model.getVersionId() === this._expectedModelVersionId) { - return { canApply: true }; - } - return { canApply: false, reason: this.model.uri }; - } - - getBeforeCursorState(): Selection[] | null { - return null; - } - - apply(): void { - if (this._edits.length > 0) { - this._edits = mergeSort(this._edits, (a, b) => Range.compareRangesUsingStarts(a.range, b.range)); - this.model.pushEditOperations(null, this._edits, () => null); - } - if (this._newEol !== undefined) { - this.model.pushEOL(this._newEol); - } - } -} - -class EditorEditTask extends ModelEditTask { - - private _editor: ICodeEditor; - - constructor(modelReference: IReference, editor: ICodeEditor) { - super(modelReference); - this._editor = editor; - } - - getBeforeCursorState(): Selection[] | null { - return this._editor.getSelections(); - } - - apply(): void { - if (this._edits.length > 0) { - this._edits = mergeSort(this._edits, (a, b) => Range.compareRangesUsingStarts(a.range, b.range)); - this._editor.executeEdits('', this._edits); - } - if (this._newEol !== undefined) { - if (this._editor.hasModel()) { - this._editor.getModel().pushEOL(this._newEol); - } - } - } -} - -class BulkEditModel implements IDisposable { - - private _edits = new Map(); - private _tasks: ModelEditTask[] | undefined; - - constructor( - private readonly _label: string | undefined, - private readonly _editor: ICodeEditor | undefined, - private readonly _progress: IProgress, - edits: WorkspaceTextEdit[], - @IEditorWorkerService private readonly _editorWorker: IEditorWorkerService, - @ITextModelService private readonly _textModelResolverService: ITextModelService, - @IUndoRedoService private readonly _undoRedoService: IUndoRedoService - ) { - edits.forEach(this._addEdit, this); - } - - dispose(): void { - if (this._tasks) { - dispose(this._tasks); - } - } - - private _addEdit(edit: WorkspaceTextEdit): void { - let array = this._edits.get(edit.resource.toString()); - if (!array) { - array = []; - this._edits.set(edit.resource.toString(), array); - } - array.push(edit); - } - - async prepare(): Promise { - - if (this._tasks) { - throw new Error('illegal state - already prepared'); - } - - this._tasks = []; - const promises: Promise[] = []; - - for (let [key, value] of this._edits) { - const promise = this._textModelResolverService.createModelReference(URI.parse(key)).then(async ref => { - let task: ModelEditTask; - let makeMinimal = false; - if (this._editor && this._editor.hasModel() && this._editor.getModel().uri.toString() === ref.object.textEditorModel.uri.toString()) { - task = new EditorEditTask(ref, this._editor); - makeMinimal = true; - } else { - task = new ModelEditTask(ref); - } - - for (const edit of value) { - if (makeMinimal) { - const newEdits = await this._editorWorker.computeMoreMinimalEdits(edit.resource, [edit.edit]); - if (!newEdits) { - task.addEdit(edit); - } else { - for (let moreMinialEdit of newEdits) { - task.addEdit({ ...edit, edit: moreMinialEdit }); - } - } - } else { - task.addEdit(edit); - } - } - - this._tasks!.push(task); - this._progress.report(undefined); - }); - promises.push(promise); - } - - await Promise.all(promises); - - return this; - } - - validate(): ValidationResult { - for (const task of this._tasks!) { - const result = task.validate(); - if (!result.canApply) { - return result; - } - } - return { canApply: true }; - } - - apply(): void { - const tasks = this._tasks!; - - if (tasks.length === 1) { - // This edit touches a single model => keep things simple - for (const task of tasks) { - task.model.pushStackElement(); - task.apply(); - task.model.pushStackElement(); - this._progress.report(undefined); - } - return; - } - - const multiModelEditStackElement = new MultiModelEditStackElement( - this._label || localize('workspaceEdit', "Workspace Edit"), - tasks.map(t => new SingleModelEditStackElement(t.model, t.getBeforeCursorState())) - ); - this._undoRedoService.pushElement(multiModelEditStackElement); - - for (const task of tasks) { - task.apply(); - this._progress.report(undefined); - } - - multiModelEditStackElement.close(); - } -} +import { BulkTextEdits } from 'vs/workbench/services/bulkEdit/browser/bulkTextEdits'; +import { BulkFileEdits } from 'vs/workbench/services/bulkEdit/browser/bulkFileEdits'; +import { ResourceMap } from 'vs/base/common/map'; type Edit = WorkspaceFileEdit | WorkspaceTextEdit; @@ -257,10 +34,6 @@ class BulkEdit { edits: Edit[], @IInstantiationService private readonly _instaService: IInstantiationService, @ILogService private readonly _logService: ILogService, - @IFileService private readonly _fileService: IFileService, - @ITextFileService private readonly _textFileService: ITextFileService, - @IWorkingCopyFileService private readonly _workingCopyFileService: IWorkingCopyFileService, - @IConfigurationService private readonly _configurationService: IConfigurationService ) { this._label = label; this._editor = editor; @@ -282,7 +55,7 @@ class BulkEdit { async perform(): Promise { - let seen = new Set(); + let seen = new ResourceMap(); let total = 0; const groups: Edit[][] = []; @@ -299,8 +72,8 @@ class BulkEdit { if (WorkspaceFileEdit.is(edit)) { total += 1; - } else if (!seen.has(edit.resource.toString())) { - seen.add(edit.resource.toString()); + } else if (!seen.has(edit.resource)) { + seen.set(edit.resource, true); total += 2; } } @@ -323,55 +96,14 @@ class BulkEdit { private async _performFileEdits(edits: WorkspaceFileEdit[], progress: IProgress) { this._logService.debug('_performFileEdits', JSON.stringify(edits)); - for (const edit of edits) { - progress.report(undefined); - - let options = edit.options || {}; - - if (edit.newUri && edit.oldUri) { - // rename - if (options.overwrite === undefined && options.ignoreIfExists && await this._fileService.exists(edit.newUri)) { - continue; // not overwriting, but ignoring, and the target file exists - } - await this._workingCopyFileService.move(edit.oldUri, edit.newUri, options.overwrite); - - } else if (!edit.newUri && edit.oldUri) { - // delete file - if (await this._fileService.exists(edit.oldUri)) { - let useTrash = this._configurationService.getValue('files.enableTrash'); - if (useTrash && !(this._fileService.hasCapability(edit.oldUri, FileSystemProviderCapabilities.Trash))) { - useTrash = false; // not supported by provider - } - await this._workingCopyFileService.delete(edit.oldUri, { useTrash, recursive: options.recursive }); - } else if (!options.ignoreIfNotExists) { - throw new Error(`${edit.oldUri} does not exist and can not be deleted`); - } - } else if (edit.newUri && !edit.oldUri) { - // create file - if (options.overwrite === undefined && options.ignoreIfExists && await this._fileService.exists(edit.newUri)) { - continue; // not overwriting, but ignoring, and the target file exists - } - await this._textFileService.create(edit.newUri, undefined, { overwrite: options.overwrite }); - } - } + const model = this._instaService.createInstance(BulkFileEdits, this._label || localize('workspaceEdit', "Workspace Edit"), progress, edits); + await model.apply(); } private async _performTextEdits(edits: WorkspaceTextEdit[], progress: IProgress): Promise { this._logService.debug('_performTextEdits', JSON.stringify(edits)); - - const model = this._instaService.createInstance(BulkEditModel, this._label, this._editor, progress, edits); - - await model.prepare(); - - // this._throwIfConflicts(conflicts); - const validationResult = model.validate(); - if (validationResult.canApply === false) { - model.dispose(); - throw new Error(`${validationResult.reason.toString()} has changed in the meantime`); - } - - model.apply(); - model.dispose(); + const model = this._instaService.createInstance(BulkTextEdits, this._label || localize('workspaceEdit', "Workspace Edit"), this._editor, progress, edits); + await model.apply(); } } @@ -384,7 +116,6 @@ export class BulkEditService implements IBulkEditService { constructor( @IInstantiationService private readonly _instaService: IInstantiationService, @ILogService private readonly _logService: ILogService, - @IModelService private readonly _modelService: IModelService, @IEditorService private readonly _editorService: IEditorService, ) { } @@ -413,18 +144,6 @@ export class BulkEditService implements IBulkEditService { const { edits } = edit; let codeEditor = options?.editor; - - // First check if loaded models were not changed in the meantime - for (const edit of edits) { - if (!WorkspaceFileEdit.is(edit) && typeof edit.modelVersionId === 'number') { - let model = this._modelService.getModel(edit.resource); - if (model && model.getVersionId() !== edit.modelVersionId) { - // model changed in the meantime - return Promise.reject(new Error(`${model.uri.toString()} has changed in the meantime`)); - } - } - } - // try to find code editor if (!codeEditor) { let candidate = this._editorService.activeTextEditorControl; diff --git a/src/vs/workbench/services/bulkEdit/browser/bulkFileEdits.ts b/src/vs/workbench/services/bulkEdit/browser/bulkFileEdits.ts new file mode 100644 index 00000000000..b5e768349cb --- /dev/null +++ b/src/vs/workbench/services/bulkEdit/browser/bulkFileEdits.ts @@ -0,0 +1,180 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +import { WorkspaceFileEdit, WorkspaceFileEditOptions } from 'vs/editor/common/modes'; +import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; +import { IProgress } from 'vs/platform/progress/common/progress'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; +import { IWorkspaceUndoRedoElement, UndoRedoElementType, IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; +import { URI } from 'vs/base/common/uri'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ILogService } from 'vs/platform/log/common/log'; +import { VSBuffer } from 'vs/base/common/buffer'; + +interface IFileOperation { + uris: URI[]; + perform(): Promise; +} + +class Noop implements IFileOperation { + readonly uris = []; + async perform() { return this; } +} + +class RenameOperation implements IFileOperation { + + constructor( + readonly newUri: URI, + readonly oldUri: URI, + readonly options: WorkspaceFileEditOptions, + @IWorkingCopyFileService private readonly _workingCopyFileService: IWorkingCopyFileService, + @IFileService private readonly _fileService: IFileService, + ) { } + + get uris() { + return [this.newUri, this.oldUri]; + } + + async perform(): Promise { + // rename + if (this.options.overwrite === undefined && this.options.ignoreIfExists && await this._fileService.exists(this.newUri)) { + return new Noop(); // not overwriting, but ignoring, and the target file exists + } + await this._workingCopyFileService.move([{ source: this.oldUri, target: this.newUri }], { overwrite: this.options.overwrite }); + return new RenameOperation(this.oldUri, this.newUri, this.options, this._workingCopyFileService, this._fileService); + } +} + +class CreateOperation implements IFileOperation { + + constructor( + readonly newUri: URI, + readonly options: WorkspaceFileEditOptions, + readonly contents: VSBuffer | undefined, + @IFileService private readonly _fileService: IFileService, + @IWorkingCopyFileService private readonly _workingCopyFileService: IWorkingCopyFileService, + @IInstantiationService private readonly _instaService: IInstantiationService, + ) { } + + get uris() { + return [this.newUri]; + } + + async perform(): Promise { + // create file + if (this.options.overwrite === undefined && this.options.ignoreIfExists && await this._fileService.exists(this.newUri)) { + return new Noop(); // not overwriting, but ignoring, and the target file exists + } + await this._workingCopyFileService.create(this.newUri, this.contents, { overwrite: this.options.overwrite }); + return this._instaService.createInstance(DeleteOperation, this.newUri, this.options); + } +} + +class DeleteOperation implements IFileOperation { + + constructor( + readonly oldUri: URI, + readonly options: WorkspaceFileEditOptions, + @IWorkingCopyFileService private readonly _workingCopyFileService: IWorkingCopyFileService, + @IFileService private readonly _fileService: IFileService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IInstantiationService private readonly _instaService: IInstantiationService, + @ILogService private readonly _logService: ILogService + ) { } + + get uris() { + return [this.oldUri]; + } + + async perform(): Promise { + // delete file + if (!await this._fileService.exists(this.oldUri)) { + if (!this.options.ignoreIfNotExists) { + throw new Error(`${this.oldUri} does not exist and can not be deleted`); + } + return new Noop(); + } + + let contents: VSBuffer | undefined; + try { + contents = (await this._fileService.readFile(this.oldUri)).value; + } catch (err) { + this._logService.critical(err); + } + + const useTrash = this._fileService.hasCapability(this.oldUri, FileSystemProviderCapabilities.Trash) && this._configurationService.getValue('files.enableTrash'); + await this._workingCopyFileService.delete([this.oldUri], { useTrash, recursive: this.options.recursive }); + return this._instaService.createInstance(CreateOperation, this.oldUri, this.options, contents); + } +} + +class FileUndoRedoElement implements IWorkspaceUndoRedoElement { + + readonly type = UndoRedoElementType.Workspace; + + readonly resources: readonly URI[]; + + constructor( + readonly label: string, + readonly operations: IFileOperation[] + ) { + this.resources = ([]).concat(...operations.map(op => op.uris)); + } + + async undo(): Promise { + await this._reverse(); + } + + async redo(): Promise { + await this._reverse(); + } + + private async _reverse() { + for (let i = 0; i < this.operations.length; i++) { + const op = this.operations[i]; + const undo = await op.perform(); + this.operations[i] = undo; + } + } +} + +export class BulkFileEdits { + + constructor( + private readonly _label: string, + private readonly _progress: IProgress, + private readonly _edits: WorkspaceFileEdit[], + @IInstantiationService private readonly _instaService: IInstantiationService, + @IUndoRedoService private readonly _undoRedoService: IUndoRedoService, + ) { } + + async apply(): Promise { + const undoOperations: IFileOperation[] = []; + for (const edit of this._edits) { + this._progress.report(undefined); + + const options = edit.options || {}; + let op: IFileOperation | undefined; + if (edit.newUri && edit.oldUri) { + // rename + op = this._instaService.createInstance(RenameOperation, edit.newUri, edit.oldUri, options); + } else if (!edit.newUri && edit.oldUri) { + // delete file + op = this._instaService.createInstance(DeleteOperation, edit.oldUri, options); + } else if (edit.newUri && !edit.oldUri) { + // create file + op = this._instaService.createInstance(CreateOperation, edit.newUri, options, undefined); + } + if (op) { + const undoOp = await op.perform(); + undoOperations.push(undoOp); + } + } + + this._undoRedoService.pushElement(new FileUndoRedoElement(this._label, undoOperations)); + } +} diff --git a/src/vs/workbench/services/bulkEdit/browser/bulkTextEdits.ts b/src/vs/workbench/services/bulkEdit/browser/bulkTextEdits.ts new file mode 100644 index 00000000000..ca9dfa7739c --- /dev/null +++ b/src/vs/workbench/services/bulkEdit/browser/bulkTextEdits.ts @@ -0,0 +1,245 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { mergeSort } from 'vs/base/common/arrays'; +import { dispose, IDisposable, IReference } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; +import { EndOfLineSequence, IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { WorkspaceTextEdit } from 'vs/editor/common/modes'; +import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; +import { IProgress } from 'vs/platform/progress/common/progress'; +import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; +import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; +import { SingleModelEditStackElement, MultiModelEditStackElement } from 'vs/editor/common/model/editStack'; +import { ResourceMap } from 'vs/base/common/map'; +import { IModelService } from 'vs/editor/common/services/modelService'; + +type ValidationResult = { canApply: true } | { canApply: false, reason: URI }; + +class ModelEditTask implements IDisposable { + + readonly model: ITextModel; + + private _expectedModelVersionId: number | undefined; + protected _edits: IIdentifiedSingleEditOperation[]; + protected _newEol: EndOfLineSequence | undefined; + + constructor(private readonly _modelReference: IReference) { + this.model = this._modelReference.object.textEditorModel; + this._edits = []; + } + + dispose() { + this._modelReference.dispose(); + } + + addEdit(resourceEdit: WorkspaceTextEdit): void { + this._expectedModelVersionId = resourceEdit.modelVersionId; + const { edit } = resourceEdit; + + if (typeof edit.eol === 'number') { + // honor eol-change + this._newEol = edit.eol; + } + if (!edit.range && !edit.text) { + // lacks both a range and the text + return; + } + if (Range.isEmpty(edit.range) && !edit.text) { + // no-op edit (replace empty range with empty text) + return; + } + + // create edit operation + let range: Range; + if (!edit.range) { + range = this.model.getFullModelRange(); + } else { + range = Range.lift(edit.range); + } + this._edits.push(EditOperation.replaceMove(range, edit.text)); + } + + validate(): ValidationResult { + if (typeof this._expectedModelVersionId === 'undefined' || this.model.getVersionId() === this._expectedModelVersionId) { + return { canApply: true }; + } + return { canApply: false, reason: this.model.uri }; + } + + getBeforeCursorState(): Selection[] | null { + return null; + } + + apply(): void { + if (this._edits.length > 0) { + this._edits = mergeSort(this._edits, (a, b) => Range.compareRangesUsingStarts(a.range, b.range)); + this.model.pushEditOperations(null, this._edits, () => null); + } + if (this._newEol !== undefined) { + this.model.pushEOL(this._newEol); + } + } +} + +class EditorEditTask extends ModelEditTask { + + private _editor: ICodeEditor; + + constructor(modelReference: IReference, editor: ICodeEditor) { + super(modelReference); + this._editor = editor; + } + + getBeforeCursorState(): Selection[] | null { + return this._editor.getSelections(); + } + + apply(): void { + if (this._edits.length > 0) { + this._edits = mergeSort(this._edits, (a, b) => Range.compareRangesUsingStarts(a.range, b.range)); + this._editor.executeEdits('', this._edits); + } + if (this._newEol !== undefined) { + if (this._editor.hasModel()) { + this._editor.getModel().pushEOL(this._newEol); + } + } + } +} + +export class BulkTextEdits { + + private readonly _edits = new ResourceMap(); + + constructor( + private readonly _label: string, + private readonly _editor: ICodeEditor | undefined, + private readonly _progress: IProgress, + edits: WorkspaceTextEdit[], + @IEditorWorkerService private readonly _editorWorker: IEditorWorkerService, + @IModelService private readonly _modelService: IModelService, + @ITextModelService private readonly _textModelResolverService: ITextModelService, + @IUndoRedoService private readonly _undoRedoService: IUndoRedoService + ) { + + for (const edit of edits) { + let array = this._edits.get(edit.resource); + if (!array) { + array = []; + this._edits.set(edit.resource, array); + } + array.push(edit); + } + } + + private _validateBeforePrepare(): void { + // First check if loaded models were not changed in the meantime + for (const array of this._edits.values()) { + for (let edit of array) { + if (typeof edit.modelVersionId === 'number') { + let model = this._modelService.getModel(edit.resource); + if (model && model.getVersionId() !== edit.modelVersionId) { + // model changed in the meantime + throw new Error(`${model.uri.toString()} has changed in the meantime`); + } + } + } + } + } + + private async _createEditsTasks(): Promise { + + const tasks: ModelEditTask[] = []; + const promises: Promise[] = []; + + for (let [key, value] of this._edits) { + const promise = this._textModelResolverService.createModelReference(key).then(async ref => { + let task: ModelEditTask; + let makeMinimal = false; + if (this._editor?.getModel()?.uri.toString() === ref.object.textEditorModel.uri.toString()) { + task = new EditorEditTask(ref, this._editor); + makeMinimal = true; + } else { + task = new ModelEditTask(ref); + } + + for (const edit of value) { + if (makeMinimal) { + const newEdits = await this._editorWorker.computeMoreMinimalEdits(edit.resource, [edit.edit]); + if (!newEdits) { + task.addEdit(edit); + } else { + for (let moreMinialEdit of newEdits) { + task.addEdit({ ...edit, edit: moreMinialEdit }); + } + } + } else { + task.addEdit(edit); + } + } + + tasks.push(task); + this._progress.report(undefined); + }); + promises.push(promise); + } + + await Promise.all(promises); + return tasks; + } + + private _validateTasks(tasks: ModelEditTask[]): ValidationResult { + for (const task of tasks) { + const result = task.validate(); + if (!result.canApply) { + return result; + } + } + return { canApply: true }; + } + + async apply(): Promise { + + this._validateBeforePrepare(); + const tasks = await this._createEditsTasks(); + + try { + + const validation = this._validateTasks(tasks); + if (!validation.canApply) { + throw new Error(`${validation.reason.toString()} has changed in the meantime`); + } + if (tasks.length === 1) { + // This edit touches a single model => keep things simple + for (const task of tasks) { + task.model.pushStackElement(); + task.apply(); + task.model.pushStackElement(); + this._progress.report(undefined); + } + } else { + // prepare multi model undo element + const multiModelEditStackElement = new MultiModelEditStackElement( + this._label, + tasks.map(t => new SingleModelEditStackElement(t.model, t.getBeforeCursorState())) + ); + this._undoRedoService.pushElement(multiModelEditStackElement); + for (const task of tasks) { + task.apply(); + this._progress.report(undefined); + } + multiModelEditStackElement.close(); + } + + } finally { + dispose(tasks); + } + } +} diff --git a/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts b/src/vs/workbench/services/clipboard/electron-sandbox/clipboardService.ts similarity index 85% rename from src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts rename to src/vs/workbench/services/clipboard/electron-sandbox/clipboardService.ts index 7440bebc308..3df04d9e4cf 100644 --- a/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts +++ b/src/vs/workbench/services/clipboard/electron-sandbox/clipboardService.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { clipboard } from 'electron'; import { URI } from 'vs/base/common/uri'; import { isMacintosh } from 'vs/base/common/platform'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; +import { VSBuffer } from 'vs/base/common/buffer'; export class NativeClipboardService implements IClipboardService { @@ -52,13 +52,12 @@ export class NativeClipboardService implements IClipboardService { return this.bufferToResources(await this.electronService.readClipboardBuffer(NativeClipboardService.FILE_FORMAT)); } - async hasResources(): Promise { return this.electronService.hasClipboard(NativeClipboardService.FILE_FORMAT); } - private resourcesToBuffer(resources: URI[]): Buffer { - return Buffer.from(resources.map(r => r.toString()).join('\n')); + private resourcesToBuffer(resources: URI[]): Uint8Array { + return VSBuffer.fromString(resources.map(r => r.toString()).join('\n')).buffer; } private bufferToResources(buffer: Uint8Array): URI[] { @@ -77,22 +76,6 @@ export class NativeClipboardService implements IClipboardService { return []; // do not trust clipboard data } } - - /** @deprecated */ - readFindTextSync(): string { - if (isMacintosh) { - return clipboard.readFindText(); - } - - return ''; - } - - /** @deprecated */ - writeFindTextSync(text: string): void { - if (isMacintosh) { - clipboard.writeFindText(text); - } - } } registerSingleton(IClipboardService, NativeClipboardService, true); diff --git a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts index b43d56fba26..13933070345 100644 --- a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts @@ -1807,7 +1807,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { return promise; }); - test('update remote settings', async () => { + test.skip('update remote settings', async () => { registerRemoteFileSystemProvider(); resolveRemoteEnvironment(); await initialize(); diff --git a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts index 182a1dd85e8..2ad97f9bc33 100644 --- a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts @@ -28,7 +28,6 @@ export interface IVariableResolveContext { export class AbstractVariableResolverService implements IConfigurationResolverService { static readonly VARIABLE_REGEXP = /\$\{(.*?)\}/g; - static readonly VARIABLE_REGEXP_SINGLE = /\$\{(.*?)\}/; declare readonly _serviceBrand: undefined; @@ -37,7 +36,7 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe protected _contributedVariables: Map Promise> = new Map(); - constructor(_context: IVariableResolveContext, _envVariables?: IProcessEnvironment) { + constructor(_context: IVariableResolveContext, _envVariables?: IProcessEnvironment, private _ignoreEditorVariables = false) { this._context = _context; if (_envVariables) { if (isWindows) { @@ -232,6 +231,9 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe return paths.basename(getFolderUri().fsPath); case 'lineNumber': + if (this._ignoreEditorVariables) { + return match; + } const lineNumber = this._context.getLineNumber(); if (lineNumber) { return lineNumber; @@ -239,6 +241,9 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe throw new Error(localize('canNotResolveLineNumber', "'{0}' can not be resolved. Make sure to have a line selected in the active editor.", match)); case 'selectedText': + if (this._ignoreEditorVariables) { + return match; + } const selectedText = this._context.getSelectedText(); if (selectedText) { return selectedText; @@ -246,15 +251,24 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe throw new Error(localize('canNotResolveSelectedText', "'{0}' can not be resolved. Make sure to have some text selected in the active editor.", match)); case 'file': + if (this._ignoreEditorVariables) { + return match; + } return getFilePath(); case 'relativeFile': + if (this._ignoreEditorVariables) { + return match; + } if (folderUri || argument) { return paths.normalize(paths.relative(getFolderUri().fsPath, getFilePath())); } return getFilePath(); case 'relativeFileDirname': + if (this._ignoreEditorVariables) { + return match; + } const dirname = paths.dirname(getFilePath()); if (folderUri || argument) { return paths.normalize(paths.relative(getFolderUri().fsPath, dirname)); @@ -262,15 +276,27 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe return dirname; case 'fileDirname': + if (this._ignoreEditorVariables) { + return match; + } return paths.dirname(getFilePath()); case 'fileExtname': + if (this._ignoreEditorVariables) { + return match; + } return paths.extname(getFilePath()); case 'fileBasename': + if (this._ignoreEditorVariables) { + return match; + } return paths.basename(getFilePath()); case 'fileBasenameNoExtension': + if (this._ignoreEditorVariables) { + return match; + } const basename = paths.basename(getFilePath()); return (basename.slice(0, basename.length - paths.extname(basename).length)); diff --git a/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts index 18bd53217cd..51e33eff6cb 100644 --- a/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts +++ b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts @@ -118,8 +118,7 @@ class NativeContextMenuService extends Disposable implements IContextMenuService x: Math.floor(x), y: Math.floor(y), positioningItem: delegate.autoSelectFirstItem ? 0 : undefined, - onHide: () => onHide() - }); + }, () => onHide()); } } diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index 301187f332b..7ab5ba02ff5 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -208,7 +208,8 @@ class DecorationProviderWrapper { constructor( readonly provider: IDecorationsProvider, private readonly _uriEmitter: Emitter, - private readonly _flushEmitter: Emitter + private readonly _flushEmitter: Emitter, + @ILogService private readonly _logService: ILogService, ) { this._dispoable = this.provider.onDidChange(uris => { if (!uris) { @@ -238,16 +239,17 @@ class DecorationProviderWrapper { } getOrRetrieve(uri: URI, includeChildren: boolean, callback: (data: IDecorationData, isChild: boolean) => void): void { - let item = this.data.get(uri); if (item === undefined) { // unknown -> trigger request + this._logService.trace('[Decorations] getOrRetrieve -> FETCH', this.provider.label, uri); item = this._fetchData(uri); } if (item && !(item instanceof DecorationDataRequest)) { // found something (which isn't pending anymore) + this._logService.trace('[Decorations] getOrRetrieve -> RESULT', this.provider.label, uri); callback(item, false); } @@ -257,6 +259,7 @@ class DecorationProviderWrapper { if (iter) { for (let item = iter.next(); !item.done; item = iter.next()) { if (item.value && !(item.value instanceof DecorationDataRequest)) { + this._logService.trace('[Decorations] getOrRetrieve -> RESULT (children)', this.provider.label, uri); callback(item.value, true); } } @@ -269,6 +272,7 @@ class DecorationProviderWrapper { // check for pending request and cancel it const pendingRequest = this.data.get(uri); if (pendingRequest instanceof DecorationDataRequest) { + this._logService.trace('[Decorations] fetchData -> CANCEL previous', this.provider.label, uri); pendingRequest.source.cancel(); this.data.delete(uri); } @@ -297,6 +301,7 @@ class DecorationProviderWrapper { } private _keepItem(uri: URI, data: IDecorationData | undefined): IDecorationData | null { + this._logService.trace('[Decorations] keepItem -> CANCEL previous', this.provider.label, uri, data); const deco = data ? data : null; const old = this.data.set(uri, deco); if (deco || old) { @@ -343,7 +348,8 @@ export class DecorationsService implements IDecorationsService { const wrapper = new DecorationProviderWrapper( provider, this._onDidChangeDecorationsDelayed, - this._onDidChangeDecorations + this._onDidChangeDecorations, + this._logService ); const remove = this._data.push(wrapper); diff --git a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts index 4cf2dddfdfb..1260a837cd8 100644 --- a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts @@ -25,6 +25,7 @@ import { coalesce } from 'vs/base/common/arrays'; import { trim } from 'vs/base/common/strings'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ILabelService } from 'vs/platform/label/common/label'; +import { isWindows } from 'vs/base/common/platform'; export abstract class AbstractFileDialogService implements IFileDialogService { @@ -218,21 +219,17 @@ export abstract class AbstractFileDialogService implements IFileDialogService { } private pickResource(options: IOpenDialogOptions): Promise { - const simpleFileDialog = this.createSimpleFileDialog(); + const simpleFileDialog = this.instantiationService.createInstance(SimpleFileDialog); return simpleFileDialog.showOpenDialog(options); } private saveRemoteResource(options: ISaveDialogOptions): Promise { - const remoteFileDialog = this.createSimpleFileDialog(); + const remoteFileDialog = this.instantiationService.createInstance(SimpleFileDialog); return remoteFileDialog.showSaveDialog(options); } - protected createSimpleFileDialog(): SimpleFileDialog { - return this.instantiationService.createInstance(SimpleFileDialog); - } - protected getSchemeFilterForWindow(): string { return !this.environmentService.configuration.remoteAuthority ? Schemas.file : REMOTE_HOST_SCHEME; } @@ -254,7 +251,7 @@ export abstract class AbstractFileDialogService implements IFileDialogService { const options: ISaveDialogOptions = { defaultUri, title: nls.localize('saveAsTitle', "Save As"), - availableFileSystems, + availableFileSystems }; interface IFilter { name: string; extensions: string[]; } @@ -282,8 +279,12 @@ export abstract class AbstractFileDialogService implements IFileDialogService { // We have no matching filter, e.g. because the language // is unknown. We still add the extension to the list of // filters though so that it can be picked - // (https://github.com/microsoft/vscode/issues/96283) - if (!matchingFilter && ext) { + // (https://github.com/microsoft/vscode/issues/96283) but + // only on Windows where this is an issue. Adding this to + // macOS would result in the following bugs: + // https://github.com/microsoft/vscode/issues/100614 and + // https://github.com/microsoft/vscode/issues/100241 + if (isWindows && !matchingFilter && ext) { matchingFilter = { name: trim(ext, '.').toUpperCase(), extensions: [trim(ext, '.')] }; } diff --git a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts index fd9ca23abcf..9b640a6b874 100644 --- a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts @@ -231,8 +231,8 @@ export class SimpleFileDialog { return this.remoteAgentEnvironment; } - protected async getUserHome(): Promise { - return (await this.pathService.userHome) ?? URI.from({ scheme: this.scheme, authority: this.remoteAuthority, path: '/' }); + protected getUserHome(): Promise { + return this.pathService.userHome({ preferLocal: this.scheme === Schemas.file }); } private async pickResource(isSave: boolean = false): Promise { diff --git a/src/vs/workbench/services/dialogs/electron-browser/simpleFileDialog.ts b/src/vs/workbench/services/dialogs/electron-browser/simpleFileDialog.ts deleted file mode 100644 index ac98bcc8193..00000000000 --- a/src/vs/workbench/services/dialogs/electron-browser/simpleFileDialog.ts +++ /dev/null @@ -1,49 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { URI } from 'vs/base/common/uri'; -import { SimpleFileDialog } from 'vs/workbench/services/dialogs/browser/simpleFileDialog'; -import { Schemas } from 'vs/base/common/network'; -import { IFileService } from 'vs/platform/files/common/files'; -import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; -import { ILabelService } from 'vs/platform/label/common/label'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { IModeService } from 'vs/editor/common/services/modeService'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { IPathService } from 'vs/workbench/services/path/common/pathService'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; - -export class NativeSimpleFileDialog extends SimpleFileDialog { - constructor( - @IFileService fileService: IFileService, - @IQuickInputService quickInputService: IQuickInputService, - @ILabelService labelService: ILabelService, - @IWorkspaceContextService workspaceContextService: IWorkspaceContextService, - @INotificationService notificationService: INotificationService, - @IFileDialogService fileDialogService: IFileDialogService, - @IModelService modelService: IModelService, - @IModeService modeService: IModeService, - @IWorkbenchEnvironmentService protected environmentService: INativeWorkbenchEnvironmentService, - @IRemoteAgentService remoteAgentService: IRemoteAgentService, - @IPathService protected pathService: IPathService, - @IKeybindingService keybindingService: IKeybindingService, - @IContextKeyService contextKeyService: IContextKeyService - ) { - super(fileService, quickInputService, labelService, workspaceContextService, notificationService, fileDialogService, modelService, modeService, environmentService, remoteAgentService, pathService, keybindingService, contextKeyService); - } - - protected async getUserHome(): Promise { - if (this.scheme !== Schemas.file) { - return super.getUserHome(); - } - return this.environmentService.userHome; - } -} diff --git a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/electron-sandbox/fileDialogService.ts similarity index 96% rename from src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts rename to src/vs/workbench/services/dialogs/electron-sandbox/fileDialogService.ts index 0bd77555b7b..f95983cf9c6 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-sandbox/fileDialogService.ts @@ -21,8 +21,6 @@ import { Schemas } from 'vs/base/common/network'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { ILabelService } from 'vs/platform/label/common/label'; -import { SimpleFileDialog } from 'vs/workbench/services/dialogs/browser/simpleFileDialog'; -import { NativeSimpleFileDialog } from 'vs/workbench/services/dialogs/electron-browser/simpleFileDialog'; export class FileDialogService extends AbstractFileDialogService implements IFileDialogService { @@ -191,10 +189,6 @@ export class FileDialogService extends AbstractFileDialogService implements IFil // Don't allow untitled schema through. return schema === Schemas.untitled ? [Schemas.file] : (schema !== Schemas.file ? [schema, Schemas.file] : [schema]); } - - protected createSimpleFileDialog(): SimpleFileDialog { - return this.instantiationService.createInstance(NativeSimpleFileDialog); - } } registerSingleton(IFileDialogService, FileDialogService, true); diff --git a/src/vs/workbench/services/editor/browser/codeEditorService.ts b/src/vs/workbench/services/editor/browser/codeEditorService.ts index b1b93a22314..ad4d75f6caa 100644 --- a/src/vs/workbench/services/editor/browser/codeEditorService.ts +++ b/src/vs/workbench/services/editor/browser/codeEditorService.ts @@ -12,6 +12,7 @@ import { TextEditorOptions } from 'vs/workbench/common/editor'; import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { extUri } from 'vs/base/common/resources'; export class CodeEditorService extends CodeEditorServiceImpl { @@ -47,13 +48,13 @@ export class CodeEditorService extends CodeEditorServiceImpl { // side as separate editor. const activeTextEditorControl = this.editorService.activeTextEditorControl; if ( - !sideBySide && // we need the current active group to be the taret - isDiffEditor(activeTextEditorControl) && // we only support this for active text diff editors - input.options && // we need options to apply - input.resource && // we need a request resource to compare with - activeTextEditorControl.getModel() && // we need a target model to compare with - source === activeTextEditorControl.getModifiedEditor() && // we need the source of this request to be the modified side of the diff editor - input.resource.toString() === activeTextEditorControl.getModel()!.modified.uri.toString() // we need the input resources to match with modified side + !sideBySide && // we need the current active group to be the taret + isDiffEditor(activeTextEditorControl) && // we only support this for active text diff editors + input.options && // we need options to apply + input.resource && // we need a request resource to compare with + activeTextEditorControl.getModel() && // we need a target model to compare with + source === activeTextEditorControl.getModifiedEditor() && // we need the source of this request to be the modified side of the diff editor + extUri.isEqual(input.resource, activeTextEditorControl.getModel()!.modified.uri) // we need the input resources to match with modified side ) { const targetEditor = activeTextEditorControl.getModifiedEditor(); diff --git a/src/vs/workbench/services/editor/browser/editorDropService.ts b/src/vs/workbench/services/editor/browser/editorDropService.ts new file mode 100644 index 00000000000..c8d04f4ab35 --- /dev/null +++ b/src/vs/workbench/services/editor/browser/editorDropService.ts @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { IEditorDropTargetDelegate } from 'vs/workbench/browser/parts/editor/editorDropTarget'; + +export const IEditorDropService = createDecorator('editorDropService'); + +export interface IEditorDropService { + + readonly _serviceBrand: undefined; + + /** + * Allows to register a drag and drop target for editors. + */ + createEditorDropTarget(container: HTMLElement, delegate: IEditorDropTargetDelegate): IDisposable; +} diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 1fe12a6ab79..4cd489bac56 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -34,7 +34,7 @@ import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/u import { timeout } from 'vs/base/common/async'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { indexOfPath } from 'vs/base/common/extpath'; -import { DEFAULT_CUSTOM_EDITOR, updateViewTypeSchema, editorAssociationsConfigurationNode } from 'vs/workbench/services/editor/common/editorAssociationsSetting'; +import { DEFAULT_CUSTOM_EDITOR, updateViewTypeSchema, editorAssociationsConfigurationNode } from 'vs/workbench/services/editor/common/editorOpenWith'; import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; @@ -185,8 +185,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { for (const editor of this.visibleEditors) { const resources = distinct(coalesce([ - toResource(editor, { supportSideBySide: SideBySideEditor.MASTER }), - toResource(editor, { supportSideBySide: SideBySideEditor.DETAILS }) + toResource(editor, { supportSideBySide: SideBySideEditor.PRIMARY }), + toResource(editor, { supportSideBySide: SideBySideEditor.SECONDARY }) ]), resource => resource.toString()); for (const resource of resources) { @@ -248,7 +248,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { // Determine new resulting target resource let targetResource: URI; - if (source.toString() === resource.toString()) { + if (extUri.isEqual(source, resource)) { targetResource = target; // file got moved } else { const ignoreCase = !this.fileService.hasCapability(resource, FileSystemProviderCapabilities.PathCaseSensitive); @@ -256,8 +256,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { targetResource = joinPath(target, resource.path.substr(index + source.path.length + 1)); // parent folder got moved } - // Delegate move() to editor instance - const moveResult = editor.move(group.id, targetResource); + // Delegate rename() to editor instance + const moveResult = editor.rename(group.id, targetResource); if (!moveResult) { return; // not target - ignore } @@ -380,8 +380,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { for (const editor of this.editors) { if (options.supportSideBySide && editor instanceof SideBySideEditorInput) { - conditionallyAddEditor(editor.master); - conditionallyAddEditor(editor.details); + conditionallyAddEditor(editor.primary); + conditionallyAddEditor(editor.secondary); } else { conditionallyAddEditor(editor); } @@ -506,7 +506,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { } for (const handler of this.openEditorHandlers) { - const result = handler.open(event.editor, event.options, group, event.context ?? OpenEditorContext.NEW_EDITOR, event.options?.override); + const result = handler.open(event.editor, event.options, group, event.context ?? OpenEditorContext.NEW_EDITOR); const override = result?.override; if (override) { event.prevent((() => override.then(editor => withNullAsUndefined(editor)))); @@ -1193,13 +1193,13 @@ export class EditorService extends Disposable implements EditorServiceImpl { return new Promise(resolve => { const listener = this.onDidCloseEditor(async event => { - const detailsResource = toResource(event.editor, { supportSideBySide: SideBySideEditor.DETAILS }); - const masterResource = toResource(event.editor, { supportSideBySide: SideBySideEditor.MASTER }); + const primaryResource = toResource(event.editor, { supportSideBySide: SideBySideEditor.PRIMARY }); + const secondaryResource = toResource(event.editor, { supportSideBySide: SideBySideEditor.SECONDARY }); // Remove from resources to wait for being closed based on the // resources from editors that got closed remainingEditors = remainingEditors.filter(({ resource }) => { - if (this.uriIdentityService.extUri.isEqual(resource, masterResource) || this.uriIdentityService.extUri.isEqual(resource, detailsResource)) { + if (this.uriIdentityService.extUri.isEqual(resource, primaryResource) || this.uriIdentityService.extUri.isEqual(resource, secondaryResource)) { return false; // remove - the closing editor matches this resource } @@ -1278,10 +1278,6 @@ export class DelegatingEditorService implements IEditorService { @IEditorService private editorService: EditorService ) { } - getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) { - return this.editorService.getEditorOverrides(resource, options, group); - } - openEditor(editor: IEditorInput, options?: IEditorOptions | ITextEditorOptions, group?: OpenInEditorGroup): Promise; openEditor(editor: IResourceEditorInput | IUntitledTextResourceEditorInput, group?: OpenInEditorGroup): Promise; openEditor(editor: IResourceDiffEditorInput, group?: OpenInEditorGroup): Promise; @@ -1351,6 +1347,7 @@ export class DelegatingEditorService implements IEditorService { isOpen(editor: IEditorInput | IResourceEditorInput): boolean { return this.editorService.isOpen(editor as IResourceEditorInput /* TS fail */); } overrideOpenEditor(handler: IOpenEditorOverrideHandler): IDisposable { return this.editorService.overrideOpenEditor(handler); } + getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) { return this.editorService.getEditorOverrides(resource, options, group); } invokeWithinEditorContext(fn: (accessor: ServicesAccessor) => T): T { return this.editorService.invokeWithinEditorContext(fn); } diff --git a/src/vs/workbench/services/editor/common/editorAssociationsSetting.ts b/src/vs/workbench/services/editor/common/editorAssociationsSetting.ts deleted file mode 100644 index aded0a85d1e..00000000000 --- a/src/vs/workbench/services/editor/common/editorAssociationsSetting.ts +++ /dev/null @@ -1,76 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import * as nls from 'vs/nls'; -import { IConfigurationNode, IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; -import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { ICustomEditorInfo } from 'vs/workbench/services/editor/common/editorService'; - -export const customEditorsAssociationsSettingId = 'workbench.editorAssociations'; - -export const viewTypeSchamaAddition: IJSONSchema = { - type: 'string', - enum: [] -}; - -export type CustomEditorAssociation = { - readonly viewType: string; - readonly filenamePattern?: string; -}; - -export type CustomEditorsAssociations = readonly CustomEditorAssociation[]; - -export const editorAssociationsConfigurationNode: IConfigurationNode = { - ...workbenchConfigurationNodeBase, - properties: { - [customEditorsAssociationsSettingId]: { - type: 'array', - markdownDescription: nls.localize('editor.editorAssociations', "Configure which editor to use for specific file types."), - items: { - type: 'object', - defaultSnippets: [{ - body: { - 'viewType': '$1', - 'filenamePattern': '$2' - } - }], - properties: { - 'viewType': { - anyOf: [ - { - type: 'string', - description: nls.localize('editor.editorAssociations.viewType', "The unique id of the editor to use."), - }, - viewTypeSchamaAddition - ] - }, - 'filenamePattern': { - type: 'string', - description: nls.localize('editor.editorAssociations.filenamePattern', "Glob pattern specifying which files the editor should be used for."), - } - } - } - } - } -}; - - -const builtinProviderDisplayName = nls.localize('builtinProviderDisplayName', "Built-in"); - -export const DEFAULT_CUSTOM_EDITOR: ICustomEditorInfo = { - id: 'default', - displayName: nls.localize('promptOpenWith.defaultEditor.displayName', "Text Editor"), - providerDisplayName: builtinProviderDisplayName -}; - -export function updateViewTypeSchema(enumValues: string[], enumDescriptions: string[]): void { - viewTypeSchamaAddition.enum = enumValues; - viewTypeSchamaAddition.enumDescriptions = enumDescriptions; - - Registry.as(Extensions.Configuration) - .notifyConfigurationSchemaUpdated(editorAssociationsConfigurationNode); -} diff --git a/src/vs/workbench/contrib/files/common/openWith.ts b/src/vs/workbench/services/editor/common/editorOpenWith.ts similarity index 59% rename from src/vs/workbench/contrib/files/common/openWith.ts rename to src/vs/workbench/services/editor/common/editorOpenWith.ts index ac0f274af2f..af8462e5f42 100644 --- a/src/vs/workbench/contrib/files/common/openWith.ts +++ b/src/vs/workbench/services/editor/common/editorOpenWith.ts @@ -3,20 +3,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { basename, extname, isEqual } from 'vs/base/common/resources'; -import { URI } from 'vs/base/common/uri'; import * as nls from 'vs/nls'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; -import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { IEditorInput, IEditorPane } from 'vs/workbench/common/editor'; -import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; -import { DEFAULT_EDITOR_ID } from 'vs/workbench/contrib/files/common/files'; -import { CustomEditorAssociation, CustomEditorsAssociations, customEditorsAssociationsSettingId } from 'vs/workbench/services/editor/common/editorAssociationsSetting'; +import { IJSONSchema } from 'vs/base/common/jsonSchema'; +import { IConfigurationNode, IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; +import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { ICustomEditorInfo, IEditorService, IOpenEditorOverrideHandler, IOpenEditorOverrideEntry } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorInput, IEditorPane, IEditorInputFactoryRegistry, Extensions as EditorExtensions } from 'vs/workbench/common/editor'; +import { ITextEditorOptions, IEditorOptions } from 'vs/platform/editor/common/editor'; import { IEditorGroup, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { IEditorService, IOpenEditorOverrideEntry, IOpenEditorOverrideHandler } from 'vs/workbench/services/editor/common/editorService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; +import { URI } from 'vs/base/common/uri'; +import { extname, basename, isEqual } from 'vs/base/common/resources'; -const builtinProviderDisplayName = nls.localize('builtinProviderDisplayName', "Built-in"); +/** + * Id of the default editor for open with. + */ +export const DEFAULT_EDITOR_ID = 'default'; /** * Try to open an resource with a given editor. @@ -38,14 +42,16 @@ export async function openEditorWith( return; } - const allEditorOverrides = getAllAvailableEditors(resource, options, group, editorService); + const overrideOptions = { ...options, override: id }; + + const allEditorOverrides = getAllAvailableEditors(resource, id, overrideOptions, group, editorService); if (!allEditorOverrides.length) { return; } const overrideToUse = typeof id === 'string' && allEditorOverrides.find(([_, entry]) => entry.id === id); if (overrideToUse) { - return overrideToUse[0].open(input, options, group, OpenEditorContext.NEW_EDITOR, id)?.override; + return overrideToUse[0].open(input, overrideOptions, group, OpenEditorContext.NEW_EDITOR)?.override; } // Prompt @@ -108,13 +114,15 @@ export async function openEditorWith( picker.show(); }); - return pickedItem?.handler.open(input!, options, group, OpenEditorContext.NEW_EDITOR, pickedItem.id)?.override; + return pickedItem?.handler.open(input, { ...options, override: pickedItem.id }, group, OpenEditorContext.NEW_EDITOR)?.override; } +const builtinProviderDisplayName = nls.localize('builtinProviderDisplayName', "Built-in"); + export const defaultEditorOverrideEntry = Object.freeze({ id: DEFAULT_EDITOR_ID, label: nls.localize('promptOpenWith.defaultEditor.displayName', "Text Editor"), - detail: builtinProviderDisplayName, + detail: builtinProviderDisplayName }); /** @@ -122,10 +130,12 @@ export const defaultEditorOverrideEntry = Object.freeze({ */ export function getAllAvailableEditors( resource: URI, + id: string | undefined, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, - editorService: IEditorService, + editorService: IEditorService ): Array<[IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]> { + const fileEditorInputFactory = Registry.as(EditorExtensions.EditorInputFactories).getFileEditorInputFactory(); const overrides = editorService.getEditorOverrides(resource, options, group); if (!overrides.some(([_, entry]) => entry.id === DEFAULT_EDITOR_ID)) { overrides.unshift([ @@ -142,9 +152,71 @@ export function getAllAvailableEditors( }, { ...defaultEditorOverrideEntry, - active: editorService.activeEditor instanceof FileEditorInput && isEqual(editorService.activeEditor.resource, resource), + active: fileEditorInputFactory.isFileEditorInput(editorService.activeEditor) && isEqual(editorService.activeEditor.resource, resource), }]); } + return overrides; } +export const customEditorsAssociationsSettingId = 'workbench.editorAssociations'; + +export const viewTypeSchamaAddition: IJSONSchema = { + type: 'string', + enum: [] +}; + +export type CustomEditorAssociation = { + readonly viewType: string; + readonly filenamePattern?: string; +}; + +export type CustomEditorsAssociations = readonly CustomEditorAssociation[]; + +export const editorAssociationsConfigurationNode: IConfigurationNode = { + ...workbenchConfigurationNodeBase, + properties: { + [customEditorsAssociationsSettingId]: { + type: 'array', + markdownDescription: nls.localize('editor.editorAssociations', "Configure which editor to use for specific file types."), + items: { + type: 'object', + defaultSnippets: [{ + body: { + 'viewType': '$1', + 'filenamePattern': '$2' + } + }], + properties: { + 'viewType': { + anyOf: [ + { + type: 'string', + description: nls.localize('editor.editorAssociations.viewType', "The unique id of the editor to use."), + }, + viewTypeSchamaAddition + ] + }, + 'filenamePattern': { + type: 'string', + description: nls.localize('editor.editorAssociations.filenamePattern', "Glob pattern specifying which files the editor should be used for."), + } + } + } + } + } +}; + +export const DEFAULT_CUSTOM_EDITOR: ICustomEditorInfo = { + id: 'default', + displayName: nls.localize('promptOpenWith.defaultEditor.displayName', "Text Editor"), + providerDisplayName: builtinProviderDisplayName +}; + +export function updateViewTypeSchema(enumValues: string[], enumDescriptions: string[]): void { + viewTypeSchamaAddition.enum = enumValues; + viewTypeSchamaAddition.enumDescriptions = enumDescriptions; + + Registry.as(Extensions.Configuration) + .notifyConfigurationSchemaUpdated(editorAssociationsConfigurationNode); +} diff --git a/src/vs/workbench/services/editor/common/editorService.ts b/src/vs/workbench/services/editor/common/editorService.ts index 806c17fa943..8e481661296 100644 --- a/src/vs/workbench/services/editor/common/editorService.ts +++ b/src/vs/workbench/services/editor/common/editorService.ts @@ -35,7 +35,7 @@ export interface IOpenEditorOverrideEntry { } export interface IOpenEditorOverrideHandler { - open(editor: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext, id?: string): IOpenEditorOverride | undefined; + open(editor: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext): IOpenEditorOverride | undefined; getEditorOverrides?(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[]; } @@ -74,7 +74,6 @@ export interface ISaveAllEditorsOptions extends ISaveEditorsOptions, IBaseSaveRe export interface IRevertAllEditorsOptions extends IRevertOptions, IBaseSaveRevertAllEditorOptions { } export interface ICustomEditorInfo { - readonly id: string; readonly displayName: string; readonly providerDisplayName: string; @@ -82,6 +81,7 @@ export interface ICustomEditorInfo { export interface ICustomEditorViewTypesHandler { readonly onDidChangeViewTypes: Event; + getViewTypes(): ICustomEditorInfo[]; } diff --git a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts index 35cf6d33892..b74c4cb5358 100644 --- a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts @@ -449,9 +449,7 @@ suite('EditorGroupsService', () => { assert.equal(editorCloseCounter1, 1); assert.equal(editorWillCloseCounter, 1); - assert.ok(inputInactive.gotClosed); - assert.equal(inputInactive.gotClosed?.group, group.id); - assert.equal(inputInactive.gotClosed?.openedInOtherGroups, false); + assert.ok(inputInactive.gotDisposed); assert.equal(group.activeEditor, input); @@ -487,12 +485,8 @@ suite('EditorGroupsService', () => { await group.closeEditors([input, inputInactive]); - assert.ok(input.gotClosed); - assert.equal(input.gotClosed?.group, group.id); - assert.equal(input.gotClosed?.openedInOtherGroups, false); - assert.ok(inputInactive.gotClosed); - assert.equal(inputInactive.gotClosed?.group, group.id); - assert.equal(inputInactive.gotClosed?.openedInOtherGroups, false); + assert.ok(input.gotDisposed); + assert.ok(inputInactive.gotDisposed); assert.equal(group.isEmpty, true); part.dispose(); @@ -513,15 +507,11 @@ suite('EditorGroupsService', () => { await rightGroup.closeEditor(input); - assert.ok(input.gotClosed); - assert.equal(input.gotClosed?.group, rightGroup.id); - assert.equal(input.gotClosed?.openedInOtherGroups, true); + assert.ok(!input.gotDisposed); await group.closeEditor(input); - assert.ok(input.gotClosed); - assert.equal(input.gotClosed?.group, group.id); - assert.equal(input.gotClosed?.openedInOtherGroups, false); + assert.ok(input.gotDisposed); }); test('closeEditors (except one)', async () => { diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index 009cab9fd5a..bec876bc4d3 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -377,8 +377,8 @@ suite('EditorService', () => { // Untyped Input (diff) input = service.createEditorInput({ - leftResource: toResource.call(this, '/master.html'), - rightResource: toResource.call(this, '/detail.html') + leftResource: toResource.call(this, '/primary.html'), + rightResource: toResource.call(this, '/secondary.html') }); assert(input instanceof DiffEditorInput); }); @@ -1084,7 +1084,7 @@ suite('EditorService', () => { const editor = await service.openEditor(input1, { pinned: true }); await service.openEditor(input2, { pinned: true }); - const whenClosed = service.whenClosed([input1, input2]); + const whenClosed = service.whenClosed([{ resource: input1.resource }, { resource: input2.resource }]); editor?.group?.closeAllEditors(); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index b94b266326e..9369ad3a7dc 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -62,12 +62,12 @@ export class BrowserEnvironmentConfiguration implements IEnvironmentConfiguratio @memoize get filesToDiff(): IPath[] | undefined { if (this.payload) { - const fileToDiffDetail = this.payload.get('diffFileDetail'); - const fileToDiffMaster = this.payload.get('diffFileMaster'); - if (fileToDiffDetail && fileToDiffMaster) { + const fileToDiffPrimary = this.payload.get('diffFilePrimary'); + const fileToDiffSecondary = this.payload.get('diffFileSecondary'); + if (fileToDiffPrimary && fileToDiffSecondary) { return [ - { fileUri: URI.parse(fileToDiffDetail) }, - { fileUri: URI.parse(fileToDiffMaster) } + { fileUri: URI.parse(fileToDiffSecondary) }, + { fileUri: URI.parse(fileToDiffPrimary) } ]; } } diff --git a/src/vs/workbench/services/environment/electron-browser/environmentService.ts b/src/vs/workbench/services/environment/electron-browser/environmentService.ts index 2d2e6f5294c..20da095a459 100644 --- a/src/vs/workbench/services/environment/electron-browser/environmentService.ts +++ b/src/vs/workbench/services/environment/electron-browser/environmentService.ts @@ -24,8 +24,6 @@ export interface INativeWorkbenchEnvironmentService extends IWorkbenchEnvironmen readonly log?: string; readonly extHostLogsPath: URI; - - readonly userHome: URI; } export interface INativeEnvironmentConfiguration extends IEnvironmentConfiguration, INativeWindowConfiguration { } @@ -42,15 +40,10 @@ export class NativeWorkbenchEnvironmentService extends EnvironmentService implem } @memoize - get webviewResourceRoot(): string { - return `${Schemas.oldVscodeWebviewResource}://{{resource}}`; - - // TODO mjbvz: restore when switching to new protcol - // return `${Schemas.vscodeWebviewResource}://{{uuid}}/{{resource}}`; - } + get webviewResourceRoot(): string { return `${Schemas.vscodeWebviewResource}://{{uuid}}/{{resource}}`; } @memoize - get webviewCspSource(): string { return `${Schemas.oldVscodeWebviewResource}:`; } + get webviewCspSource(): string { return `${Schemas.vscodeWebviewResource}:`; } @memoize get userRoamingDataHome(): URI { return this.appSettingsHome.with({ scheme: Schemas.userData }); } diff --git a/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts new file mode 100644 index 00000000000..7790f5b83a5 --- /dev/null +++ b/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts @@ -0,0 +1,72 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IBuiltinExtensionsScannerService, IScannedExtension, ExtensionType, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; +import { isWeb } from 'vs/base/common/platform'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { URI } from 'vs/base/common/uri'; +import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; + +interface IScannedBuiltinExtension { + extensionPath: string, + packageJSON: IExtensionManifest, + packageNLSPath?: string, + readmePath?: string, + changelogPath?: string, +} + +export class BuiltinExtensionsScannerService implements IBuiltinExtensionsScannerService { + + declare readonly _serviceBrand: undefined; + + private readonly builtinExtensions: IScannedExtension[] = []; + + constructor( + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IUriIdentityService uriIdentityService: IUriIdentityService, + ) { + + const builtinExtensionsServiceUrl = environmentService.options?.builtinExtensionsServiceUrl ? URI.parse(environmentService.options?.builtinExtensionsServiceUrl) : undefined; + if (isWeb && builtinExtensionsServiceUrl) { + + let scannedBuiltinExtensions: IScannedBuiltinExtension[] = []; + + if (environmentService.isBuilt) { + // Built time configuration (do NOT modify) + scannedBuiltinExtensions = [/*BUILD->INSERT_BUILTIN_EXTENSIONS*/]; + } else { + // Find builtin extensions by checking for DOM + const builtinExtensionsElement = document.getElementById('vscode-workbench-builtin-extensions'); + const builtinExtensionsElementAttribute = builtinExtensionsElement ? builtinExtensionsElement.getAttribute('data-settings') : undefined; + if (builtinExtensionsElementAttribute) { + try { + scannedBuiltinExtensions = JSON.parse(builtinExtensionsElementAttribute); + } catch (error) { /* ignore error*/ } + } + } + + this.builtinExtensions = scannedBuiltinExtensions.map(e => ({ + identifier: { id: getGalleryExtensionId(e.packageJSON.publisher, e.packageJSON.name) }, + location: uriIdentityService.extUri.joinPath(builtinExtensionsServiceUrl!, e.extensionPath), + type: ExtensionType.System, + packageJSON: e.packageJSON, + packageNLSUrl: e.packageNLSPath ? uriIdentityService.extUri.joinPath(builtinExtensionsServiceUrl!, e.packageNLSPath) : undefined, + readmeUrl: e.readmePath ? uriIdentityService.extUri.joinPath(builtinExtensionsServiceUrl!, e.readmePath) : undefined, + changelogUrl: e.changelogPath ? uriIdentityService.extUri.joinPath(builtinExtensionsServiceUrl!, e.changelogPath) : undefined, + })); + } + } + + async scanBuiltinExtensions(): Promise { + if (isWeb) { + return this.builtinExtensions; + } + throw new Error('not supported'); + } +} + +registerSingleton(IBuiltinExtensionsScannerService, BuiltinExtensionsScannerService); diff --git a/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts index a988443aa93..c28b1477400 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts @@ -18,6 +18,7 @@ import { getExtensionKind } from 'vs/workbench/services/extensions/common/extens import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IProductService } from 'vs/platform/product/common/productService'; import { StorageManager } from 'vs/platform/extensionManagement/common/extensionEnablementService'; +import { webWorkerExtHostConfig } from 'vs/workbench/services/extensions/common/extensions'; const SOURCE = 'IWorkbenchExtensionEnablementService'; @@ -137,8 +138,8 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench } private _isDisabledByExtensionKind(extension: IExtension): boolean { - if (this.extensionManagementServerService.remoteExtensionManagementServer) { - const server = this.extensionManagementServerService.getExtensionManagementServer(extension.location); + if (this.extensionManagementServerService.remoteExtensionManagementServer || this.extensionManagementServerService.webExtensionManagementServer) { + const server = this.extensionManagementServerService.getExtensionManagementServer(extension); for (const extensionKind of getExtensionKind(extension.manifest, this.productService, this.configurationService)) { if (extensionKind === 'ui') { if (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.localExtensionManagementServer === server) { @@ -151,8 +152,13 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench } } if (extensionKind === 'web') { - // Web extensions are not yet supported to be disabled by kind. Enable them always on web. + const enableLocalWebWorker = this.configurationService.getValue(webWorkerExtHostConfig); + if (enableLocalWebWorker) { + // Web extensions are enabled on all configurations + return false; + } if (this.extensionManagementServerService.localExtensionManagementServer === null) { + // Web extensions run only in the web return false; } } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts index 5be6facb9cc..8adc6b0fb3b 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts @@ -6,24 +6,25 @@ import { Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; -import { IExtension } from 'vs/platform/extensions/common/extensions'; -import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IExtension, IScannedExtension, ExtensionType } from 'vs/platform/extensions/common/extensions'; +import { IExtensionManagementService, IGalleryExtension, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkspace, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IStringDictionary } from 'vs/base/common/collections'; export const IExtensionManagementServerService = createDecorator('extensionManagementServerService'); export interface IExtensionManagementServer { - extensionManagementService: IExtensionManagementService; - authority: string; + id: string; label: string; + extensionManagementService: IExtensionManagementService; } export interface IExtensionManagementServerService { readonly _serviceBrand: undefined; readonly localExtensionManagementServer: IExtensionManagementServer | null; readonly remoteExtensionManagementServer: IExtensionManagementServer | null; - getExtensionManagementServer(location: URI): IExtensionManagementServer | null; + readonly webExtensionManagementServer: IExtensionManagementServer | null; + getExtensionManagementServer(extension: IExtension): IExtensionManagementServer | null; } export const enum EnablementState { @@ -136,3 +137,11 @@ export interface IExtensionRecommendationsService { getIgnoredRecommendations(): ReadonlyArray; onRecommendationChange: Event; } + +export const IWebExtensionsScannerService = createDecorator('IWebExtensionsScannerService'); +export interface IWebExtensionsScannerService { + readonly _serviceBrand: undefined; + scanExtensions(type?: ExtensionType): Promise; + addExtension(galleryExtension: IGalleryExtension): Promise; + removeExtension(identifier: IExtensionIdentifier, version?: string): Promise; +} diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts index 33d26d231c6..388d6996081 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import { URI } from 'vs/base/common/uri'; import { IExtensionManagementServer, IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -12,6 +11,10 @@ import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILabelService } from 'vs/platform/label/common/label'; +import { isWeb } from 'vs/base/common/platform'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { WebExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/webExtensionManagementService'; +import { IExtension } from 'vs/platform/extensions/common/extensions'; export class ExtensionManagementServerService implements IExtensionManagementServerService { @@ -19,27 +22,40 @@ export class ExtensionManagementServerService implements IExtensionManagementSer readonly localExtensionManagementServer: IExtensionManagementServer | null = null; readonly remoteExtensionManagementServer: IExtensionManagementServer | null = null; + readonly webExtensionManagementServer: IExtensionManagementServer | null = null; constructor( @IRemoteAgentService remoteAgentService: IRemoteAgentService, @ILabelService labelService: ILabelService, + @IInstantiationService instantiationService: IInstantiationService, ) { const remoteAgentConnection = remoteAgentService.getConnection(); if (remoteAgentConnection) { const extensionManagementService = new ExtensionManagementChannelClient(remoteAgentConnection!.getChannel('extensions')); this.remoteExtensionManagementServer = { - authority: remoteAgentConnection.remoteAuthority, + id: 'remote', extensionManagementService, get label() { return labelService.getHostLabel(REMOTE_HOST_SCHEME, remoteAgentConnection!.remoteAuthority) || localize('remote', "Remote"); } }; } + if (isWeb) { + const extensionManagementService = instantiationService.createInstance(WebExtensionManagementService); + this.webExtensionManagementServer = { + id: 'web', + extensionManagementService, + label: localize('web', "Web") + }; + } } - getExtensionManagementServer(location: URI): IExtensionManagementServer | null { - if (location.scheme === REMOTE_HOST_SCHEME) { - return this.remoteExtensionManagementServer; + getExtensionManagementServer(extension: IExtension): IExtensionManagementServer { + if (extension.location.scheme === REMOTE_HOST_SCHEME) { + return this.remoteExtensionManagementServer!; } - return null; + if (this.webExtensionManagementServer) { + return this.webExtensionManagementServer; + } + throw new Error(`Invalid Extension ${extension.location}`); } } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index 547e3985ae3..5a79d9e39a5 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -15,7 +15,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { CancellationToken } from 'vs/base/common/cancellation'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { localize } from 'vs/nls'; -import { prefersExecuteOnUI, canExecuteOnWorkspace } from 'vs/workbench/services/extensions/common/extensionsUtil'; +import { prefersExecuteOnUI, canExecuteOnWorkspace, prefersExecuteOnWorkspace, canExecuteOnUI, prefersExecuteOnWeb, canExecuteOnWeb } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { IProductService } from 'vs/platform/product/common/productService'; import { Schemas } from 'vs/base/common/network'; import { IDownloadService } from 'vs/platform/download/common/download'; @@ -45,6 +45,9 @@ export class ExtensionManagementService extends Disposable implements IExtension if (this.extensionManagementServerService.remoteExtensionManagementServer) { this.servers.push(this.extensionManagementServerService.remoteExtensionManagementServer); } + if (this.extensionManagementServerService.webExtensionManagementServer) { + this.servers.push(this.extensionManagementServerService.webExtensionManagementServer); + } this.onInstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer, server) => { emitter.add(server.extensionManagementService.onInstallExtension); return emitter; }, new EventMultiplexer())).event; this.onDidInstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer, server) => { emitter.add(server.extensionManagementService.onDidInstallExtension); return emitter; }, new EventMultiplexer())).event; @@ -64,7 +67,7 @@ export class ExtensionManagementService extends Disposable implements IExtension if (!server) { return Promise.reject(`Invalid location ${extension.location.toString()}`); } - if (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer) { + if (this.servers.length > 1) { if (isLanguagePackExtension(extension.manifest)) { return this.uninstallEverywhere(extension); } @@ -79,12 +82,14 @@ export class ExtensionManagementService extends Disposable implements IExtension return Promise.reject(`Invalid location ${extension.location.toString()}`); } const promise = server.extensionManagementService.uninstall(extension); - const anotherServer: IExtensionManagementServer | null = server === this.extensionManagementServerService.localExtensionManagementServer ? this.extensionManagementServerService.remoteExtensionManagementServer! : this.extensionManagementServerService.localExtensionManagementServer; - if (anotherServer) { - const installed = await anotherServer.extensionManagementService.getInstalled(ExtensionType.User); - extension = installed.filter(i => areSameExtensions(i.identifier, extension.identifier))[0]; - if (extension) { - await anotherServer.extensionManagementService.uninstall(extension); + const otherServers: IExtensionManagementServer[] = this.servers.filter(s => s !== server); + if (otherServers.length) { + for (const otherServer of otherServers) { + const installed = await otherServer.extensionManagementService.getInstalled(ExtensionType.User); + extension = installed.filter(i => areSameExtensions(i.identifier, extension.identifier))[0]; + if (extension) { + await otherServer.extensionManagementService.uninstall(extension); + } } } return promise; @@ -141,7 +146,10 @@ export class ExtensionManagementService extends Disposable implements IExtension } unzip(zipLocation: URI): Promise { - return Promise.all(this.servers.map(({ extensionManagementService }) => extensionManagementService.unzip(zipLocation))).then(([extensionIdentifier]) => extensionIdentifier); + return Promise.all(this.servers + // Filter out web server + .filter(server => server !== this.extensionManagementServerService.webExtensionManagementServer) + .map(({ extensionManagementService }) => extensionManagementService.unzip(zipLocation))).then(([extensionIdentifier]) => extensionIdentifier); } async install(vsix: URI): Promise { @@ -149,7 +157,7 @@ export class ExtensionManagementService extends Disposable implements IExtension const manifest = await this.getManifest(vsix); if (isLanguagePackExtension(manifest)) { // Install on both servers - const [local] = await Promise.all(this.servers.map(server => this.installVSIX(vsix, server))); + const [local] = await Promise.all([this.extensionManagementServerService.localExtensionManagementServer, this.extensionManagementServerService.remoteExtensionManagementServer].map(server => this.installVSIX(vsix, server))); return local; } if (prefersExecuteOnUI(manifest, this.productService, this.configurationService)) { @@ -183,39 +191,61 @@ export class ExtensionManagementService extends Disposable implements IExtension } async installFromGallery(gallery: IGalleryExtension): Promise { - if (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer) { - const manifest = await this.extensionGalleryService.getManifest(gallery, CancellationToken.None); - if (manifest) { - if (isLanguagePackExtension(manifest)) { - // Install on both servers - return Promise.all(this.servers.map(server => server.extensionManagementService.installFromGallery(gallery))).then(([local]) => local); - } - if (prefersExecuteOnUI(manifest, this.productService, this.configurationService)) { - // Install only on local server - return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); - } - // Install only on remote server - return this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.installFromGallery(gallery); - } else { - return Promise.reject(localize('Manifest is not found', "Installing Extension {0} failed: Manifest is not found.", gallery.displayName || gallery.name)); - } - } - if (this.extensionManagementServerService.localExtensionManagementServer) { + + // Only local server, install without any checks + if (this.servers.length === 1 && this.extensionManagementServerService.localExtensionManagementServer) { return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); } - if (this.extensionManagementServerService.remoteExtensionManagementServer) { - const manifest = await this.extensionGalleryService.getManifest(gallery, CancellationToken.None); - if (!manifest) { - return Promise.reject(localize('Manifest is not found', "Installing Extension {0} failed: Manifest is not found.", gallery.displayName || gallery.name)); - } - if (!isLanguagePackExtension(manifest) && !canExecuteOnWorkspace(manifest, this.productService, this.configurationService)) { - const error = new Error(localize('cannot be installed', "Cannot install '{0}' because this extension has defined that it cannot run on the remote server.", gallery.displayName || gallery.name)); - error.name = INSTALL_ERROR_NOT_SUPPORTED; - return Promise.reject(error); - } + + const manifest = await this.extensionGalleryService.getManifest(gallery, CancellationToken.None); + if (!manifest) { + return Promise.reject(localize('Manifest is not found', "Installing Extension {0} failed: Manifest is not found.", gallery.displayName || gallery.name)); + } + + // Install Language pack on all servers + if (isLanguagePackExtension(manifest)) { + return Promise.all(this.servers.map(server => server.extensionManagementService.installFromGallery(gallery))).then(([local]) => local); + } + + // 1. Install on preferred location + + // Install UI preferred extension on local server + if (prefersExecuteOnUI(manifest, this.productService, this.configurationService) && this.extensionManagementServerService.localExtensionManagementServer) { + return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); + } + // Install Workspace preferred extension on remote server + if (prefersExecuteOnWorkspace(manifest, this.productService, this.configurationService) && this.extensionManagementServerService.remoteExtensionManagementServer) { return this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.installFromGallery(gallery); } - return Promise.reject('No Servers to Install'); + // Install Web preferred extension on web server + if (prefersExecuteOnWeb(manifest, this.productService, this.configurationService) && this.extensionManagementServerService.webExtensionManagementServer) { + return this.extensionManagementServerService.webExtensionManagementServer.extensionManagementService.installFromGallery(gallery); + } + + // 2. Install on supported location + + // Install UI supported extension on local server + if (canExecuteOnUI(manifest, this.productService, this.configurationService) && this.extensionManagementServerService.localExtensionManagementServer) { + return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); + } + // Install Workspace supported extension on remote server + if (canExecuteOnWorkspace(manifest, this.productService, this.configurationService) && this.extensionManagementServerService.remoteExtensionManagementServer) { + return this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.installFromGallery(gallery); + } + // Install Web supported extension on web server + if (canExecuteOnWeb(manifest, this.productService, this.configurationService) && this.extensionManagementServerService.webExtensionManagementServer) { + return this.extensionManagementServerService.webExtensionManagementServer.extensionManagementService.installFromGallery(gallery); + } + + if (this.extensionManagementServerService.remoteExtensionManagementServer) { + const error = new Error(localize('cannot be installed', "Cannot install '{0}' because this extension has defined that it cannot run on the remote server.", gallery.displayName || gallery.name)); + error.name = INSTALL_ERROR_NOT_SUPPORTED; + return Promise.reject(error); + } + + const error = new Error(localize('cannot be installed on web', "Cannot install '{0}' because this extension has defined that it cannot run on the web server.", gallery.displayName || gallery.name)); + error.name = INSTALL_ERROR_NOT_SUPPORTED; + return Promise.reject(error); } getExtensionsReport(): Promise { @@ -229,6 +259,6 @@ export class ExtensionManagementService extends Disposable implements IExtension } private getServer(extension: ILocalExtension): IExtensionManagementServer | null { - return this.extensionManagementServerService.getExtensionManagementServer(extension.location); + return this.extensionManagementServerService.getExtensionManagementServer(extension); } } diff --git a/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts new file mode 100644 index 00000000000..132e3d4e018 --- /dev/null +++ b/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts @@ -0,0 +1,117 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ExtensionType, IExtensionIdentifier, IExtensionManifest, IScannedExtension } from 'vs/platform/extensions/common/extensions'; +import { IExtensionManagementService, ILocalExtension, InstallExtensionEvent, DidInstallExtensionEvent, DidUninstallExtensionEvent, IGalleryExtension, IReportedExtension, IGalleryMetadata, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { Event, Emitter } from 'vs/base/common/event'; +import { URI } from 'vs/base/common/uri'; +import { IRequestService, isSuccess, asText } from 'vs/platform/request/common/request'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { localizeManifest } from 'vs/platform/extensionManagement/common/extensionNls'; +import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { IWebExtensionsScannerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { ILogService } from 'vs/platform/log/common/log'; +import { Disposable } from 'vs/base/common/lifecycle'; + +export class WebExtensionManagementService extends Disposable implements IExtensionManagementService { + + declare readonly _serviceBrand: undefined; + + private readonly _onInstallExtension = this._register(new Emitter()); + readonly onInstallExtension: Event = this._onInstallExtension.event; + + private readonly _onDidInstallExtension = this._register(new Emitter()); + readonly onDidInstallExtension: Event = this._onDidInstallExtension.event; + + private readonly _onUninstallExtension = this._register(new Emitter()); + readonly onUninstallExtension: Event = this._onUninstallExtension.event; + + private _onDidUninstallExtension = this._register(new Emitter()); + onDidUninstallExtension: Event = this._onDidUninstallExtension.event; + + constructor( + @IWebExtensionsScannerService private readonly webExtensionsScannerService: IWebExtensionsScannerService, + @IRequestService private readonly requestService: IRequestService, + @ILogService private readonly logService: ILogService, + ) { + super(); + } + + async getInstalled(type?: ExtensionType): Promise { + const extensions = await this.webExtensionsScannerService.scanExtensions(type); + return Promise.all(extensions.map(e => this.toLocalExtension(e))); + } + + async installFromGallery(gallery: IGalleryExtension): Promise { + this.logService.info('Installing extension:', gallery.identifier.id); + this._onInstallExtension.fire({ identifier: gallery.identifier, gallery }); + try { + const existingExtension = await this.getUserExtension(gallery.identifier); + if (existingExtension && existingExtension.manifest.version !== gallery.version) { + await this.webExtensionsScannerService.removeExtension(existingExtension.identifier, existingExtension.manifest.version); + } + const scannedExtension = await this.webExtensionsScannerService.addExtension(gallery); + const local = await this.toLocalExtension(scannedExtension); + this._onDidInstallExtension.fire({ local, identifier: gallery.identifier, operation: InstallOperation.Install, gallery }); + return local; + } catch (error) { + this._onDidInstallExtension.fire({ error, identifier: gallery.identifier, operation: InstallOperation.Install, gallery }); + throw error; + } + } + + async uninstall(extension: ILocalExtension): Promise { + this._onUninstallExtension.fire(extension.identifier); + try { + await this.webExtensionsScannerService.removeExtension(extension.identifier); + this._onDidUninstallExtension.fire({ identifier: extension.identifier }); + } catch (error) { + this.logService.error(error); + this._onDidUninstallExtension.fire({ error, identifier: extension.identifier }); + throw error; + } + } + + async updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise { + return local; + } + + private async getUserExtension(identifier: IExtensionIdentifier): Promise { + const userExtensions = await this.getInstalled(ExtensionType.User); + return userExtensions.find(e => areSameExtensions(e.identifier, identifier)); + } + + private async toLocalExtension(scannedExtension: IScannedExtension): Promise { + let manifest = scannedExtension.packageJSON; + if (scannedExtension.packageNLSUrl) { + try { + const context = await this.requestService.request({ type: 'GET', url: scannedExtension.packageNLSUrl.toString() }, CancellationToken.None); + if (isSuccess(context)) { + const content = await asText(context); + if (content) { + manifest = localizeManifest(manifest, JSON.parse(content)); + } + } + } catch (error) { /* ignore */ } + } + return { + type: scannedExtension.type, + identifier: scannedExtension.identifier, + manifest, + location: scannedExtension.location, + isMachineScoped: false, + publisherId: null, + publisherDisplayName: null + }; + } + + zip(extension: ILocalExtension): Promise { throw new Error('unsupported'); } + unzip(zipLocation: URI): Promise { throw new Error('unsupported'); } + getManifest(vsix: URI): Promise { throw new Error('unsupported'); } + install(vsix: URI, isMachineScoped?: boolean): Promise { throw new Error('unsupported'); } + reinstallFromGallery(extension: ILocalExtension): Promise { throw new Error('unsupported'); } + getExtensionsReport(): Promise { throw new Error('unsupported'); } + +} diff --git a/src/vs/workbench/services/extensionManagement/common/webExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/common/webExtensionsScannerService.ts new file mode 100644 index 00000000000..7f57ba250af --- /dev/null +++ b/src/vs/workbench/services/extensionManagement/common/webExtensionsScannerService.ts @@ -0,0 +1,193 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as semver from 'semver-umd'; +import { IBuiltinExtensionsScannerService, IScannedExtension, ExtensionType, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IWebExtensionsScannerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { isWeb } from 'vs/base/common/platform'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { joinPath } from 'vs/base/common/resources'; +import { URI, UriComponents } from 'vs/base/common/uri'; +import { IFileService } from 'vs/platform/files/common/files'; +import { Queue } from 'vs/base/common/async'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { asText, isSuccess, IRequestService } from 'vs/platform/request/common/request'; +import { ILogService } from 'vs/platform/log/common/log'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { groupByExtension, areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; + +interface IUserExtension { + identifier: IExtensionIdentifier; + version: string; + uri: URI; + readmeUri?: URI; + changelogUri?: URI; + packageNLSUri?: URI; +} + +interface IStoredUserExtension { + identifier: IExtensionIdentifier; + version: string; + uri: UriComponents; + readmeUri?: UriComponents; + changelogUri?: UriComponents; + packageNLSUri?: UriComponents; +} + +const AssetTypeWebResource = 'Microsoft.VisualStudio.Code.WebResources'; + +function getExtensionLocation(assetUri: URI): URI { return joinPath(assetUri, AssetTypeWebResource, 'extension'); } + +export class WebExtensionsScannerService implements IWebExtensionsScannerService { + + declare readonly _serviceBrand: undefined; + + private readonly systemExtensionsPromise: Promise; + private readonly staticExtensions: IScannedExtension[]; + private readonly extensionsResource: URI; + private readonly userExtensionsResourceLimiter: Queue; + + constructor( + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IBuiltinExtensionsScannerService private readonly builtinExtensionsScannerService: IBuiltinExtensionsScannerService, + @IFileService private readonly fileService: IFileService, + @IRequestService private readonly requestService: IRequestService, + @ILogService private readonly logService: ILogService, + ) { + this.extensionsResource = joinPath(environmentService.userRoamingDataHome, 'extensions.json'); + this.userExtensionsResourceLimiter = new Queue(); + this.systemExtensionsPromise = isWeb ? this.builtinExtensionsScannerService.scanBuiltinExtensions() : Promise.resolve([]); + const staticExtensions = environmentService.options && Array.isArray(environmentService.options.staticExtensions) ? environmentService.options.staticExtensions : []; + this.staticExtensions = staticExtensions.map(data => { + location: data.extensionLocation, + type: ExtensionType.User, + packageJSON: data.packageJSON, + }); + } + + async scanExtensions(type?: ExtensionType): Promise { + const extensions = []; + if (type === undefined || type === ExtensionType.System) { + const systemExtensions = await this.systemExtensionsPromise; + extensions.push(...systemExtensions); + } + if (type === undefined || type === ExtensionType.User) { + extensions.push(...this.staticExtensions); + const userExtensions = await this.scanUserExtensions(); + extensions.push(...userExtensions); + } + return extensions; + } + + async addExtension(galleryExtension: IGalleryExtension): Promise { + if (!galleryExtension.assetTypes.some(type => type.startsWith(AssetTypeWebResource))) { + throw new Error(`Missing ${AssetTypeWebResource} asset type`); + } + + const packageNLSUri = joinPath(getExtensionLocation(galleryExtension.assetUri), 'package.nls.json'); + const context = await this.requestService.request({ type: 'GET', url: packageNLSUri.toString() }, CancellationToken.None); + const packageNLSExists = isSuccess(context); + + const userExtensions = await this.readUserExtensions(); + const userExtension: IUserExtension = { + identifier: galleryExtension.identifier, + version: galleryExtension.version, + uri: galleryExtension.assetUri, + readmeUri: galleryExtension.assets.readme ? URI.parse(galleryExtension.assets.readme.uri) : undefined, + changelogUri: galleryExtension.assets.changelog ? URI.parse(galleryExtension.assets.changelog.uri) : undefined, + packageNLSUri: packageNLSExists ? packageNLSUri : undefined + }; + userExtensions.push(userExtension); + await this.writeUserExtensions(userExtensions); + + const scannedExtension = await this.toScannedExtension(userExtension); + if (scannedExtension) { + return scannedExtension; + } + throw new Error('Error while scanning extension'); + } + + async removeExtension(identifier: IExtensionIdentifier, version?: string): Promise { + let userExtensions = await this.readUserExtensions(); + userExtensions = userExtensions.filter(extension => !(areSameExtensions(extension.identifier, identifier) && version ? extension.version === version : true)); + await this.writeUserExtensions(userExtensions); + } + + private async scanUserExtensions(): Promise { + let userExtensions = await this.readUserExtensions(); + const byExtension: IUserExtension[][] = groupByExtension(userExtensions, e => e.identifier); + userExtensions = byExtension.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version))[0]); + const scannedExtensions: IScannedExtension[] = []; + await Promise.all(userExtensions.map(async userExtension => { + try { + const scannedExtension = await this.toScannedExtension(userExtension); + if (scannedExtension) { + scannedExtensions.push(scannedExtension); + } + } catch (error) { + this.logService.error(error, 'Error while scanning user extension', userExtension.identifier.id); + } + })); + return scannedExtensions; + } + + private async toScannedExtension(userExtension: IUserExtension): Promise { + const context = await this.requestService.request({ type: 'GET', url: joinPath(userExtension.uri, 'Microsoft.VisualStudio.Code.Manifest').toString() }, CancellationToken.None); + if (isSuccess(context)) { + const content = await asText(context); + if (content) { + const packageJSON = JSON.parse(content); + return { + identifier: userExtension.identifier, + location: getExtensionLocation(userExtension.uri), + packageJSON, + type: ExtensionType.User, + readmeUrl: userExtension.readmeUri, + changelogUrl: userExtension.changelogUri, + packageNLSUrl: userExtension.packageNLSUri, + }; + } + } + return null; + } + + private readUserExtensions(): Promise { + return this.userExtensionsResourceLimiter.queue(async () => { + try { + const content = await this.fileService.readFile(this.extensionsResource); + const storedUserExtensions: IStoredUserExtension[] = JSON.parse(content.value.toString()); + return storedUserExtensions.map(e => ({ + identifier: e.identifier, + version: e.version, + uri: URI.revive(e.uri), + readmeUri: URI.revive(e.readmeUri), + changelogUri: URI.revive(e.changelogUri), + packageNLSUri: URI.revive(e.packageNLSUri), + })); + } catch (error) { /* Ignore */ } + return []; + }); + } + + private writeUserExtensions(userExtensions: IUserExtension[]): Promise { + return this.userExtensionsResourceLimiter.queue(async () => { + const storedUserExtensions: IStoredUserExtension[] = userExtensions.map(e => ({ + identifier: e.identifier, + version: e.version, + uri: e.uri.toJSON(), + readmeUri: e.readmeUri?.toJSON(), + changelogUri: e.changelogUri?.toJSON(), + packageNLSUri: e.packageNLSUri?.toJSON(), + })); + await this.fileService.writeFile(this.extensionsResource, VSBuffer.fromString(JSON.stringify(storedUserExtensions))); + return userExtensions; + }); + } + +} + +registerSingleton(IWebExtensionsScannerService, WebExtensionsScannerService); diff --git a/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService.ts b/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService.ts index 6b68a6f79c3..0ac506857c7 100644 --- a/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService.ts @@ -5,7 +5,6 @@ import { localize } from 'vs/nls'; import { Schemas } from 'vs/base/common/network'; -import { URI } from 'vs/base/common/uri'; import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionManagementServer, IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; @@ -19,19 +18,16 @@ import { RemoteExtensionManagementChannelClient } from 'vs/workbench/services/ex import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IProductService } from 'vs/platform/product/common/productService'; import { ILabelService } from 'vs/platform/label/common/label'; - -const localExtensionManagementServerAuthority: string = 'vscode-local'; +import { IExtension } from 'vs/platform/extensions/common/extensions'; export class ExtensionManagementServerService implements IExtensionManagementServerService { declare readonly _serviceBrand: undefined; private readonly _localExtensionManagementServer: IExtensionManagementServer; - public get localExtensionManagementServer(): IExtensionManagementServer { - return this._localExtensionManagementServer; - } + public get localExtensionManagementServer(): IExtensionManagementServer { return this._localExtensionManagementServer; } readonly remoteExtensionManagementServer: IExtensionManagementServer | null = null; - readonly isSingleServer: boolean = false; + readonly webExtensionManagementServer: IExtensionManagementServer | null = null; constructor( @ISharedProcessService sharedProcessService: ISharedProcessService, @@ -44,26 +40,26 @@ export class ExtensionManagementServerService implements IExtensionManagementSer ) { const localExtensionManagementService = new ExtensionManagementChannelClient(sharedProcessService.getChannel('extensions')); - this._localExtensionManagementServer = { extensionManagementService: localExtensionManagementService, authority: localExtensionManagementServerAuthority, label: localize('local', "Local") }; + this._localExtensionManagementServer = { extensionManagementService: localExtensionManagementService, id: 'local', label: localize('local', "Local") }; const remoteAgentConnection = remoteAgentService.getConnection(); if (remoteAgentConnection) { const extensionManagementService = new RemoteExtensionManagementChannelClient(remoteAgentConnection.getChannel('extensions'), this.localExtensionManagementServer.extensionManagementService, galleryService, logService, configurationService, productService); this.remoteExtensionManagementServer = { - authority: remoteAgentConnection.remoteAuthority, + id: 'remote', extensionManagementService, get label() { return labelService.getHostLabel(REMOTE_HOST_SCHEME, remoteAgentConnection!.remoteAuthority) || localize('remote', "Remote"); } }; } } - getExtensionManagementServer(location: URI): IExtensionManagementServer | null { - if (location.scheme === Schemas.file) { + getExtensionManagementServer(extension: IExtension): IExtensionManagementServer { + if (extension.location.scheme === Schemas.file) { return this.localExtensionManagementServer; } - if (location.scheme === REMOTE_HOST_SCHEME) { + if (this.remoteExtensionManagementServer && extension.location.scheme === REMOTE_HOST_SCHEME) { return this.remoteExtensionManagementServer; } - return null; + throw new Error(`Invalid Extension ${extension.location}`); } } diff --git a/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts b/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts index 66bdd7eefae..4b26efed3eb 100644 --- a/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts +++ b/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts @@ -461,7 +461,7 @@ suite('ExtensionEnablementService Test', () => { }); test('test remote ui extension is disabled by kind when there is no local server', async () => { - instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService))); + instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), null)); const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) }); testObject = new TestExtensionEnablementService(instantiationService); assert.ok(!testObject.isEnabled(localWorkspaceExtension)); @@ -499,7 +499,7 @@ suite('ExtensionEnablementService Test', () => { }); test('test web extension on remote server is not disabled by kind when there is no local server', async () => { - instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService))); + instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService))); const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['web'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) }); testObject = new TestExtensionEnablementService(instantiationService); assert.ok(testObject.isEnabled(localWorkspaceExtension)); @@ -507,7 +507,7 @@ suite('ExtensionEnablementService Test', () => { }); test('test web extension with no server is not disabled by kind when there is no local server', async () => { - instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService))); + instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService))); const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['web'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.https }) }); testObject = new TestExtensionEnablementService(instantiationService); assert.ok(testObject.isEnabled(localWorkspaceExtension)); @@ -515,7 +515,7 @@ suite('ExtensionEnablementService Test', () => { }); test('test web extension with no server is not disabled by kind when there is no local and remote server', async () => { - instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, null)); + instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, null, anExtensionManagementServer('web', instantiationService))); const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: ['web'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.https }) }); testObject = new TestExtensionEnablementService(instantiationService); assert.ok(testObject.isEnabled(localWorkspaceExtension)); @@ -526,7 +526,7 @@ suite('ExtensionEnablementService Test', () => { function anExtensionManagementServer(authority: string, instantiationService: TestInstantiationService): IExtensionManagementServer { return { - authority, + id: authority, label: authority, extensionManagementService: instantiationService.get(IExtensionManagementService) }; @@ -535,22 +535,23 @@ function anExtensionManagementServer(authority: string, instantiationService: Te function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService): IExtensionManagementServerService { const localExtensionManagementServer = anExtensionManagementServer('vscode-local', instantiationService); const remoteExtensionManagementServer = anExtensionManagementServer('vscode-remote', instantiationService); - return anExtensionManagementServerService(localExtensionManagementServer, remoteExtensionManagementServer); + return anExtensionManagementServerService(localExtensionManagementServer, remoteExtensionManagementServer, null); } -function anExtensionManagementServerService(localExtensionManagementServer: IExtensionManagementServer | null, remoteExtensionManagementServer: IExtensionManagementServer | null): IExtensionManagementServerService { +function anExtensionManagementServerService(localExtensionManagementServer: IExtensionManagementServer | null, remoteExtensionManagementServer: IExtensionManagementServer | null, webExtensionManagementServer: IExtensionManagementServer | null): IExtensionManagementServerService { return { _serviceBrand: undefined, localExtensionManagementServer, remoteExtensionManagementServer, - getExtensionManagementServer: (location: URI) => { - if (location.scheme === Schemas.file) { + webExtensionManagementServer: null, + getExtensionManagementServer: (extension: IExtension) => { + if (extension.location.scheme === Schemas.file) { return localExtensionManagementServer; } - if (location.scheme === REMOTE_HOST_SCHEME) { + if (extension.location.scheme === REMOTE_HOST_SCHEME) { return remoteExtensionManagementServer; } - return null; + return webExtensionManagementServer; } }; } diff --git a/src/vs/workbench/services/extensions/browser/extensionService.ts b/src/vs/workbench/services/extensions/browser/extensionService.ts index a0d121f7efb..afcf8322e31 100644 --- a/src/vs/workbench/services/extensions/browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/browser/extensionService.ts @@ -5,35 +5,31 @@ import * as nls from 'vs/nls'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { IWorkbenchExtensionEnablementService, IWebExtensionsScannerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionService, IExtensionHost } from 'vs/workbench/services/extensions/common/extensions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { IProductService } from 'vs/platform/product/common/productService'; -import { AbstractExtensionService } from 'vs/workbench/services/extensions/common/abstractExtensionService'; -import { ExtensionHostProcessManager } from 'vs/workbench/services/extensions/common/extensionHostProcessManager'; -import { RemoteExtensionHostClient, IInitDataProvider } from 'vs/workbench/services/extensions/common/remoteExtensionHostClient'; -import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; +import { AbstractExtensionService, parseScannedExtension } from 'vs/workbench/services/extensions/common/abstractExtensionService'; +import { RemoteExtensionHost, IRemoteExtensionHostDataProvider, IRemoteExtensionHostInitData } from 'vs/workbench/services/extensions/common/remoteExtensionHost'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { WebWorkerExtensionHostStarter } from 'vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter'; -import { URI } from 'vs/base/common/uri'; +import { WebWorkerExtensionHost } from 'vs/workbench/services/extensions/browser/webWorkerExtensionHost'; import { canExecuteOnWeb } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { FetchFileSystemProvider } from 'vs/workbench/services/extensions/browser/webWorkerFileSystemProvider'; import { Schemas } from 'vs/base/common/network'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { IStaticExtensionsService } from 'vs/workbench/services/extensions/common/staticExtensions'; import { DeltaExtensionsResult } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; export class ExtensionService extends AbstractExtensionService implements IExtensionService { private _disposables = new DisposableStore(); - private _remoteExtensionsEnvironmentData: IRemoteAgentEnvironment | null = null; + private _remoteInitData: IRemoteExtensionHostInitData | null = null; constructor( @IInstantiationService instantiationService: IInstantiationService, @@ -46,7 +42,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService, @IRemoteAgentService private readonly _remoteAgentService: IRemoteAgentService, @IConfigurationService private readonly _configService: IConfigurationService, - @IStaticExtensionsService private readonly _staticExtensions: IStaticExtensionsService, + @IWebExtensionsScannerService private readonly _webExtensionsScannerService: IWebExtensionsScannerService, ) { super( instantiationService, @@ -73,32 +69,39 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._disposables.add(this._fileService.registerProvider(Schemas.https, provider)); } - private _createProvider(remoteAuthority: string): IInitDataProvider { + private _createLocalExtensionHostDataProvider() { return { - remoteAuthority: remoteAuthority, getInitData: async () => { - await this.whenInstalledExtensionsRegistered(); - const connectionData = this._remoteAuthorityResolverService.getConnectionData(remoteAuthority); - const remoteEnvironment = this._remoteExtensionsEnvironmentData!; - return { connectionData, remoteEnvironment }; + const allExtensions = await this.getExtensions(); + const webExtensions = allExtensions.filter(ext => canExecuteOnWeb(ext, this._productService, this._configService)); + return { + autoStart: true, + extensions: webExtensions + }; } }; } - protected _createExtensionHosts(_isInitialStart: boolean, initialActivationEvents: string[]): ExtensionHostProcessManager[] { - const result: ExtensionHostProcessManager[] = []; + private _createRemoteExtensionHostDataProvider(remoteAuthority: string): IRemoteExtensionHostDataProvider { + return { + remoteAuthority: remoteAuthority, + getInitData: async () => { + await this.whenInstalledExtensionsRegistered(); + return this._remoteInitData!; + } + }; + } - const webExtensions = this.getExtensions().then(extensions => extensions.filter(ext => canExecuteOnWeb(ext, this._productService, this._configService))); - const webHostProcessWorker = this._instantiationService.createInstance(WebWorkerExtensionHostStarter, true, webExtensions, URI.file(this._environmentService.logsPath).with({ scheme: this._environmentService.logFile.scheme })); - const webHostProcessManager = this._instantiationService.createInstance(ExtensionHostProcessManager, false, webHostProcessWorker, null, initialActivationEvents); - result.push(webHostProcessManager); + protected _createExtensionHosts(_isInitialStart: boolean): IExtensionHost[] { + const result: IExtensionHost[] = []; + + const webWorkerExtHost = this._instantiationService.createInstance(WebWorkerExtensionHost, this._createLocalExtensionHostDataProvider()); + result.push(webWorkerExtHost); const remoteAgentConnection = this._remoteAgentService.getConnection(); if (remoteAgentConnection) { - const remoteExtensions = this.getExtensions().then(extensions => extensions.filter(ext => !canExecuteOnWeb(ext, this._productService, this._configService))); - const remoteExtHostProcessWorker = this._instantiationService.createInstance(RemoteExtensionHostClient, remoteExtensions, this._createProvider(remoteAgentConnection.remoteAuthority), this._remoteAgentService.socketFactory); - const remoteExtHostProcessManager = this._instantiationService.createInstance(ExtensionHostProcessManager, false, remoteExtHostProcessWorker, remoteAgentConnection.remoteAuthority, initialActivationEvents); - result.push(remoteExtHostProcessManager); + const remoteExtHost = this._instantiationService.createInstance(RemoteExtensionHost, this._createRemoteExtensionHostDataProvider(remoteAgentConnection.remoteAuthority), this._remoteAgentService.socketFactory); + result.push(remoteExtHost); } return result; @@ -108,16 +111,18 @@ export class ExtensionService extends AbstractExtensionService implements IExten // fetch the remote environment let [remoteEnv, localExtensions] = await Promise.all([ this._remoteAgentService.getEnvironment(), - this._staticExtensions.getExtensions() + this._webExtensionsScannerService.scanExtensions().then(extensions => extensions.map(parseScannedExtension)) ]); + const remoteAgentConnection = this._remoteAgentService.getConnection(); + let result: DeltaExtensionsResult; // local: only enabled and web'ish extension localExtensions = localExtensions!.filter(ext => this._isEnabled(ext) && canExecuteOnWeb(ext, this._productService, this._configService)); this._checkEnableProposedApi(localExtensions); - if (!remoteEnv) { + if (!remoteEnv || !remoteAgentConnection) { result = this._registry.deltaExtensions(localExtensions, []); } else { @@ -131,7 +136,17 @@ export class ExtensionService extends AbstractExtensionService implements IExten localExtensions = localExtensions.filter(extension => !isRemoteExtension.has(ExtensionIdentifier.toKey(extension.identifier))); // save for remote extension's init data - this._remoteExtensionsEnvironmentData = remoteEnv; + this._remoteInitData = { + connectionData: this._remoteAuthorityResolverService.getConnectionData(remoteAgentConnection.remoteAuthority), + pid: remoteEnv.pid, + appRoot: remoteEnv.appRoot, + appSettingsHome: remoteEnv.appSettingsHome, + extensionHostLogsPath: remoteEnv.extensionHostLogsPath, + globalStorageHome: remoteEnv.globalStorageHome, + userHome: remoteEnv.userHome, + extensions: remoteEnv.extensions, + allExtensions: remoteEnv.extensions.concat(localExtensions) + }; result = this._registry.deltaExtensions(remoteEnv.extensions.concat(localExtensions), []); } diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts similarity index 86% rename from src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts rename to src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts index 10e02003330..ad196030788 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts @@ -17,7 +17,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import * as platform from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; -import { IExtensionHostStarter, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionHost, ExtensionHostLogFileName, ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; import { IProductService } from 'vs/platform/product/common/productService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { joinPath } from 'vs/base/common/resources'; @@ -25,7 +25,19 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output'; import { localize } from 'vs/nls'; -export class WebWorkerExtensionHostStarter implements IExtensionHostStarter { +export interface IWebWorkerExtensionHostInitData { + readonly autoStart: boolean; + readonly extensions: IExtensionDescription[]; +} + +export interface IWebWorkerExtensionHostDataProvider { + getInitData(): Promise; +} + +export class WebWorkerExtensionHost implements IExtensionHost { + + public readonly kind = ExtensionHostKind.LocalWebWorker; + public readonly remoteAuthority = null; private _toDispose = new DisposableStore(); private _isTerminating: boolean = false; @@ -34,12 +46,11 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter { private readonly _onDidExit = new Emitter<[number, string | null]>(); readonly onExit: Event<[number, string | null]> = this._onDidExit.event; + private readonly _extensionHostLogsLocation: URI; private readonly _extensionHostLogFile: URI; constructor( - private readonly _autoStart: boolean, - private readonly _extensions: Promise, - private readonly _extensionHostLogsLocation: URI, + private readonly _initDataProvider: IWebWorkerExtensionHostDataProvider, @ITelemetryService private readonly _telemetryService: ITelemetryService, @IWorkspaceContextService private readonly _contextService: IWorkspaceContextService, @ILabelService private readonly _labelService: ILabelService, @@ -47,6 +58,7 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter { @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService, @IProductService private readonly _productService: IProductService, ) { + this._extensionHostLogsLocation = URI.file(this._environmentService.logsPath).with({ scheme: this._environmentService.logFile.scheme }); this._extensionHostLogFile = joinPath(this._extensionHostLogsLocation, `${ExtensionHostLogFileName}.log`); } @@ -127,7 +139,7 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter { } private async _createExtHostInitData(): Promise { - const [telemetryInfo, extensionDescriptions] = await Promise.all([this._telemetryService.getTelemetryInfo(), this._extensions]); + const [telemetryInfo, initData] = await Promise.all([this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]); const workspace = this._contextService.getWorkspace(); return { commit: this._productService.commit, @@ -152,12 +164,12 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter { }, resolvedExtensions: [], hostExtensions: [], - extensions: extensionDescriptions, + extensions: initData.extensions, telemetryInfo, logLevel: this._logService.getLevel(), logsLocation: this._extensionHostLogsLocation, logFile: this._extensionHostLogFile, - autoStart: this._autoStart, + autoStart: initData.autoStart, remote: { authority: this._environmentService.configuration.remoteAuthority, connectionData: null, diff --git a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts index c5f788650eb..2fabfc1b08c 100644 --- a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts +++ b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts @@ -15,12 +15,12 @@ import { BetterMergeId } from 'vs/platform/extensionManagement/common/extensionM import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ActivationTimes, ExtensionPointContribution, IExtensionService, IExtensionsStatus, IMessage, IWillActivateEvent, IResponsiveStateChangeEvent, toExtension } from 'vs/workbench/services/extensions/common/extensions'; +import { ActivationTimes, ExtensionPointContribution, IExtensionService, IExtensionsStatus, IMessage, IWillActivateEvent, IResponsiveStateChangeEvent, toExtension, IExtensionHost } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionMessageCollector, ExtensionPoint, ExtensionsRegistry, IExtensionPoint, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { ResponsiveState } from 'vs/workbench/services/extensions/common/rpcProtocol'; -import { ExtensionHostProcessManager } from 'vs/workbench/services/extensions/common/extensionHostProcessManager'; -import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionHostManager } from 'vs/workbench/services/extensions/common/extensionHostManager'; +import { ExtensionIdentifier, IExtensionDescription, IScannedExtension, ExtensionType } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { parseExtensionDevOptions } from 'vs/workbench/services/extensions/common/extensionDevOptions'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -29,6 +29,16 @@ import { ExtensionActivationReason } from 'vs/workbench/api/common/extHostExtens const hasOwnProperty = Object.hasOwnProperty; const NO_OP_VOID_PROMISE = Promise.resolve(undefined); +export function parseScannedExtension(extension: IScannedExtension): IExtensionDescription { + return { + identifier: new ExtensionIdentifier(`${extension.packageJSON.publisher}.${extension.packageJSON.name}`), + isBuiltin: extension.type === ExtensionType.System, + isUnderDevelopment: false, + extensionLocation: extension.location, + ...extension.packageJSON, + }; +} + export abstract class AbstractExtensionService extends Disposable implements IExtensionService { public _serviceBrand: undefined; @@ -58,9 +68,9 @@ export abstract class AbstractExtensionService extends Disposable implements IEx protected readonly _isExtensionDevTestFromCli: boolean; // --- Members used per extension host process - protected _extensionHostProcessManagers: ExtensionHostProcessManager[]; + protected _extensionHostManagers: ExtensionHostManager[]; protected _extensionHostActiveExtensions: Map; - private _extensionHostProcessActivationTimes: Map; + private _extensionHostActivationTimes: Map; private _extensionHostExtensionRuntimeErrors: Map; constructor( @@ -85,9 +95,9 @@ export abstract class AbstractExtensionService extends Disposable implements IEx this._extensionsMessages = new Map(); this._proposedApiController = new ProposedApiController(this._environmentService, this._productService); - this._extensionHostProcessManagers = []; + this._extensionHostManagers = []; this._extensionHostActiveExtensions = new Map(); - this._extensionHostProcessActivationTimes = new Map(); + this._extensionHostActivationTimes = new Map(); this._extensionHostExtensionRuntimeErrors = new Map(); const devOpts = parseExtensionDevOptions(this._environmentService); @@ -97,7 +107,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx protected async _initialize(): Promise { perf.mark('willLoadExtensions'); - this._startExtensionHostProcess(true, []); + this._startExtensionHosts(true, []); this.whenInstalledExtensionsRegistered().then(() => perf.mark('didLoadExtensions')); await this._scanAndHandleExtensions(); this._releaseBarrier(); @@ -110,18 +120,18 @@ export abstract class AbstractExtensionService extends Disposable implements IEx this._onDidChangeExtensionsStatus.fire(this._registry.getAllExtensionDescriptions().map(e => e.identifier)); } - private _stopExtensionHostProcess(): void { + private _stopExtensionHosts(): void { let previouslyActivatedExtensionIds: ExtensionIdentifier[] = []; this._extensionHostActiveExtensions.forEach((value) => { previouslyActivatedExtensionIds.push(value); }); - for (const manager of this._extensionHostProcessManagers) { + for (const manager of this._extensionHostManagers) { manager.dispose(); } - this._extensionHostProcessManagers = []; + this._extensionHostManagers = []; this._extensionHostActiveExtensions = new Map(); - this._extensionHostProcessActivationTimes = new Map(); + this._extensionHostActivationTimes = new Map(); this._extensionHostExtensionRuntimeErrors = new Map(); if (previouslyActivatedExtensionIds.length > 0) { @@ -129,18 +139,19 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } } - private _startExtensionHostProcess(isInitialStart: boolean, initialActivationEvents: string[]): void { - this._stopExtensionHostProcess(); + private _startExtensionHosts(isInitialStart: boolean, initialActivationEvents: string[]): void { + this._stopExtensionHosts(); - const processManagers = this._createExtensionHosts(isInitialStart, initialActivationEvents); - processManagers.forEach((processManager) => { + const extensionHosts = this._createExtensionHosts(isInitialStart); + extensionHosts.forEach((extensionHost) => { + const processManager = this._instantiationService.createInstance(ExtensionHostManager, extensionHost, initialActivationEvents); processManager.onDidExit(([code, signal]) => this._onExtensionHostCrashOrExit(processManager, code, signal)); processManager.onDidChangeResponsiveState((responsiveState) => { this._onDidChangeResponsiveChange.fire({ isResponsive: responsiveState === ResponsiveState.Responsive }); }); - this._extensionHostProcessManagers.push(processManager); + this._extensionHostManagers.push(processManager); }); } - private _onExtensionHostCrashOrExit(extensionHost: ExtensionHostProcessManager, code: number, signal: string | null): void { + private _onExtensionHostCrashOrExit(extensionHost: ExtensionHostManager, code: number, signal: string | null): void { // Unexpected termination if (!this._isExtensionDevHost) { @@ -151,9 +162,9 @@ export abstract class AbstractExtensionService extends Disposable implements IEx this._onExtensionHostExit(code); } - protected _onExtensionHostCrashed(extensionHost: ExtensionHostProcessManager, code: number, signal: string | null): void { + protected _onExtensionHostCrashed(extensionHost: ExtensionHostManager, code: number, signal: string | null): void { console.error('Extension host terminated unexpectedly. Code: ', code, ' Signal: ', signal); - this._stopExtensionHostProcess(); + this._stopExtensionHosts(); } //#region IExtensionService @@ -167,12 +178,12 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } public restartExtensionHost(): void { - this._stopExtensionHostProcess(); - this._startExtensionHostProcess(false, Array.from(this._allRequestedActivateEvents.keys())); + this._stopExtensionHosts(); + this._startExtensionHosts(false, Array.from(this._allRequestedActivateEvents.keys())); } protected startExtensionHost(): void { - this._startExtensionHostProcess(false, Array.from(this._allRequestedActivateEvents.keys())); + this._startExtensionHosts(false, Array.from(this._allRequestedActivateEvents.keys())); } public activateByEvent(activationEvent: string): Promise { @@ -200,7 +211,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx private _activateByEvent(activationEvent: string): Promise { const result = Promise.all( - this._extensionHostProcessManagers.map(extHostManager => extHostManager.activateByEvent(activationEvent)) + this._extensionHostManagers.map(extHostManager => extHostManager.activateByEvent(activationEvent)) ).then(() => { }); this._onWillActivateByEvent.fire({ event: activationEvent, @@ -248,7 +259,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx const extensionKey = ExtensionIdentifier.toKey(extension.identifier); result[extension.identifier.value] = { messages: this._extensionsMessages.get(extensionKey) || [], - activationTimes: this._extensionHostProcessActivationTimes.get(extensionKey), + activationTimes: this._extensionHostActivationTimes.get(extensionKey), runtimeErrors: this._extensionHostExtensionRuntimeErrors.get(extensionKey) || [], }; } @@ -261,7 +272,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } public async setRemoteEnvironment(env: { [key: string]: string | null }): Promise { - await this._extensionHostProcessManagers + await this._extensionHostManagers .map(manager => manager.setRemoteEnvironment(env)); } @@ -275,6 +286,14 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } } + protected _checkEnabledAndProposedAPI(extensions: IExtensionDescription[]): IExtensionDescription[] { + // enable or disable proposed API per extension + this._checkEnableProposedApi(extensions); + + // keep only enabled extensions + return extensions.filter(extension => this._isEnabled(extension)); + } + private _isExtensionUnderDevelopment(extension: IExtensionDescription): boolean { if (this._environmentService.isExtensionDevelopment) { const extDevLocs = this._environmentService.extensionDevelopmentLocationURI; @@ -291,21 +310,17 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } protected _isEnabled(extension: IExtensionDescription): boolean { - return !this._isDisabled(extension); - } - - protected _isDisabled(extension: IExtensionDescription): boolean { if (this._isExtensionUnderDevelopment(extension)) { // Never disable extensions under development - return false; + return true; } if (ExtensionIdentifier.equals(extension.identifier, BetterMergeId)) { // Check if this is the better merge extension which was migrated to a built-in extension - return true; + return false; } - return !this._extensionEnablementService.isEnabled(toExtension(extension)); + return this._extensionEnablementService.isEnabled(toExtension(extension)); } protected _doHandleExtensionPoints(affectedExtensions: IExtensionDescription[]): void { @@ -413,7 +428,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx public async _activateById(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise { const results = await Promise.all( - this._extensionHostProcessManagers.map(manager => manager.activate(extensionId, reason)) + this._extensionHostManagers.map(manager => manager.activate(extensionId, reason)) ); const activated = results.some(e => e); if (!activated) { @@ -426,7 +441,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } public _onDidActivateExtension(extensionId: ExtensionIdentifier, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationReason: ExtensionActivationReason): void { - this._extensionHostProcessActivationTimes.set(ExtensionIdentifier.toKey(extensionId), new ActivationTimes(codeLoadingTime, activateCallTime, activateResolvedTime, activationReason)); + this._extensionHostActivationTimes.set(ExtensionIdentifier.toKey(extensionId), new ActivationTimes(codeLoadingTime, activateCallTime, activateResolvedTime, activationReason)); this._onDidChangeExtensionsStatus.fire([extensionId]); } @@ -441,7 +456,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx //#endregion - protected abstract _createExtensionHosts(isInitialStart: boolean, initialActivationEvents: string[]): ExtensionHostProcessManager[]; + protected abstract _createExtensionHosts(isInitialStart: boolean): IExtensionHost[]; protected abstract _scanAndHandleExtensions(): Promise; public abstract _onExtensionHostExit(code: number): void; } diff --git a/src/vs/workbench/services/extensions/common/extensionHostProcessManager.ts b/src/vs/workbench/services/extensions/common/extensionHostManager.ts similarity index 76% rename from src/vs/workbench/services/extensions/common/extensionHostProcessManager.ts rename to src/vs/workbench/services/extensions/common/extensionHostManager.ts index 12bf5c14dc4..944a301dd92 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostProcessManager.ts +++ b/src/vs/workbench/services/extensions/common/extensionHostManager.ts @@ -21,17 +21,17 @@ import { registerAction2, Action2 } from 'vs/platform/actions/common/actions'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { StopWatch } from 'vs/base/common/stopwatch'; import { VSBuffer } from 'vs/base/common/buffer'; -import { IExtensionHostStarter } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionHost, ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionActivationReason } from 'vs/workbench/api/common/extHostExtensionActivator'; // Enable to see detailed message communication between window and extension host const LOG_EXTENSION_HOST_COMMUNICATION = false; const LOG_USE_COLORS = true; - const NO_OP_VOID_PROMISE = Promise.resolve(undefined); -export class ExtensionHostProcessManager extends Disposable { +export class ExtensionHostManager extends Disposable { + public readonly kind: ExtensionHostKind; public readonly onDidExit: Event<[number, string | null]>; private readonly _onDidChangeResponsiveState: Emitter = this._register(new Emitter()); @@ -40,32 +40,31 @@ export class ExtensionHostProcessManager extends Disposable { /** * A map of already activated events to speed things up if the same activation event is triggered multiple times. */ - private readonly _extensionHostProcessFinishedActivateEvents: { [activationEvent: string]: boolean; }; - private _extensionHostProcessRPCProtocol: RPCProtocol | null; - private readonly _extensionHostProcessCustomers: IDisposable[]; - private readonly _extensionHostProcessWorker: IExtensionHostStarter; + private readonly _finishedActivateEvents: { [activationEvent: string]: boolean; }; + private _rpcProtocol: RPCProtocol | null; + private readonly _customers: IDisposable[]; + private readonly _extensionHost: IExtensionHost; /** * winjs believes a proxy is a promise because it has a `then` method, so wrap the result in an object. */ - private _extensionHostProcessProxy: Promise<{ value: ExtHostExtensionServiceShape; } | null> | null; + private _proxy: Promise<{ value: ExtHostExtensionServiceShape; } | null> | null; private _resolveAuthorityAttempt: number; constructor( - public readonly isLocal: boolean, - extensionHostProcessWorker: IExtensionHostStarter, - private readonly _remoteAuthority: string | null, + extensionHost: IExtensionHost, initialActivationEvents: string[], @IInstantiationService private readonly _instantiationService: IInstantiationService, @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService, ) { super(); - this._extensionHostProcessFinishedActivateEvents = Object.create(null); - this._extensionHostProcessRPCProtocol = null; - this._extensionHostProcessCustomers = []; + this._finishedActivateEvents = Object.create(null); + this._rpcProtocol = null; + this._customers = []; - this._extensionHostProcessWorker = extensionHostProcessWorker; - this.onDidExit = this._extensionHostProcessWorker.onExit; - this._extensionHostProcessProxy = this._extensionHostProcessWorker.start()!.then( + this._extensionHost = extensionHost; + this.kind = this._extensionHost.kind; + this.onDidExit = this._extensionHost.onExit; + this._proxy = this._extensionHost.start()!.then( (protocol) => { return { value: this._createExtensionHostCustomers(protocol) }; }, @@ -75,7 +74,7 @@ export class ExtensionHostProcessManager extends Disposable { return null; } ); - this._extensionHostProcessProxy.then(() => { + this._proxy.then(() => { initialActivationEvents.forEach((activationEvent) => this.activateByEvent(activationEvent)); this._register(registerLatencyTestProvider({ measure: () => this.measure() @@ -85,27 +84,27 @@ export class ExtensionHostProcessManager extends Disposable { } public dispose(): void { - if (this._extensionHostProcessWorker) { - this._extensionHostProcessWorker.dispose(); + if (this._extensionHost) { + this._extensionHost.dispose(); } - if (this._extensionHostProcessRPCProtocol) { - this._extensionHostProcessRPCProtocol.dispose(); + if (this._rpcProtocol) { + this._rpcProtocol.dispose(); } - for (let i = 0, len = this._extensionHostProcessCustomers.length; i < len; i++) { - const customer = this._extensionHostProcessCustomers[i]; + for (let i = 0, len = this._customers.length; i < len; i++) { + const customer = this._customers[i]; try { customer.dispose(); } catch (err) { errors.onUnexpectedError(err); } } - this._extensionHostProcessProxy = null; + this._proxy = null; super.dispose(); } private async measure(): Promise { - const proxy = await this._getExtensionHostProcessProxy(); + const proxy = await this._getProxy(); if (!proxy) { return null; } @@ -113,18 +112,18 @@ export class ExtensionHostProcessManager extends Disposable { const down = await this._measureDown(proxy); const up = await this._measureUp(proxy); return { - remoteAuthority: this._remoteAuthority, + remoteAuthority: this._extensionHost.remoteAuthority, latency, down, up }; } - private async _getExtensionHostProcessProxy(): Promise { - if (!this._extensionHostProcessProxy) { + private async _getProxy(): Promise { + if (!this._proxy) { return null; } - const p = await this._extensionHostProcessProxy; + const p = await this._proxy; if (!p) { return null; } @@ -159,7 +158,7 @@ export class ExtensionHostProcessManager extends Disposable { const sw = StopWatch.create(true); await proxy.$test_up(buff); sw.stop(); - return ExtensionHostProcessManager._convert(SIZE, sw.elapsed()); + return ExtensionHostManager._convert(SIZE, sw.elapsed()); } private async _measureDown(proxy: ExtHostExtensionServiceShape): Promise { @@ -168,7 +167,7 @@ export class ExtensionHostProcessManager extends Disposable { const sw = StopWatch.create(true); await proxy.$test_down(SIZE); sw.stop(); - return ExtensionHostProcessManager._convert(SIZE, sw.elapsed()); + return ExtensionHostManager._convert(SIZE, sw.elapsed()); } private _createExtensionHostCustomers(protocol: IMessagePassingProtocol): ExtHostExtensionServiceShape { @@ -178,13 +177,13 @@ export class ExtensionHostProcessManager extends Disposable { logger = new RPCLogger(); } - this._extensionHostProcessRPCProtocol = new RPCProtocol(protocol, logger); - this._register(this._extensionHostProcessRPCProtocol.onDidChangeResponsiveState((responsiveState: ResponsiveState) => this._onDidChangeResponsiveState.fire(responsiveState))); + this._rpcProtocol = new RPCProtocol(protocol, logger); + this._register(this._rpcProtocol.onDidChangeResponsiveState((responsiveState: ResponsiveState) => this._onDidChangeResponsiveState.fire(responsiveState))); const extHostContext: IExtHostContext = { - remoteAuthority: this._remoteAuthority! /* TODO: alexdima, remove not-null assertion */, - getProxy: (identifier: ProxyIdentifier): T => this._extensionHostProcessRPCProtocol!.getProxy(identifier), - set: (identifier: ProxyIdentifier, instance: R): R => this._extensionHostProcessRPCProtocol!.set(identifier, instance), - assertRegistered: (identifiers: ProxyIdentifier[]): void => this._extensionHostProcessRPCProtocol!.assertRegistered(identifiers), + remoteAuthority: this._extensionHost.remoteAuthority, + getProxy: (identifier: ProxyIdentifier): T => this._rpcProtocol!.getProxy(identifier), + set: (identifier: ProxyIdentifier, instance: R): R => this._rpcProtocol!.set(identifier, instance), + assertRegistered: (identifiers: ProxyIdentifier[]): void => this._rpcProtocol!.assertRegistered(identifiers), }; // Named customers @@ -192,26 +191,26 @@ export class ExtensionHostProcessManager extends Disposable { for (let i = 0, len = namedCustomers.length; i < len; i++) { const [id, ctor] = namedCustomers[i]; const instance = this._instantiationService.createInstance(ctor, extHostContext); - this._extensionHostProcessCustomers.push(instance); - this._extensionHostProcessRPCProtocol.set(id, instance); + this._customers.push(instance); + this._rpcProtocol.set(id, instance); } // Customers const customers = ExtHostCustomersRegistry.getCustomers(); for (const ctor of customers) { const instance = this._instantiationService.createInstance(ctor, extHostContext); - this._extensionHostProcessCustomers.push(instance); + this._customers.push(instance); } // Check that no named customers are missing const expected: ProxyIdentifier[] = Object.keys(MainContext).map((key) => (MainContext)[key]); - this._extensionHostProcessRPCProtocol.assertRegistered(expected); + this._rpcProtocol.assertRegistered(expected); - return this._extensionHostProcessRPCProtocol.getProxy(ExtHostContext.ExtHostExtensionService); + return this._rpcProtocol.getProxy(ExtHostContext.ExtHostExtensionService); } public async activate(extension: ExtensionIdentifier, reason: ExtensionActivationReason): Promise { - const proxy = await this._getExtensionHostProcessProxy(); + const proxy = await this._getProxy(); if (!proxy) { return false; } @@ -219,10 +218,10 @@ export class ExtensionHostProcessManager extends Disposable { } public activateByEvent(activationEvent: string): Promise { - if (this._extensionHostProcessFinishedActivateEvents[activationEvent] || !this._extensionHostProcessProxy) { + if (this._finishedActivateEvents[activationEvent] || !this._proxy) { return NO_OP_VOID_PROMISE; } - return this._extensionHostProcessProxy.then((proxy) => { + return this._proxy.then((proxy) => { if (!proxy) { // this case is already covered above and logged. // i.e. the extension host could not be started @@ -230,16 +229,16 @@ export class ExtensionHostProcessManager extends Disposable { } return proxy.value.$activateByEvent(activationEvent); }).then(() => { - this._extensionHostProcessFinishedActivateEvents[activationEvent] = true; + this._finishedActivateEvents[activationEvent] = true; }); } public async getInspectPort(tryEnableInspector: boolean): Promise { - if (this._extensionHostProcessWorker) { + if (this._extensionHost) { if (tryEnableInspector) { - await this._extensionHostProcessWorker.enableInspectPort(); + await this._extensionHost.enableInspectPort(); } - let port = this._extensionHostProcessWorker.getInspectPort(); + let port = this._extensionHost.getInspectPort(); if (port) { return port; } @@ -260,7 +259,7 @@ export class ExtensionHostProcessManager extends Disposable { } }); } - const proxy = await this._getExtensionHostProcessProxy(); + const proxy = await this._getProxy(); if (!proxy) { throw new Error(`Cannot resolve authority`); } @@ -274,7 +273,7 @@ export class ExtensionHostProcessManager extends Disposable { } public async start(enabledExtensionIds: ExtensionIdentifier[]): Promise { - const proxy = await this._getExtensionHostProcessProxy(); + const proxy = await this._getProxy(); if (!proxy) { return; } @@ -282,7 +281,7 @@ export class ExtensionHostProcessManager extends Disposable { } public async deltaExtensions(toAdd: IExtensionDescription[], toRemove: ExtensionIdentifier[]): Promise { - const proxy = await this._getExtensionHostProcessProxy(); + const proxy = await this._getProxy(); if (!proxy) { return; } @@ -290,7 +289,7 @@ export class ExtensionHostProcessManager extends Disposable { } public async setRemoteEnvironment(env: { [key: string]: string | null }): Promise { - const proxy = await this._getExtensionHostProcessProxy(); + const proxy = await this._getProxy(); if (!proxy) { return; } @@ -394,7 +393,7 @@ registerAction2(class MeasureExtHostLatencyAction extends Action2 { value: nls.localize('measureExtHostLatency', "Measure Extension Host Latency"), original: 'Measure Extension Host Latency' }, - category: nls.localize('developer', "Developer"), + category: nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"), f1: true }); } diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index 9ca9d95e283..652a2603156 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -24,6 +24,8 @@ export const nullExtensionDescription = Object.freeze({ isBuiltin: false, }); +export const webWorkerExtHostConfig = 'extensions.webWorker'; + export const IExtensionService = createDecorator('extensionService'); export interface IMessage { @@ -84,7 +86,15 @@ export interface IExtensionHostProfile { getAggregatedTimes(): Map; } -export interface IExtensionHostStarter { +export const enum ExtensionHostKind { + LocalProcess, + LocalWebWorker, + Remote +} + +export interface IExtensionHost { + readonly kind: ExtensionHostKind; + readonly remoteAuthority: string | null; readonly onExit: Event<[number, string | null]>; start(): Promise | null; @@ -257,6 +267,17 @@ export function toExtension(extensionDescription: IExtensionDescription): IExten }; } +export function toExtensionDescription(extension: IExtension): IExtensionDescription { + return { + identifier: new ExtensionIdentifier(extension.identifier.id), + isBuiltin: extension.type === ExtensionType.System, + isUnderDevelopment: false, + extensionLocation: extension.location, + ...extension.manifest, + uuid: extension.identifier.uuid + }; +} + export class NullExtensionService implements IExtensionService { declare readonly _serviceBrand: undefined; diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index 166d02a14a1..323e85477b0 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -11,7 +11,7 @@ import { EXTENSION_IDENTIFIER_PATTERN } from 'vs/platform/extensionManagement/co import { Extensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { IMessage } from 'vs/workbench/services/extensions/common/extensions'; -import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription, EXTENSION_CATEGORIES } from 'vs/platform/extensions/common/extensions'; import { values } from 'vs/base/common/map'; const schemaRegistry = Registry.as(Extensions.JSONContribution); @@ -187,7 +187,7 @@ export const schema: IJSONSchema = { items: { oneOf: [{ type: 'string', - enum: ['Programming Languages', 'Snippets', 'Linters', 'Themes', 'Debuggers', 'Other', 'Keymaps', 'Formatters', 'Extension Packs', 'SCM Providers', 'Azure', 'Language Packs'], + enum: EXTENSION_CATEGORIES, }, { type: 'string', @@ -271,7 +271,7 @@ export const schema: IJSONSchema = { }, { label: 'onStartupFinished', - description: nls.localize('vscode.extension.activationEvents.onStartupFinished', 'An activation event emitted after the start-up finished (after all eager activated extensions have finished activating).'), + description: nls.localize('vscode.extension.activationEvents.onStartupFinished', 'An activation event emitted after the start-up finished (after all `*` activated extensions have finished activating).'), body: 'onStartupFinished' }, { diff --git a/src/vs/workbench/services/extensions/common/extensionsUtil.ts b/src/vs/workbench/services/extensions/common/extensionsUtil.ts index 9e8352ac881..93e7069d659 100644 --- a/src/vs/workbench/services/extensions/common/extensionsUtil.ts +++ b/src/vs/workbench/services/extensions/common/extensionsUtil.ts @@ -20,6 +20,11 @@ export function prefersExecuteOnWorkspace(manifest: IExtensionManifest, productS return (extensionKind.length > 0 && extensionKind[0] === 'workspace'); } +export function prefersExecuteOnWeb(manifest: IExtensionManifest, productService: IProductService, configurationService: IConfigurationService): boolean { + const extensionKind = getExtensionKind(manifest, productService, configurationService); + return (extensionKind.length > 0 && extensionKind[0] === 'web'); +} + export function canExecuteOnUI(manifest: IExtensionManifest, productService: IProductService, configurationService: IConfigurationService): boolean { const extensionKind = getExtensionKind(manifest, productService, configurationService); return extensionKind.some(kind => kind === 'ui'); diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts similarity index 72% rename from src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts rename to src/vs/workbench/services/extensions/common/remoteExtensionHost.ts index 17f9e6cdf6b..f91d97e80d8 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts @@ -13,9 +13,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IInitData, UIKind } from 'vs/workbench/api/common/extHost.protocol'; import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; -import { IExtensionHostStarter, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionHost, ExtensionHostLogFileName, ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; import { parseExtensionDevOptions } from 'vs/workbench/services/extensions/common/extensionDevOptions'; -import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; import { IRemoteAuthorityResolverService, IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; import * as platform from 'vs/base/common/platform'; import { Schemas } from 'vs/base/common/network'; @@ -33,30 +32,37 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output'; import { localize } from 'vs/nls'; -export interface IRemoteInitData { +export interface IRemoteExtensionHostInitData { readonly connectionData: IRemoteConnectionData | null; - readonly remoteEnvironment: IRemoteAgentEnvironment; + readonly pid: number; + readonly appRoot: URI; + readonly appSettingsHome: URI; + readonly extensionHostLogsPath: URI; + readonly globalStorageHome: URI; + readonly userHome: URI; + readonly extensions: IExtensionDescription[]; + readonly allExtensions: IExtensionDescription[]; } -export interface IInitDataProvider { +export interface IRemoteExtensionHostDataProvider { readonly remoteAuthority: string; - getInitData(): Promise; + getInitData(): Promise; } -export class RemoteExtensionHostClient extends Disposable implements IExtensionHostStarter { +export class RemoteExtensionHost extends Disposable implements IExtensionHost { + + public readonly kind = ExtensionHostKind.Remote; + public readonly remoteAuthority: string; private _onExit: Emitter<[number, string | null]> = this._register(new Emitter<[number, string | null]>()); public readonly onExit: Event<[number, string | null]> = this._onExit.event; private _protocol: PersistentProtocol | null; - + private _terminating: boolean; private readonly _isExtensionDevHost: boolean; - private _terminating: boolean; - constructor( - private readonly _allExtensions: Promise, - private readonly _initDataProvider: IInitDataProvider, + private readonly _initDataProvider: IRemoteExtensionHostDataProvider, private readonly _socketFactory: ISocketFactory, @IWorkspaceContextService private readonly _contextService: IWorkspaceContextService, @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService, @@ -70,6 +76,7 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH @ISignService private readonly _signService: ISignService ) { super(); + this.remoteAuthority = this._initDataProvider.remoteAuthority; this._protocol = null; this._terminating = false; @@ -194,53 +201,51 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH this._onExit.fire([0, null]); } - private _createExtHostInitData(isExtensionDevelopmentDebug: boolean): Promise { - return Promise.all([this._allExtensions, this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]).then(([allExtensions, telemetryInfo, remoteInitData]) => { - // Collect all identifiers for extension ids which can be considered "resolved" - const resolvedExtensions = allExtensions.filter(extension => !extension.main).map(extension => extension.identifier); - const hostExtensions = allExtensions.filter(extension => extension.main && extension.api === 'none').map(extension => extension.identifier); - const workspace = this._contextService.getWorkspace(); - const remoteEnv = remoteInitData.remoteEnvironment; - const r: IInitData = { - commit: this._productService.commit, - version: this._productService.version, - parentPid: remoteEnv.pid, - environment: { - isExtensionDevelopmentDebug, - appRoot: remoteEnv.appRoot, - appSettingsHome: remoteEnv.appSettingsHome, - appName: this._productService.nameLong, - appUriScheme: this._productService.urlProtocol, - appLanguage: platform.language, - extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, - extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, - globalStorageHome: remoteEnv.globalStorageHome, - userHome: remoteEnv.userHome, - webviewResourceRoot: this._environmentService.webviewResourceRoot, - webviewCspSource: this._environmentService.webviewCspSource, - }, - workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : { - configuration: workspace.configuration, - id: workspace.id, - name: this._labelService.getWorkspaceLabel(workspace) - }, - remote: { - isRemote: true, - authority: this._initDataProvider.remoteAuthority, - connectionData: remoteInitData.connectionData - }, - resolvedExtensions: resolvedExtensions, - hostExtensions: hostExtensions, - extensions: remoteEnv.extensions, - telemetryInfo, - logLevel: this._logService.getLevel(), - logsLocation: remoteEnv.extensionHostLogsPath, - logFile: joinPath(remoteEnv.extensionHostLogsPath, `${ExtensionHostLogFileName}.log`), - autoStart: true, - uiKind: platform.isWeb ? UIKind.Web : UIKind.Desktop - }; - return r; - }); + private async _createExtHostInitData(isExtensionDevelopmentDebug: boolean): Promise { + const [telemetryInfo, remoteInitData] = await Promise.all([this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]); + + // Collect all identifiers for extension ids which can be considered "resolved" + const resolvedExtensions = remoteInitData.allExtensions.filter(extension => !extension.main).map(extension => extension.identifier); + const hostExtensions = remoteInitData.allExtensions.filter(extension => extension.main && extension.api === 'none').map(extension => extension.identifier); + const workspace = this._contextService.getWorkspace(); + return { + commit: this._productService.commit, + version: this._productService.version, + parentPid: remoteInitData.pid, + environment: { + isExtensionDevelopmentDebug, + appRoot: remoteInitData.appRoot, + appSettingsHome: remoteInitData.appSettingsHome, + appName: this._productService.nameLong, + appUriScheme: this._productService.urlProtocol, + appLanguage: platform.language, + extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, + extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, + globalStorageHome: remoteInitData.globalStorageHome, + userHome: remoteInitData.userHome, + webviewResourceRoot: this._environmentService.webviewResourceRoot, + webviewCspSource: this._environmentService.webviewCspSource, + }, + workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : { + configuration: workspace.configuration, + id: workspace.id, + name: this._labelService.getWorkspaceLabel(workspace) + }, + remote: { + isRemote: true, + authority: this._initDataProvider.remoteAuthority, + connectionData: remoteInitData.connectionData + }, + resolvedExtensions: resolvedExtensions, + hostExtensions: hostExtensions, + extensions: remoteInitData.extensions, + telemetryInfo, + logLevel: this._logService.getLevel(), + logsLocation: remoteInitData.extensionHostLogsPath, + logFile: joinPath(remoteInitData.extensionHostLogsPath, `${ExtensionHostLogFileName}.log`), + autoStart: true, + uiKind: platform.isWeb ? UIKind.Web : UIKind.Desktop + }; } getInspectPort(): number | undefined { diff --git a/src/vs/workbench/services/extensions/common/staticExtensions.ts b/src/vs/workbench/services/extensions/common/staticExtensions.ts deleted file mode 100644 index 2c8631126a6..00000000000 --- a/src/vs/workbench/services/extensions/common/staticExtensions.ts +++ /dev/null @@ -1,40 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IExtensionDescription, ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; - -export const IStaticExtensionsService = createDecorator('IStaticExtensionsService'); - -export interface IStaticExtensionsService { - readonly _serviceBrand: undefined; - getExtensions(): Promise; -} - -export class StaticExtensionsService implements IStaticExtensionsService { - - declare readonly _serviceBrand: undefined; - - private readonly _descriptions: IExtensionDescription[] = []; - - constructor(@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService) { - const staticExtensions = environmentService.options && Array.isArray(environmentService.options.staticExtensions) ? environmentService.options.staticExtensions : []; - - this._descriptions = staticExtensions.map(data => { - identifier: new ExtensionIdentifier(`${data.packageJSON.publisher}.${data.packageJSON.name}`), - extensionLocation: data.extensionLocation, - isBuiltin: !!data.isBuiltin, - ...data.packageJSON, - }); - } - - async getExtensions(): Promise { - return this._descriptions; - } -} - -registerSingleton(IStaticExtensionsService, StaticExtensionsService, true); diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index ba9b0fec2c3..b149586e303 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -3,29 +3,27 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; -import { ExtensionHostProcessWorker } from 'vs/workbench/services/extensions/electron-browser/extensionHost'; +import { LocalProcessExtensionHost } from 'vs/workbench/services/extensions/electron-browser/localProcessExtensionHost'; import { CachedExtensionScanner } from 'vs/workbench/services/extensions/electron-browser/cachedExtensionScanner'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { AbstractExtensionService } from 'vs/workbench/services/extensions/common/abstractExtensionService'; +import { AbstractExtensionService, parseScannedExtension } from 'vs/workbench/services/extensions/common/abstractExtensionService'; import * as nls from 'vs/nls'; import { runWhenIdle } from 'vs/base/common/async'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IWorkbenchExtensionEnablementService, EnablementState } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { IWorkbenchExtensionEnablementService, EnablementState, IWebExtensionsScannerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IInitDataProvider, RemoteExtensionHostClient } from 'vs/workbench/services/extensions/common/remoteExtensionHostClient'; +import { IRemoteExtensionHostDataProvider, RemoteExtensionHost, IRemoteExtensionHostInitData } from 'vs/workbench/services/extensions/common/remoteExtensionHost'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IRemoteAuthorityResolverService, RemoteAuthorityResolverError, ResolverResult } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { getExtensionKind } from 'vs/workbench/services/extensions/common/extensionsUtil'; -import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; -import { ExtensionHostProcessManager } from 'vs/workbench/services/extensions/common/extensionHostProcessManager'; +import { IExtensionService, toExtension, ExtensionHostKind, IExtensionHost, webWorkerExtHostConfig } from 'vs/workbench/services/extensions/common/extensions'; +import { ExtensionHostManager } from 'vs/workbench/services/extensions/common/extensionHostManager'; import { ExtensionIdentifier, IExtension, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { Schemas } from 'vs/base/common/network'; import { IFileService } from 'vs/platform/files/common/files'; @@ -33,7 +31,6 @@ import { PersistentConnectionEventType } from 'vs/platform/remote/common/remoteA import { IProductService } from 'vs/platform/product/common/productService'; import { Logger } from 'vs/workbench/services/extensions/common/extensionPoints'; import { flatten } from 'vs/base/common/arrays'; -import { IStaticExtensionsService } from 'vs/workbench/services/extensions/common/staticExtensions'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { IRemoteExplorerService } from 'vs/workbench/services/remote/common/remoteExplorerService'; @@ -42,6 +39,8 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { getRemoteName } from 'vs/platform/remote/common/remoteHosts'; +import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; +import { WebWorkerExtensionHost } from 'vs/workbench/services/extensions/browser/webWorkerExtensionHost'; class DeltaExtensionsQueueItem { constructor( @@ -52,8 +51,9 @@ class DeltaExtensionsQueueItem { export class ExtensionService extends AbstractExtensionService implements IExtensionService { - private readonly _remoteEnvironment: Map; - + private readonly _enableLocalWebWorker: boolean; + private readonly _remoteInitData: Map; + private _runningLocation: Map; private readonly _extensionScanner: CachedExtensionScanner; private _deltaExtensionsQueue: DeltaExtensionsQueueItem[]; @@ -70,7 +70,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService, @IConfigurationService private readonly _configurationService: IConfigurationService, @ILifecycleService private readonly _lifecycleService: ILifecycleService, - @IStaticExtensionsService private readonly _staticExtensions: IStaticExtensionsService, + @IWebExtensionsScannerService private readonly _webExtensionsScannerService: IWebExtensionsScannerService, @IElectronService private readonly _electronService: IElectronService, @IHostService private readonly _hostService: IHostService, @IRemoteExplorerService private readonly _remoteExplorerService: IRemoteExplorerService, @@ -86,16 +86,10 @@ export class ExtensionService extends AbstractExtensionService implements IExten productService ); - if (this._extensionEnablementService.allUserExtensionsDisabled) { - this._notificationService.prompt(Severity.Info, nls.localize('extensionsDisabled', "All installed extensions are temporarily disabled. Reload the window to return to the previous state."), [{ - label: nls.localize('Reload', "Reload"), - run: () => { - this._hostService.reload(); - } - }]); - } + this._enableLocalWebWorker = this._configurationService.getValue(webWorkerExtHostConfig); - this._remoteEnvironment = new Map(); + this._remoteInitData = new Map(); + this._runningLocation = new Map(); this._extensionScanner = instantiationService.createInstance(CachedExtensionScanner); this._deltaExtensionsQueue = []; @@ -143,8 +137,28 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._initialize(); }, 50 /*max delay*/); }); + + // delay notification for extensions disabled until workbench restored + if (this._extensionEnablementService.allUserExtensionsDisabled) { + this._lifecycleService.when(LifecyclePhase.Restored).then(() => { + this._notificationService.prompt(Severity.Info, nls.localize('extensionsDisabled', "All installed extensions are temporarily disabled. Reload the window to return to the previous state."), [{ + label: nls.localize('Reload', "Reload"), + run: () => { + this._hostService.reload(); + } + }]); + }); + } } + private _getExtensionHostManager(kind: ExtensionHostKind): ExtensionHostManager | null { + for (const extensionHostManager of this._extensionHostManagers) { + if (extensionHostManager.kind === kind) { + return extensionHostManager; + } + } + return null; + } //#region deltaExtensions @@ -223,11 +237,12 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._checkEnableProposedApi(toAdd); // Update extension points - this._rehandleExtensionPoints(([]).concat(toAdd).concat(toRemove)); + this._doHandleExtensionPoints(([]).concat(toAdd).concat(toRemove)); // Update the extension host - if (this._extensionHostProcessManagers.length > 0) { - await this._extensionHostProcessManagers[0].deltaExtensions(toAdd, toRemove.map(e => e.identifier)); + const localProcessExtensionHost = this._getExtensionHostManager(ExtensionHostKind.LocalProcess); + if (localProcessExtensionHost) { + await localProcessExtensionHost.deltaExtensions(toAdd, toRemove.map(e => e.identifier)); } for (let i = 0; i < toAdd.length; i++) { @@ -235,15 +250,11 @@ export class ExtensionService extends AbstractExtensionService implements IExten } } - private _rehandleExtensionPoints(extensionDescriptions: IExtensionDescription[]): void { - this._doHandleExtensionPoints(extensionDescriptions); - } - public canAddExtension(extensionDescription: IExtensionDescription): boolean { return this._canAddExtension(toExtension(extensionDescription)); } - public _canAddExtension(extension: IExtension): boolean { + private _canAddExtension(extension: IExtension): boolean { if (this._environmentService.configuration.remoteAuthority) { return false; } @@ -334,57 +345,78 @@ export class ExtensionService extends AbstractExtensionService implements IExten if (shouldActivate) { await Promise.all( - this._extensionHostProcessManagers.map(extHostManager => extHostManager.activate(extensionDescription.identifier, { startup: false, extensionId: extensionDescription.identifier, activationEvent: shouldActivateReason! })) + this._extensionHostManagers.map(extHostManager => extHostManager.activate(extensionDescription.identifier, { startup: false, extensionId: extensionDescription.identifier, activationEvent: shouldActivateReason! })) ).then(() => { }); } } //#endregion - private _createProvider(remoteAuthority: string): IInitDataProvider { + private async _scanAllLocalExtensions(): Promise { + return flatten(await Promise.all([ + this._extensionScanner.scannedExtensions, + this._webExtensionsScannerService.scanExtensions().then(extensions => extensions.map(parseScannedExtension)) + ])); + } + + private _createLocalExtensionHostDataProvider(isInitialStart: boolean, desiredRunningLocation: ExtensionRunningLocation) { return { - remoteAuthority: remoteAuthority, getInitData: async () => { - await this.whenInstalledExtensionsRegistered(); - const connectionData = this._remoteAuthorityResolverService.getConnectionData(remoteAuthority); - const remoteEnvironment = this._remoteEnvironment.get(remoteAuthority)!; - return { connectionData, remoteEnvironment }; + if (isInitialStart) { + const localExtensions = this._checkEnabledAndProposedAPI(await this._scanAllLocalExtensions()); + const runningLocation = determineRunningLocation(this._productService, this._configurationService, localExtensions, [], false, this._enableLocalWebWorker); + const localProcessExtensions = filterByRunningLocation(localExtensions, runningLocation, desiredRunningLocation); + return { + autoStart: false, + extensions: localProcessExtensions + }; + } else { + // restart case + const allExtensions = await this.getExtensions(); + const localProcessExtensions = filterByRunningLocation(allExtensions, this._runningLocation, desiredRunningLocation); + return { + autoStart: true, + extensions: localProcessExtensions + }; + } } }; } - protected _createExtensionHosts(isInitialStart: boolean, initialActivationEvents: string[]): ExtensionHostProcessManager[] { - let autoStart: boolean; - let extensions: Promise; - if (isInitialStart) { - autoStart = false; - extensions = this._extensionScanner.scannedExtensions.then(extensions => extensions.filter(extension => this._isEnabled(extension))); // remove disabled extensions - } else { - // restart case - autoStart = true; - extensions = this.getExtensions().then((extensions) => extensions.filter(ext => ext.extensionLocation.scheme === Schemas.file)); + private _createRemoteExtensionHostDataProvider(remoteAuthority: string): IRemoteExtensionHostDataProvider { + return { + remoteAuthority: remoteAuthority, + getInitData: async () => { + await this.whenInstalledExtensionsRegistered(); + return this._remoteInitData.get(remoteAuthority)!; + } + }; + } + + protected _createExtensionHosts(isInitialStart: boolean): IExtensionHost[] { + const result: IExtensionHost[] = []; + + const localProcessExtHost = this._instantiationService.createInstance(LocalProcessExtensionHost, this._createLocalExtensionHostDataProvider(isInitialStart, ExtensionRunningLocation.LocalProcess)); + result.push(localProcessExtHost); + + if (this._enableLocalWebWorker) { + const webWorkerExtHost = this._instantiationService.createInstance(WebWorkerExtensionHost, this._createLocalExtensionHostDataProvider(isInitialStart, ExtensionRunningLocation.LocalWebWorker)); + result.push(webWorkerExtHost); } - const result: ExtensionHostProcessManager[] = []; - - const extHostProcessWorker = this._instantiationService.createInstance(ExtensionHostProcessWorker, autoStart, extensions, this._environmentService.extHostLogsPath); - const extHostProcessManager = this._instantiationService.createInstance(ExtensionHostProcessManager, true, extHostProcessWorker, null, initialActivationEvents); - result.push(extHostProcessManager); - const remoteAgentConnection = this._remoteAgentService.getConnection(); if (remoteAgentConnection) { - const remoteExtHostProcessWorker = this._instantiationService.createInstance(RemoteExtensionHostClient, this.getExtensions(), this._createProvider(remoteAgentConnection.remoteAuthority), this._remoteAgentService.socketFactory); - const remoteExtHostProcessManager = this._instantiationService.createInstance(ExtensionHostProcessManager, false, remoteExtHostProcessWorker, remoteAgentConnection.remoteAuthority, initialActivationEvents); - result.push(remoteExtHostProcessManager); + const remoteExtHost = this._instantiationService.createInstance(RemoteExtensionHost, this._createRemoteExtensionHostDataProvider(remoteAgentConnection.remoteAuthority), this._remoteAgentService.socketFactory); + result.push(remoteExtHost); } return result; } - protected _onExtensionHostCrashed(extensionHost: ExtensionHostProcessManager, code: number, signal: string | null): void { + protected _onExtensionHostCrashed(extensionHost: ExtensionHostManager, code: number, signal: string | null): void { super._onExtensionHostCrashed(extensionHost, code, signal); - if (extensionHost.isLocal) { + if (extensionHost.kind === ExtensionHostKind.LocalProcess) { if (code === 55) { this._notificationService.prompt( Severity.Error, @@ -433,10 +465,10 @@ export class ExtensionService extends AbstractExtensionService implements IExten return; } - const extensionHost = this._extensionHostProcessManagers[0]; + const localProcessExtensionHost = this._getExtensionHostManager(ExtensionHostKind.LocalProcess)!; this._remoteAuthorityResolverService._clearResolvedAuthority(remoteAuthority); try { - const result = await extensionHost.resolveAuthority(remoteAuthority); + const result = await localProcessExtensionHost.resolveAuthority(remoteAuthority); this._remoteAuthorityResolverService._setResolvedAuthority(result.authority, result.options); } catch (err) { this._remoteAuthorityResolverService._setResolvedAuthorityError(remoteAuthority, err); @@ -447,25 +479,19 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._extensionScanner.startScanningExtensions(this.createLogger()); const remoteAuthority = this._environmentService.configuration.remoteAuthority; - const extensionHost = this._extensionHostProcessManagers[0]; + const localProcessExtensionHost = this._getExtensionHostManager(ExtensionHostKind.LocalProcess)!; - const allExtensions = flatten(await Promise.all([this._extensionScanner.scannedExtensions, this._staticExtensions.getExtensions()])); - - // enable or disable proposed API per extension - this._checkEnableProposedApi(allExtensions); - - // remove disabled extensions - let localExtensions = remove(allExtensions, extension => this._isDisabled(extension)); + let localExtensions = this._checkEnabledAndProposedAPI(await this._scanAllLocalExtensions()); + let remoteEnv: IRemoteAgentEnvironment | null = null; if (remoteAuthority) { - let resolvedAuthority: ResolverResult; + let resolverResult: ResolverResult; try { - resolvedAuthority = await extensionHost.resolveAuthority(remoteAuthority); + resolverResult = await localProcessExtensionHost.resolveAuthority(remoteAuthority); } catch (err) { - const remoteName = getRemoteName(remoteAuthority); if (RemoteAuthorityResolverError.isNoResolverFound(err)) { - err.isHandled = await this._handleNoResolverFound(remoteName, allExtensions); + err.isHandled = await this._handleNoResolverFound(remoteAuthority); } else { console.log(err); if (RemoteAuthorityResolverError.isHandled(err)) { @@ -475,22 +501,18 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._remoteAuthorityResolverService._setResolvedAuthorityError(remoteAuthority, err); // Proceed with the local extension host - await this._startLocalExtensionHost(extensionHost, localExtensions, localExtensions.map(extension => extension.identifier)); + await this._startLocalExtensionHost(localExtensions); return; } // set the resolved authority - this._remoteAuthorityResolverService._setResolvedAuthority(resolvedAuthority.authority, resolvedAuthority.options); - this._remoteExplorerService.setTunnelInformation(resolvedAuthority.tunnelInformation); + this._remoteAuthorityResolverService._setResolvedAuthority(resolverResult.authority, resolverResult.options); + this._remoteExplorerService.setTunnelInformation(resolverResult.tunnelInformation); // monitor for breakage const connection = this._remoteAgentService.getConnection(); if (connection) { connection.onDidStateChange(async (e) => { - const remoteAuthority = this._environmentService.configuration.remoteAuthority; - if (!remoteAuthority) { - return; - } if (e.type === PersistentConnectionEventType.ConnectionLost) { this._remoteAuthorityResolverService._clearResolvedAuthority(remoteAuthority); } @@ -499,80 +521,64 @@ export class ExtensionService extends AbstractExtensionService implements IExten } // fetch the remote environment - const remoteEnv = (await this._remoteAgentService.getEnvironment()); + remoteEnv = await this._remoteAgentService.getEnvironment(); if (!remoteEnv) { this._notificationService.notify({ severity: Severity.Error, message: nls.localize('getEnvironmentFailure', "Could not fetch remote environment") }); // Proceed with the local extension host - await this._startLocalExtensionHost(extensionHost, localExtensions, localExtensions.map(extension => extension.identifier)); + await this._startLocalExtensionHost(localExtensions); return; } - - // enable or disable proposed API per extension - this._checkEnableProposedApi(remoteEnv.extensions); - - // remove disabled extensions - remoteEnv.extensions = remove(remoteEnv.extensions, extension => this._isDisabled(extension)); - - // Determine where each extension will execute, based on extensionKind - const isInstalledLocally = new Set(); - localExtensions.forEach(ext => isInstalledLocally.add(ExtensionIdentifier.toKey(ext.identifier))); - - const isInstalledRemotely = new Set(); - remoteEnv.extensions.forEach(ext => isInstalledRemotely.add(ExtensionIdentifier.toKey(ext.identifier))); - - const enum RunningLocation { None, Local, Remote } - const pickRunningLocation = (extension: IExtensionDescription): RunningLocation => { - for (const extensionKind of getExtensionKind(extension, this._productService, this._configurationService)) { - if (extensionKind === 'ui') { - if (isInstalledLocally.has(ExtensionIdentifier.toKey(extension.identifier))) { - return RunningLocation.Local; - } - } else if (extensionKind === 'workspace') { - if (isInstalledRemotely.has(ExtensionIdentifier.toKey(extension.identifier))) { - return RunningLocation.Remote; - } - } - } - return RunningLocation.None; - }; - - const runningLocation = new Map(); - localExtensions.forEach(ext => runningLocation.set(ExtensionIdentifier.toKey(ext.identifier), pickRunningLocation(ext))); - remoteEnv.extensions.forEach(ext => runningLocation.set(ExtensionIdentifier.toKey(ext.identifier), pickRunningLocation(ext))); - - // remove non-UI extensions from the local extensions - localExtensions = localExtensions.filter(ext => runningLocation.get(ExtensionIdentifier.toKey(ext.identifier)) === RunningLocation.Local); - - // in case of UI extensions overlap, the local extension wins - remoteEnv.extensions = remoteEnv.extensions.filter(ext => runningLocation.get(ExtensionIdentifier.toKey(ext.identifier)) === RunningLocation.Remote); - - // save for remote extension's init data - this._remoteEnvironment.set(remoteAuthority, remoteEnv); - - await this._startLocalExtensionHost(extensionHost, remoteEnv.extensions.concat(localExtensions), localExtensions.map(extension => extension.identifier)); - } else { - await this._startLocalExtensionHost(extensionHost, localExtensions, localExtensions.map(extension => extension.identifier)); } + + await this._startLocalExtensionHost(localExtensions, remoteAuthority, remoteEnv); } - private async _startLocalExtensionHost(extensionHost: ExtensionHostProcessManager, allExtensions: IExtensionDescription[], localExtensions: ExtensionIdentifier[]): Promise { - this._registerAndHandleExtensions(allExtensions); - extensionHost.start(localExtensions.filter(id => this._registry.containsExtension(id))); - } + private async _startLocalExtensionHost(localExtensions: IExtensionDescription[], remoteAuthority: string | undefined = undefined, remoteEnv: IRemoteAgentEnvironment | null = null): Promise { - private _registerAndHandleExtensions(allExtensions: IExtensionDescription[]): void { - const result = this._registry.deltaExtensions(allExtensions, []); + let remoteExtensions = remoteEnv ? this._checkEnabledAndProposedAPI(remoteEnv.extensions) : []; + + this._runningLocation = determineRunningLocation(this._productService, this._configurationService, localExtensions, remoteExtensions, Boolean(remoteAuthority), this._enableLocalWebWorker); + + // remove non-UI extensions from the local extensions + const localProcessExtensions = filterByRunningLocation(localExtensions, this._runningLocation, ExtensionRunningLocation.LocalProcess); + const localWebWorkerExtensions = filterByRunningLocation(localExtensions, this._runningLocation, ExtensionRunningLocation.LocalWebWorker); + remoteExtensions = filterByRunningLocation(remoteExtensions, this._runningLocation, ExtensionRunningLocation.Remote); + + const result = this._registry.deltaExtensions(remoteExtensions.concat(localProcessExtensions).concat(localWebWorkerExtensions), []); if (result.removedDueToLooping.length > 0) { this._logOrShowMessage(Severity.Error, nls.localize('looping', "The following extensions contain dependency loops and have been disabled: {0}", result.removedDueToLooping.map(e => `'${e.identifier.value}'`).join(', '))); } + if (remoteAuthority && remoteEnv) { + this._remoteInitData.set(remoteAuthority, { + connectionData: this._remoteAuthorityResolverService.getConnectionData(remoteAuthority), + pid: remoteEnv.pid, + appRoot: remoteEnv.appRoot, + appSettingsHome: remoteEnv.appSettingsHome, + extensionHostLogsPath: remoteEnv.extensionHostLogsPath, + globalStorageHome: remoteEnv.globalStorageHome, + userHome: remoteEnv.userHome, + extensions: remoteExtensions, + allExtensions: this._registry.getAllExtensionDescriptions(), + }); + } + this._doHandleExtensionPoints(this._registry.getAllExtensionDescriptions()); + + const localProcessExtensionHost = this._getExtensionHostManager(ExtensionHostKind.LocalProcess)!; + localProcessExtensionHost.start(localProcessExtensions.map(extension => extension.identifier).filter(id => this._registry.containsExtension(id))); + + const localWebWorkerExtensionHost = this._getExtensionHostManager(ExtensionHostKind.LocalWebWorker); + if (localWebWorkerExtensionHost) { + localWebWorkerExtensionHost.start(localWebWorkerExtensions.map(extension => extension.identifier).filter(id => this._registry.containsExtension(id))); + } } public async getInspectPort(tryEnableInspector: boolean): Promise { - if (this._extensionHostProcessManagers.length > 0) { - return this._extensionHostProcessManagers[0].getInspectPort(tryEnableInspector); + const localProcessExtensionHost = this._getExtensionHostManager(ExtensionHostKind.LocalProcess); + if (localProcessExtensionHost) { + return localProcessExtensionHost.getInspectPort(tryEnableInspector); } return 0; } @@ -580,14 +586,15 @@ export class ExtensionService extends AbstractExtensionService implements IExten public _onExtensionHostExit(code: number): void { if (this._isExtensionDevTestFromCli) { // When CLI testing make sure to exit with proper exit code - ipcRenderer.send('vscode:exit', code); + this._electronService.exit(code); } else { // Expected development extension termination: When the extension host goes down we also shutdown the window this._electronService.closeWindow(); } } - private async _handleNoResolverFound(remoteName: string, allExtensions: IExtensionDescription[]): Promise { + private async _handleNoResolverFound(remoteAuthority: string): Promise { + const remoteName = getRemoteName(remoteAuthority); const recommendation = this._productService.remoteExtensionTips?.[remoteName]; if (!recommendation) { return false; @@ -603,9 +610,10 @@ export class ExtensionService extends AbstractExtensionService implements IExten }; const resolverExtensionId = recommendation.extensionId; + const allExtensions = await this._scanAllLocalExtensions(); const extension = allExtensions.filter(e => e.identifier.value === resolverExtensionId)[0]; if (extension) { - if (this._isDisabled(extension)) { + if (!this._isEnabled(extension)) { const message = nls.localize('enableResolver', "Extension '{0}' is required to open the remote window.\nOK to enable?", recommendation.friendlyName); this._notificationService.prompt(Severity.Info, message, [{ @@ -645,27 +653,59 @@ export class ExtensionService extends AbstractExtensionService implements IExten } return true; - } } -function remove(arr: IExtensionDescription[], predicate: (item: IExtensionDescription) => boolean): IExtensionDescription[]; -function remove(arr: IExtensionDescription[], toRemove: IExtensionDescription[]): IExtensionDescription[]; -function remove(arr: IExtensionDescription[], arg2: ((item: IExtensionDescription) => boolean) | IExtensionDescription[]): IExtensionDescription[] { - if (typeof arg2 === 'function') { - return _removePredicate(arr, arg2); - } - return _removeSet(arr, arg2); +const enum ExtensionRunningLocation { + None, + LocalProcess, + LocalWebWorker, + Remote } -function _removePredicate(arr: IExtensionDescription[], predicate: (item: IExtensionDescription) => boolean): IExtensionDescription[] { - return arr.filter(extension => !predicate(extension)); +function determineRunningLocation(productService: IProductService, configurationService: IConfigurationService, localExtensions: IExtensionDescription[], remoteExtensions: IExtensionDescription[], hasRemote: boolean, hasLocalWebWorker: boolean): Map { + const localExtensionsSet = new Set(); + localExtensions.forEach(ext => localExtensionsSet.add(ExtensionIdentifier.toKey(ext.identifier))); + + const remoteExtensionsSet = new Set(); + remoteExtensions.forEach(ext => remoteExtensionsSet.add(ExtensionIdentifier.toKey(ext.identifier))); + + const pickRunningLocation = (extension: IExtensionDescription): ExtensionRunningLocation => { + const isInstalledLocally = localExtensionsSet.has(ExtensionIdentifier.toKey(extension.identifier)); + const isInstalledRemotely = remoteExtensionsSet.has(ExtensionIdentifier.toKey(extension.identifier)); + for (const extensionKind of getExtensionKind(extension, productService, configurationService)) { + if (extensionKind === 'ui' && isInstalledLocally) { + // ui extensions run locally if possible + return ExtensionRunningLocation.LocalProcess; + } + if (extensionKind === 'workspace' && isInstalledRemotely) { + // workspace extensions run remotely if possible + return ExtensionRunningLocation.Remote; + } + if (extensionKind === 'workspace' && !hasRemote) { + // workspace extensions also run locally if there is no remote + return ExtensionRunningLocation.LocalProcess; + } + if (extensionKind === 'web' && isInstalledLocally && hasLocalWebWorker) { + // web worker extensions run in the local web worker if possible + if (typeof extension.browser !== 'undefined') { + // The "browser" field determines the entry point + (extension).main = extension.browser; + } + return ExtensionRunningLocation.LocalWebWorker; + } + } + return ExtensionRunningLocation.None; + }; + + const runningLocation = new Map(); + localExtensions.forEach(ext => runningLocation.set(ExtensionIdentifier.toKey(ext.identifier), pickRunningLocation(ext))); + remoteExtensions.forEach(ext => runningLocation.set(ExtensionIdentifier.toKey(ext.identifier), pickRunningLocation(ext))); + return runningLocation; } -function _removeSet(arr: IExtensionDescription[], toRemove: IExtensionDescription[]): IExtensionDescription[] { - const toRemoveSet = new Set(); - toRemove.forEach(extension => toRemoveSet.add(ExtensionIdentifier.toKey(extension.identifier))); - return arr.filter(extension => !toRemoveSet.has(ExtensionIdentifier.toKey(extension.identifier))); +function filterByRunningLocation(extensions: IExtensionDescription[], runningLocation: Map, desiredRunningLocation: ExtensionRunningLocation): IExtensionDescription[] { + return extensions.filter(ext => runningLocation.get(ExtensionIdentifier.toKey(ext.identifier)) === desiredRunningLocation); } registerSingleton(IExtensionService, ExtensionService); @@ -689,4 +729,4 @@ class RestartExtensionHostAction extends Action { } const registry = Registry.as(ActionExtensions.WorkbenchActions); -registry.registerWorkbenchAction(SyncActionDescriptor.from(RestartExtensionHostAction), 'Developer: Restart Extension Host', nls.localize('developer', "Developer")); +registry.registerWorkbenchAction(SyncActionDescriptor.from(RestartExtensionHostAction), 'Developer: Restart Extension Host', nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer")); diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts similarity index 88% rename from src/vs/workbench/services/extensions/electron-browser/extensionHost.ts rename to src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts index 0006c2111c3..172a8c6817f 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts @@ -37,7 +37,7 @@ import { IExtensionDescription } from 'vs/platform/extensions/common/extensions' import { parseExtensionDevOptions } from '../common/extensionDevOptions'; import { VSBuffer } from 'vs/base/common/buffer'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; -import { IExtensionHostStarter, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionHost, ExtensionHostLogFileName, ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; import { isUntitledWorkspace } from 'vs/platform/workspaces/common/workspaces'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { joinPath } from 'vs/base/common/resources'; @@ -45,7 +45,19 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -export class ExtensionHostProcessWorker implements IExtensionHostStarter { +export interface ILocalProcessExtensionHostInitData { + readonly autoStart: boolean; + readonly extensions: IExtensionDescription[]; +} + +export interface ILocalProcessExtensionHostDataProvider { + getInitData(): Promise; +} + +export class LocalProcessExtensionHost implements IExtensionHost { + + public readonly kind = ExtensionHostKind.LocalProcess; + public readonly remoteAuthority = null; private readonly _onExit: Emitter<[number, string]> = new Emitter<[number, string]>(); public readonly onExit: Event<[number, string]> = this._onExit.event; @@ -73,9 +85,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { private readonly _extensionHostLogFile: URI; constructor( - private readonly _autoStart: boolean, - private readonly _extensions: Promise, - private readonly _extensionHostLogsLocation: URI, + private readonly _initDataProvider: ILocalProcessExtensionHostDataProvider, @IWorkspaceContextService private readonly _contextService: IWorkspaceContextService, @INotificationService private readonly _notificationService: INotificationService, @IElectronService private readonly _electronService: IElectronService, @@ -103,7 +113,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { this._extensionHostConnection = null; this._messageProtocol = null; - this._extensionHostLogFile = joinPath(this._extensionHostLogsLocation, `${ExtensionHostLogFileName}.log`); + this._extensionHostLogFile = joinPath(this._environmentService.extHostLogsPath, `${ExtensionHostLogFileName}.log`); this._toDispose.add(this._onExit); this._toDispose.add(this._lifecycleService.onWillShutdown(e => this._onWillShutdown(e))); @@ -410,51 +420,48 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { }); } - private _createExtHostInitData(): Promise { - return Promise.all([this._telemetryService.getTelemetryInfo(), this._extensions]) - .then(([telemetryInfo, extensionDescriptions]) => { - const workspace = this._contextService.getWorkspace(); - const r: IInitData = { - commit: this._productService.commit, - version: this._productService.version, - parentPid: process.pid, - environment: { - isExtensionDevelopmentDebug: this._isExtensionDevDebug, - appRoot: this._environmentService.appRoot ? URI.file(this._environmentService.appRoot) : undefined, - appSettingsHome: this._environmentService.appSettingsHome ? this._environmentService.appSettingsHome : undefined, - appName: this._productService.nameLong, - appUriScheme: this._productService.urlProtocol, - appLanguage: platform.language, - extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, - extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, - globalStorageHome: URI.file(this._environmentService.globalStorageHome), - userHome: this._environmentService.userHome, - webviewResourceRoot: this._environmentService.webviewResourceRoot, - webviewCspSource: this._environmentService.webviewCspSource, - }, - workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? undefined : { - configuration: withNullAsUndefined(workspace.configuration), - id: workspace.id, - name: this._labelService.getWorkspaceLabel(workspace), - isUntitled: workspace.configuration ? isUntitledWorkspace(workspace.configuration, this._environmentService) : false - }, - remote: { - authority: this._environmentService.configuration.remoteAuthority, - connectionData: null, - isRemote: false - }, - resolvedExtensions: [], - hostExtensions: [], - extensions: extensionDescriptions, - telemetryInfo, - logLevel: this._logService.getLevel(), - logsLocation: this._extensionHostLogsLocation, - logFile: this._extensionHostLogFile, - autoStart: this._autoStart, - uiKind: UIKind.Desktop - }; - return r; - }); + private async _createExtHostInitData(): Promise { + const [telemetryInfo, initData] = await Promise.all([this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]); + const workspace = this._contextService.getWorkspace(); + return { + commit: this._productService.commit, + version: this._productService.version, + parentPid: process.pid, + environment: { + isExtensionDevelopmentDebug: this._isExtensionDevDebug, + appRoot: this._environmentService.appRoot ? URI.file(this._environmentService.appRoot) : undefined, + appSettingsHome: this._environmentService.appSettingsHome ? this._environmentService.appSettingsHome : undefined, + appName: this._productService.nameLong, + appUriScheme: this._productService.urlProtocol, + appLanguage: platform.language, + extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, + extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, + globalStorageHome: URI.file(this._environmentService.globalStorageHome), + userHome: this._environmentService.userHome, + webviewResourceRoot: this._environmentService.webviewResourceRoot, + webviewCspSource: this._environmentService.webviewCspSource, + }, + workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? undefined : { + configuration: withNullAsUndefined(workspace.configuration), + id: workspace.id, + name: this._labelService.getWorkspaceLabel(workspace), + isUntitled: workspace.configuration ? isUntitledWorkspace(workspace.configuration, this._environmentService) : false + }, + remote: { + authority: this._environmentService.configuration.remoteAuthority, + connectionData: null, + isRemote: false + }, + resolvedExtensions: [], + hostExtensions: [], + extensions: initData.extensions, + telemetryInfo, + logLevel: this._logService.getLevel(), + logsLocation: this._environmentService.extHostLogsPath, + logFile: this._extensionHostLogFile, + autoStart: initData.autoStart, + uiKind: UIKind.Desktop + }; } private _logExtensionHostMessage(entry: IRemoteConsoleLog) { diff --git a/src/vs/workbench/services/extensions/worker/extHost.services.ts b/src/vs/workbench/services/extensions/worker/extHost.services.ts index 100864519dc..564c71149e5 100644 --- a/src/vs/workbench/services/extensions/worker/extHost.services.ts +++ b/src/vs/workbench/services/extensions/worker/extHost.services.ts @@ -22,6 +22,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { ExtHostLogService } from 'vs/workbench/api/worker/extHostLogService'; import { IExtHostTunnelService, ExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; import { IExtHostApiDeprecationService, ExtHostApiDeprecationService, } from 'vs/workbench/api/common/extHostApiDeprecationService'; +import { IExtHostWindow, ExtHostWindow } from 'vs/workbench/api/common/extHostWindow'; import { NotImplementedProxy } from 'vs/base/common/types'; // register singleton services @@ -29,6 +30,7 @@ registerSingleton(ILogService, ExtHostLogService); registerSingleton(IExtHostApiDeprecationService, ExtHostApiDeprecationService); registerSingleton(IExtHostOutputService, ExtHostOutputService); registerSingleton(IExtHostWorkspace, ExtHostWorkspace); +registerSingleton(IExtHostWindow, ExtHostWindow); registerSingleton(IExtHostDecorations, ExtHostDecorations); registerSingleton(IExtHostConfiguration, ExtHostConfiguration); registerSingleton(IExtHostCommands, ExtHostCommands); diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index 0d1e2c3f021..1c560e38b83 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -9,7 +9,7 @@ import { ITextEditorOptions, IResourceEditorInput, TextEditorSelectionRevealType import { IEditorInput, IEditorPane, Extensions as EditorExtensions, EditorInput, IEditorCloseEvent, IEditorInputFactoryRegistry, toResource, IEditorIdentifier, GroupIdentifier, EditorsOrder, SideBySideEditor } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; -import { FileChangesEvent, IFileService, FileChangeType } from 'vs/platform/files/common/files'; +import { FileChangesEvent, IFileService, FileChangeType, FILES_EXCLUDE_CONFIG } from 'vs/platform/files/common/files'; import { Selection } from 'vs/editor/common/core/selection'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -19,7 +19,7 @@ import { Event } from 'vs/base/common/event'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { getCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { createResourceExcludeMatcher } from 'vs/workbench/services/search/common/search'; +import { getExcludes, ISearchConfiguration, SEARCH_EXCLUDE_CONFIG } from 'vs/workbench/services/search/common/search'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; @@ -32,6 +32,9 @@ import { addDisposableListener, EventType, EventHelper } from 'vs/base/browser/d import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { Schemas } from 'vs/base/common/network'; import { onUnexpectedError } from 'vs/base/common/errors'; +import { extUri } from 'vs/base/common/resources'; +import { IdleValue } from 'vs/base/common/async'; +import { ResourceGlobMatcher } from 'vs/workbench/common/resources'; /** * Stores the selection & view state of an editor and allows to compare it to other selection states. @@ -127,7 +130,6 @@ export class HistoryService extends Disposable implements IHistoryService { this._register(this.editorService.onDidCloseEditor(event => this.onEditorClosed(event))); this._register(this.storageService.onWillSaveState(() => this.saveState())); this._register(this.fileService.onDidFilesChange(event => this.onDidFilesChange(event))); - this._register(this.resourceExcludeMatcher.onExpressionChange(() => this.removeExcludedFromHistory())); this._register(this.editorService.onDidMostRecentlyActiveEditorsChange(() => this.handleEditorEventInRecentEditorsStack())); // if the service is created late enough that an editor is already opened @@ -577,7 +579,7 @@ export class HistoryService extends Disposable implements IHistoryService { const resourceEditorInputA = arg1 as IResourceEditorInput; const resourceEditorInputB = inputB as IResourceEditorInput; - return resourceEditorInputA && resourceEditorInputB && resourceEditorInputA.resource.toString() === resourceEditorInputB.resource.toString(); + return resourceEditorInputA && resourceEditorInputB && extUri.isEqual(resourceEditorInputA.resource, resourceEditorInputB.resource); } private matchesFile(resource: URI, arg2: IEditorInput | IResourceEditorInput | FileChangesEvent): boolean { @@ -595,12 +597,12 @@ export class HistoryService extends Disposable implements IHistoryService { return false; // make sure to only check this when workbench has restored (for https://github.com/Microsoft/vscode/issues/48275) } - return inputResource.toString() === resource.toString(); + return extUri.isEqual(inputResource, resource); } const resourceEditorInput = arg2 as IResourceEditorInput; - return resourceEditorInput?.resource.toString() === resource.toString(); + return extUri.isEqual(resourceEditorInput?.resource, resource); } //#endregion @@ -632,7 +634,7 @@ export class HistoryService extends Disposable implements IHistoryService { if (URI.isUri(editorResource)) { associatedResources.push(editorResource); } else if (editorResource) { - associatedResources.push(...coalesce([editorResource.master, editorResource.detail])); + associatedResources.push(...coalesce([editorResource.primary, editorResource.secondary])); } // Remove from list of recently closed before... @@ -768,7 +770,17 @@ export class HistoryService extends Disposable implements IHistoryService { private history: Array | undefined = undefined; - private readonly resourceExcludeMatcher = this._register(createResourceExcludeMatcher(this.instantiationService, this.configurationService)); + private readonly resourceExcludeMatcher = this._register(new IdleValue(() => { + const matcher = this._register(this.instantiationService.createInstance( + ResourceGlobMatcher, + root => getExcludes(root ? this.configurationService.getValue({ resource: root }) : this.configurationService.getValue()) || Object.create(null), + event => event.affectsConfiguration(FILES_EXCLUDE_CONFIG) || event.affectsConfiguration(SEARCH_EXCLUDE_CONFIG) + )); + + this._register(matcher.onExpressionChange(() => this.removeExcludedFromHistory())); + + return matcher; + })); private handleEditorEventInHistory(editor?: IEditorPane): void { @@ -804,7 +816,7 @@ export class HistoryService extends Disposable implements IHistoryService { const resourceEditorInput = input as IResourceEditorInput; - return !this.resourceExcludeMatcher.matches(resourceEditorInput.resource); + return !this.resourceExcludeMatcher.value.matches(resourceEditorInput.resource); } private removeExcludedFromHistory(): void { diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index 28dfed02084..c4f72f05518 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -174,8 +174,8 @@ export class BrowserHostService extends Disposable implements IHostService { // New Window: open into empty window else { const environment = new Map(); - environment.set('diffFileDetail', editors[0].resource.toString()); - environment.set('diffFileMaster', editors[1].resource.toString()); + environment.set('diffFileSecondary', editors[0].resource.toString()); + environment.set('diffFilePrimary', editors[1].resource.toString()); this.workspaceProvider.open(undefined, { payload: Array.from(environment.entries()) }); } @@ -283,7 +283,7 @@ export class BrowserHostService extends Disposable implements IHostService { } private async doOpenEmptyWindow(options?: IOpenEmptyWindowOptions): Promise { - this.workspaceProvider.open(undefined, { reuse: options?.forceReuseWindow }); + return this.workspaceProvider.open(undefined, { reuse: options?.forceReuseWindow }); } async toggleFullScreen(): Promise { diff --git a/src/vs/workbench/services/hover/browser/hover.ts b/src/vs/workbench/services/hover/browser/hover.ts new file mode 100644 index 00000000000..a504b379d65 --- /dev/null +++ b/src/vs/workbench/services/hover/browser/hover.ts @@ -0,0 +1,112 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; + +export const IHoverService = createDecorator('hoverService'); + +/** + * Enables the convenient display of rich markdown-based hovers in the workbench. + */ +export interface IHoverService { + readonly _serviceBrand: undefined; + + /** + * Shows a hover, provided a hover with the same options object is not already visible. + * @param options A set of options defining the characteristics of the hover. + * @param focus Whether to focus the hover (useful for keyboard accessibility). + * + * **Example:** A simple usage with a single element target. + * + * ```typescript + * showHover({ + * text: new MarkdownString('Hello world'), + * target: someElement + * }); + * ``` + */ + showHover(options: IHoverOptions, focus?: boolean): void; + + /** + * Hides the hover if it was visible. + */ + hideHover(): void; +} + +export interface IHoverOptions { + /** + * The text to display in the primary section of the hover. + */ + text: IMarkdownString; + + /** + * The target for the hover. This determines the position of the hover and it will only be + * hidden when the mouse leaves both the hover and the target. A HTMLElement can be used for + * simple cases and a IHoverTarget for more complex cases where multiple elements and/or a + * dispose method is required. + */ + target: IHoverTarget | HTMLElement; + + /** + * A set of actions for the hover's "status bar". + */ + actions?: IHoverAction[]; + + /** + * An optional array of classes to add to the hover element. + */ + additionalClasses?: string[]; + + /** + * An optional link handler for markdown links, if this is not provided the IOpenerService will + * be used to open the links using its default options. + */ + linkHandler?(url: string): void; + + /** + * Whether to hide the hover when the mouse leaves the `target` and enters the actual hover. + * This is false by default and note that it will be ignored if any `actions` are provided such + * that they are accessible. + */ + hideOnHover?: boolean; +} + +export interface IHoverAction { + /** + * The label to use in the hover's status bar. + */ + label: string; + + /** + * The command ID of the action, this is used to resolve the keybinding to display after the + * action label. + */ + commandId: string; + + /** + * An optional class of an icon that will be displayed before the label. + */ + iconClass?: string; + + /** + * The callback to run the action. + * @param target The action element that was activated. + */ + run(target: HTMLElement): void; +} + +/** + * A target for a hover. + */ +export interface IHoverTarget extends IDisposable { + /** + * A set of target elements used to position the hover. If multiple elements are used the hover + * will try to not overlap any target element. An example use case for this is show a hover for + * wrapped text. + */ + readonly targetElements: readonly HTMLElement[]; +} diff --git a/src/vs/workbench/services/hover/browser/hoverService.ts b/src/vs/workbench/services/hover/browser/hoverService.ts new file mode 100644 index 00000000000..a025f1ddb70 --- /dev/null +++ b/src/vs/workbench/services/hover/browser/hoverService.ts @@ -0,0 +1,111 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/hover'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorHoverBackground, editorHoverBorder, textLinkForeground, editorHoverForeground, editorHoverStatusBarBackground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; +import { IHoverService, IHoverOptions } from 'vs/workbench/services/hover/browser/hover'; +import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { HoverWidget } from 'vs/workbench/services/hover/browser/hoverWidget'; +import { IContextViewProvider, IDelegate } from 'vs/base/browser/ui/contextview/contextview'; + +export class HoverService implements IHoverService { + declare readonly _serviceBrand: undefined; + + private _currentHoverOptions: IHoverOptions | undefined; + + constructor( + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IContextViewService private readonly _contextViewService: IContextViewService + ) { + } + + showHover(options: IHoverOptions, focus?: boolean): void { + if (this._currentHoverOptions === options) { + return; + } + this._currentHoverOptions = options; + + const hover = this._instantiationService.createInstance(HoverWidget, options); + hover.onDispose(() => this._currentHoverOptions = undefined); + const provider = this._contextViewService as IContextViewProvider; + provider.showContextView(new HoverContextViewDelegate(hover, focus)); + hover.onRequestLayout(() => provider.layout()); + } + + hideHover(): void { + if (!this._currentHoverOptions) { + return; + } + this._currentHoverOptions = undefined; + this._contextViewService.hideContextView(); + } +} + +class HoverContextViewDelegate implements IDelegate { + + get anchorPosition() { + return this._hover.anchor; + } + + constructor( + private readonly _hover: HoverWidget, + private readonly _focus: boolean = false + ) { + } + + render(container: HTMLElement) { + this._hover.render(container); + if (this._focus) { + this._hover.focus(); + } + return this._hover; + } + + getAnchor() { + return { + x: this._hover.x, + y: this._hover.y + }; + } + + layout() { + this._hover.layout(); + } +} + +registerSingleton(IHoverService, HoverService, true); + +registerThemingParticipant((theme, collector) => { + const hoverBackground = theme.getColor(editorHoverBackground); + if (hoverBackground) { + collector.addRule(`.monaco-workbench .workbench-hover { background-color: ${hoverBackground}; }`); + } + const hoverBorder = theme.getColor(editorHoverBorder); + if (hoverBorder) { + collector.addRule(`.monaco-workbench .workbench-hover { border: 1px solid ${hoverBorder}; }`); + collector.addRule(`.monaco-workbench .workbench-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + collector.addRule(`.monaco-workbench .workbench-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + collector.addRule(`.monaco-workbench .workbench-hover hr { border-bottom: 0px solid ${hoverBorder.transparent(0.5)}; }`); + } + const link = theme.getColor(textLinkForeground); + if (link) { + collector.addRule(`.monaco-workbench .workbench-hover a { color: ${link}; }`); + } + const hoverForeground = theme.getColor(editorHoverForeground); + if (hoverForeground) { + collector.addRule(`.monaco-workbench .workbench-hover { color: ${hoverForeground}; }`); + } + const actionsBackground = theme.getColor(editorHoverStatusBarBackground); + if (actionsBackground) { + collector.addRule(`.monaco-workbench .workbench-hover .hover-row .actions { background-color: ${actionsBackground}; }`); + } + const codeBackground = theme.getColor(textCodeBlockBackground); + if (codeBackground) { + collector.addRule(`.monaco-workbench .workbench-hover code { background-color: ${codeBackground}; }`); + } +}); diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/hoverWidget.ts b/src/vs/workbench/services/hover/browser/hoverWidget.ts similarity index 50% rename from src/vs/workbench/contrib/terminal/browser/widgets/hoverWidget.ts rename to src/vs/workbench/services/hover/browser/hoverWidget.ts index 5a5e1d5e307..702e4e5143b 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/hoverWidget.ts +++ b/src/vs/workbench/services/hover/browser/hoverWidget.ts @@ -4,19 +4,18 @@ *--------------------------------------------------------------------------------------------*/ import { DisposableStore } from 'vs/base/common/lifecycle'; -import { IMarkdownString } from 'vs/base/common/htmlContent'; import { renderMarkdown } from 'vs/base/browser/markdownRenderer'; import { Event, Emitter } from 'vs/base/common/event'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { editorHoverHighlight, editorHoverBackground, editorHoverBorder, textLinkForeground, editorHoverForeground, editorHoverStatusBarBackground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; import * as dom from 'vs/base/browser/dom'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IHoverTarget, HorizontalAnchorSide, VerticalAnchorSide } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; +import { IHoverTarget, IHoverOptions } from 'vs/workbench/services/hover/browser/hover'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { HoverWidget as BaseHoverWidget, renderHoverAction } from 'vs/base/browser/ui/hover/hoverWidget'; import { Widget } from 'vs/base/browser/ui/widget'; +import { AnchorPosition } from 'vs/base/browser/ui/contextview/contextview'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; const $ = dom.$; @@ -25,28 +24,44 @@ export class HoverWidget extends Widget { private readonly _mouseTracker: CompositeMouseTracker; private readonly _hover: BaseHoverWidget; + private readonly _target: IHoverTarget; + private readonly _linkHandler: (url: string) => any; private _isDisposed: boolean = false; + private _anchor: AnchorPosition = AnchorPosition.ABOVE; + private _x: number = 0; + private _y: number = 0; get isDisposed(): boolean { return this._isDisposed; } get domNode(): HTMLElement { return this._hover.containerDomNode; } - private readonly _onDispose = new Emitter(); + private readonly _onDispose = this._register(new Emitter()); get onDispose(): Event { return this._onDispose.event; } + private readonly _onRequestLayout = this._register(new Emitter()); + get onRequestLayout(): Event { return this._onRequestLayout.event; } + + get anchor(): AnchorPosition { return this._anchor; } + get x(): number { return this._x; } + get y(): number { return this._y; } constructor( - private _container: HTMLElement, - private _target: IHoverTarget, - private _text: IMarkdownString, - private _linkHandler: (url: string) => void, - private _actions: { label: string, iconClass?: string, run: (target: HTMLElement) => void, commandId: string }[] | undefined, + options: IHoverOptions, @IKeybindingService private readonly _keybindingService: IKeybindingService, - @IConfigurationService private readonly _configurationService: IConfigurationService + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IOpenerService private readonly _openerService: IOpenerService ) { super(); + this._linkHandler = options.linkHandler || this._openerService.open; + + this._target = 'targetElements' in options.target ? options.target : new ElementHoverTarget(options.target); + this._hover = this._register(new BaseHoverWidget()); - this._hover.containerDomNode.classList.add('terminal-hover-widget', 'fadeIn', 'xterm-hover'); + + this._hover.containerDomNode.classList.add('workbench-hover', 'fadeIn'); + if (options.additionalClasses) { + this._hover.containerDomNode.classList.add(...options.additionalClasses); + } // Don't allow mousedown out of the widget, otherwise preventDefault will call and text will // not be selected. @@ -61,7 +76,7 @@ export class HoverWidget extends Widget { const rowElement = $('div.hover-row.markdown-hover'); const contentsElement = $('div.hover-contents'); - const markdownElement = renderMarkdown(this._text, { + const markdownElement = renderMarkdown(options.text, { actionHandler: { callback: (content) => this._linkHandler(content), disposeables: this._messageListeners @@ -72,75 +87,74 @@ export class HoverWidget extends Widget { }, codeBlockRenderCallback: () => { contentsElement.classList.add('code-hover-contents'); - this.layout(); + // This changes the dimensions of the hover so trigger a layout + this._onRequestLayout.fire(); } }); contentsElement.appendChild(markdownElement); rowElement.appendChild(contentsElement); this._hover.contentsDomNode.appendChild(rowElement); - if (this._actions && this._actions.length > 0) { + if (options.actions && options.actions.length > 0) { const statusBarElement = $('div.hover-row.status-bar'); const actionsElement = $('div.actions'); - this._actions.forEach(action => { + options.actions.forEach(action => { const keybinding = this._keybindingService.lookupKeybinding(action.commandId); const keybindingLabel = keybinding ? keybinding.getLabel() : null; - renderHoverAction(actionsElement, action, keybindingLabel); + renderHoverAction(actionsElement, { + label: action.label, + commandId: action.commandId, + run: e => { + action.run(e); + this.dispose(); + }, + iconClass: action.iconClass + }, keybindingLabel); }); statusBarElement.appendChild(actionsElement); this._hover.containerDomNode.appendChild(statusBarElement); } - this._mouseTracker = new CompositeMouseTracker([this._hover.containerDomNode, ..._target.targetElements]); + const mouseTrackerTargets = [...this._target.targetElements]; + if (!options.hideOnHover || (options.actions && options.actions.length > 0)) { + mouseTrackerTargets.push(this._hover.containerDomNode); + } + this._mouseTracker = new CompositeMouseTracker(mouseTrackerTargets); this._register(this._mouseTracker.onMouseOut(() => this.dispose())); this._register(this._mouseTracker); + } - this._container.appendChild(this._hover.containerDomNode); + public render(container?: HTMLElement): void { + if (this._hover.containerDomNode.parentElement !== container) { + container?.appendChild(this._hover.containerDomNode); + } this.layout(); } - public layout(): void { - const anchor = this._target.anchor; - + public layout() { this._hover.containerDomNode.classList.remove('right-aligned'); this._hover.contentsDomNode.style.maxHeight = ''; - if (anchor.horizontalAnchorSide === HorizontalAnchorSide.Left) { - if (anchor.x + this._hover.containerDomNode.clientWidth > document.documentElement.clientWidth) { - // Shift the hover to the left when part of it would get cut off - const width = Math.round(this._hover.containerDomNode.clientWidth); - this._hover.containerDomNode.style.width = `${width - 1}px`; - this._hover.containerDomNode.style.maxWidth = ''; - const left = document.documentElement.clientWidth - width - 1; - this._hover.containerDomNode.style.left = `${left}px`; - // Right align if the right edge is closer to the anchor than the left edge - if (left + width / 2 < anchor.x) { - this._hover.containerDomNode.classList.add('right-aligned'); - } - } else { - this._hover.containerDomNode.style.width = ''; - this._hover.containerDomNode.style.maxWidth = `${document.documentElement.clientWidth - anchor.x - 1}px`; - this._hover.containerDomNode.style.left = `${anchor.x}px`; - } + + // Get horizontal alignment and position + const targetBounds = this._target.targetElements.map(e => e.getBoundingClientRect()); + const targetLeft = Math.min(...targetBounds.map(e => e.left)); + if (targetLeft + this._hover.containerDomNode.clientWidth >= document.documentElement.clientWidth) { + this._x = document.documentElement.clientWidth; + this._hover.containerDomNode.classList.add('right-aligned'); } else { - this._hover.containerDomNode.style.right = `${anchor.x}px`; + this._x = targetLeft; } - // Use fallback y value if there is not enough vertical space - if (anchor.verticalAnchorSide === VerticalAnchorSide.Bottom) { - if (anchor.y + this._hover.containerDomNode.clientHeight > document.documentElement.clientHeight) { - this._hover.containerDomNode.style.top = `${anchor.fallbackY}px`; - this._hover.contentsDomNode.style.maxHeight = `${document.documentElement.clientHeight - anchor.fallbackY}px`; - } else { - this._hover.containerDomNode.style.bottom = `${anchor.y}px`; - this._hover.containerDomNode.style.maxHeight = ''; - } + + // Get vertical alignment and position + const targetTop = Math.min(...targetBounds.map(e => e.top)); + if (targetTop - this._hover.containerDomNode.clientHeight < 0) { + this._anchor = AnchorPosition.BELOW; + this._y = Math.max(...targetBounds.map(e => e.bottom)) - 2; } else { - if (anchor.y + this._hover.containerDomNode.clientHeight > document.documentElement.clientHeight) { - this._hover.containerDomNode.style.bottom = `${anchor.fallbackY}px`; - } else { - this._hover.containerDomNode.style.top = `${anchor.y}px`; - } + this._y = targetTop; } + this._hover.onContentsChanged(); } @@ -210,40 +224,15 @@ class CompositeMouseTracker extends Widget { } } +class ElementHoverTarget implements IHoverTarget { + readonly targetElements: readonly HTMLElement[]; -registerThemingParticipant((theme, collector) => { - let editorHoverHighlightColor = theme.getColor(editorHoverHighlight); - if (editorHoverHighlightColor) { - if (editorHoverHighlightColor.isOpaque()) { - editorHoverHighlightColor = editorHoverHighlightColor.transparent(0.5); - } - collector.addRule(`.integrated-terminal .hoverHighlight { background-color: ${editorHoverHighlightColor}; }`); + constructor( + private _element: HTMLElement + ) { + this.targetElements = [this._element]; } - const hoverBackground = theme.getColor(editorHoverBackground); - if (hoverBackground) { - collector.addRule(`.integrated-terminal .monaco-hover { background-color: ${hoverBackground}; }`); + + dispose(): void { } - const hoverBorder = theme.getColor(editorHoverBorder); - if (hoverBorder) { - collector.addRule(`.integrated-terminal .monaco-hover { border: 1px solid ${hoverBorder}; }`); - collector.addRule(`.integrated-terminal .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); - collector.addRule(`.integrated-terminal .monaco-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); - collector.addRule(`.integrated-terminal .monaco-hover hr { border-bottom: 0px solid ${hoverBorder.transparent(0.5)}; }`); - } - const link = theme.getColor(textLinkForeground); - if (link) { - collector.addRule(`.integrated-terminal .monaco-hover a { color: ${link}; }`); - } - const hoverForeground = theme.getColor(editorHoverForeground); - if (hoverForeground) { - collector.addRule(`.integrated-terminal .monaco-hover { color: ${hoverForeground}; }`); - } - const actionsBackground = theme.getColor(editorHoverStatusBarBackground); - if (actionsBackground) { - collector.addRule(`.integrated-terminal .monaco-hover .hover-row .actions { background-color: ${actionsBackground}; }`); - } - const codeBackground = theme.getColor(textCodeBlockBackground); - if (codeBackground) { - collector.addRule(`.integrated-terminal .monaco-hover code { background-color: ${codeBackground}; }`); - } -}); +} diff --git a/src/vs/workbench/services/hover/browser/media/hover.css b/src/vs/workbench/services/hover/browser/media/hover.css new file mode 100644 index 00000000000..47d8ab484c6 --- /dev/null +++ b/src/vs/workbench/services/hover/browser/media/hover.css @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-workbench .workbench-hover { + position: relative; + font-size: 14px; + line-height: 19px; + animation: fadein 100ms linear; + /* Must be higher than sash's z-index and terminal canvases */ + z-index: 40; + overflow: hidden; + max-width: 700px; +} + +.monaco-workbench .workbench-hover a { + color: #3794ff; +} + +.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions { + flex-direction: row-reverse; +} + +.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions .action-container { + margin-right: 0; + margin-left: 16px; +} diff --git a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts index 3b789cbce4e..e6621b9d06b 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts @@ -6,6 +6,7 @@ import { localize } from 'vs/nls'; import { Queue } from 'vs/base/common/async'; import * as json from 'vs/base/common/json'; +import * as objects from 'vs/base/common/objects'; import { setProperty } from 'vs/base/common/jsonEdit'; import { Edit } from 'vs/base/common/jsonFormatter'; import { Disposable, IReference } from 'vs/base/common/lifecycle'; @@ -143,7 +144,11 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding const eol = model.getEOL(); const key = keybindingItem.resolvedKeybinding ? keybindingItem.resolvedKeybinding.getUserSettingsLabel() : null; if (key) { - this.applyEditsToBuffer(setProperty(model.getValue(), [-1], this.asObject(key, keybindingItem.command, keybindingItem.when ? keybindingItem.when.serialize() : undefined, true), { tabSize, insertSpaces, eol })[0], model); + const entry: IUserFriendlyKeybinding = this.asObject(key, keybindingItem.command, keybindingItem.when ? keybindingItem.when.serialize() : undefined, true); + const userKeybindingEntries = json.parse(model.getValue()); + if (userKeybindingEntries.every(e => !this.areSame(e, entry))) { + this.applyEditsToBuffer(setProperty(model.getValue(), [-1], entry, { tabSize, insertSpaces, eol })[0], model); + } } } @@ -196,6 +201,26 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding return object; } + private areSame(a: IUserFriendlyKeybinding, b: IUserFriendlyKeybinding): boolean { + if (a.command !== b.command) { + return false; + } + if (a.key !== b.key) { + return false; + } + const whenA = ContextKeyExpr.deserialize(a.when); + const whenB = ContextKeyExpr.deserialize(b.when); + if ((whenA && !whenB) || (!whenA && whenB)) { + return false; + } + if (whenA && whenB && !whenA.equals(whenB)) { + return false; + } + if (!objects.equals(a.args, b.args)) { + return false; + } + return true; + } private applyEditsToBuffer(edit: Edit, model: ITextModel): void { const startPosition = model.getPositionAt(edit.offset); @@ -206,7 +231,6 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding model.pushEditOperations([new Selection(startPosition.lineNumber, startPosition.column, startPosition.lineNumber, startPosition.column)], [editOperation], () => []); } - private resolveModelReference(): Promise> { return this.fileService.exists(this.resource) .then(exists => { diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index 0fd8abac93b..cd493c726b6 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -220,6 +220,16 @@ suite('KeybindingsEditing', () => { .then(() => assert.deepEqual(getUserKeybindings(), expected)); }); + test('remove a default keybinding should not ad duplicate entries', async () => { + const expected: IUserFriendlyKeybinding[] = [{ key: 'alt+c', command: '-a' }]; + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + assert.deepEqual(getUserKeybindings(), expected); + }); + test('remove a user keybinding', () => { writeToKeybindingsFile({ key: 'alt+c', command: 'b' }); return testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'b', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } }, isDefault: false })) diff --git a/src/vs/workbench/services/log/browser/indexedDBLogProvider.ts b/src/vs/workbench/services/log/browser/indexedDBLogProvider.ts deleted file mode 100644 index 16264dd5851..00000000000 --- a/src/vs/workbench/services/log/browser/indexedDBLogProvider.ts +++ /dev/null @@ -1,96 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { KeyValueLogProvider } from 'vs/workbench/services/log/common/keyValueLogProvider'; - -export const INDEXEDDB_VSCODE_DB = 'vscode-web-db'; -export const INDEXEDDB_LOGS_OBJECT_STORE = 'vscode-logs-store'; - -export class IndexedDBLogProvider extends KeyValueLogProvider { - - readonly database: Promise; - - constructor(scheme: string) { - super(scheme); - this.database = this.openDatabase(1); - } - - private openDatabase(version: number): Promise { - return new Promise((c, e) => { - const request = window.indexedDB.open(INDEXEDDB_VSCODE_DB, version); - request.onerror = (err) => e(request.error); - request.onsuccess = () => { - const db = request.result; - if (db.objectStoreNames.contains(INDEXEDDB_LOGS_OBJECT_STORE)) { - c(db); - } - }; - request.onupgradeneeded = () => { - const db = request.result; - if (!db.objectStoreNames.contains(INDEXEDDB_LOGS_OBJECT_STORE)) { - db.createObjectStore(INDEXEDDB_LOGS_OBJECT_STORE); - } - c(db); - }; - }); - } - - protected async getAllKeys(): Promise { - return new Promise(async (c, e) => { - const db = await this.database; - const transaction = db.transaction([INDEXEDDB_LOGS_OBJECT_STORE]); - const objectStore = transaction.objectStore(INDEXEDDB_LOGS_OBJECT_STORE); - const request = objectStore.getAllKeys(); - request.onerror = () => e(request.error); - request.onsuccess = () => c(request.result); - }); - } - - protected hasKey(key: string): Promise { - return new Promise(async (c, e) => { - const db = await this.database; - const transaction = db.transaction([INDEXEDDB_LOGS_OBJECT_STORE]); - const objectStore = transaction.objectStore(INDEXEDDB_LOGS_OBJECT_STORE); - const request = objectStore.getKey(key); - request.onerror = () => e(request.error); - request.onsuccess = () => { - c(!!request.result); - }; - }); - } - - protected getValue(key: string): Promise { - return new Promise(async (c, e) => { - const db = await this.database; - const transaction = db.transaction([INDEXEDDB_LOGS_OBJECT_STORE]); - const objectStore = transaction.objectStore(INDEXEDDB_LOGS_OBJECT_STORE); - const request = objectStore.get(key); - request.onerror = () => e(request.error); - request.onsuccess = () => c(request.result || ''); - }); - } - - protected setValue(key: string, value: string): Promise { - return new Promise(async (c, e) => { - const db = await this.database; - const transaction = db.transaction([INDEXEDDB_LOGS_OBJECT_STORE], 'readwrite'); - const objectStore = transaction.objectStore(INDEXEDDB_LOGS_OBJECT_STORE); - const request = objectStore.put(value, key); - request.onerror = () => e(request.error); - request.onsuccess = () => c(); - }); - } - - protected deleteKey(key: string): Promise { - return new Promise(async (c, e) => { - const db = await this.database; - const transaction = db.transaction([INDEXEDDB_LOGS_OBJECT_STORE], 'readwrite'); - const objectStore = transaction.objectStore(INDEXEDDB_LOGS_OBJECT_STORE); - const request = objectStore.delete(key); - request.onerror = () => e(request.error); - request.onsuccess = () => c(); - }); - } -} diff --git a/src/vs/workbench/services/log/common/inMemoryLogProvider.ts b/src/vs/workbench/services/log/common/inMemoryLogProvider.ts deleted file mode 100644 index f8d87167c6e..00000000000 --- a/src/vs/workbench/services/log/common/inMemoryLogProvider.ts +++ /dev/null @@ -1,33 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { KeyValueLogProvider } from 'vs/workbench/services/log/common/keyValueLogProvider'; -import { keys } from 'vs/base/common/map'; - -export class InMemoryLogProvider extends KeyValueLogProvider { - - private readonly logs: Map = new Map(); - - protected async getAllKeys(): Promise { - return keys(this.logs); - } - - protected async hasKey(key: string): Promise { - return this.logs.has(key); - } - - protected async getValue(key: string): Promise { - return this.logs.get(key) || ''; - } - - protected async setValue(key: string, value: string): Promise { - this.logs.set(key, value); - } - - protected async deleteKey(key: string): Promise { - this.logs.delete(key); - } - -} diff --git a/src/vs/workbench/services/path/browser/pathService.ts b/src/vs/workbench/services/path/browser/pathService.ts index 9ec86fa5de7..13d4610b295 100644 --- a/src/vs/workbench/services/path/browser/pathService.ts +++ b/src/vs/workbench/services/path/browser/pathService.ts @@ -16,7 +16,7 @@ export class BrowserPathService extends AbstractPathService { @IRemoteAgentService remoteAgentService: IRemoteAgentService, @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService ) { - super(() => URI.from({ scheme: Schemas.vscodeRemote, authority: environmentService.configuration.remoteAuthority, path: '/' }), remoteAgentService); + super(URI.from({ scheme: Schemas.vscodeRemote, authority: environmentService.configuration.remoteAuthority, path: '/' }), remoteAgentService); } } diff --git a/src/vs/workbench/services/path/common/pathService.ts b/src/vs/workbench/services/path/common/pathService.ts index 43a1262868e..c2e1b21bd5a 100644 --- a/src/vs/workbench/services/path/common/pathService.ts +++ b/src/vs/workbench/services/path/common/pathService.ts @@ -40,13 +40,13 @@ export interface IPathService { /** * Resolves the user-home directory for the target environment. * If the envrionment is connected to a remote, this will be the - * remote's user home directory, otherwise the local one. + * remote's user home directory, otherwise the local one unless + * `preferLocal` is set to `true`. */ - readonly userHome: Promise; + userHome(options?: { preferLocal: boolean }): Promise; /** - * Access to `userHome` in a sync fashion. This may be `undefined` - * as long as the remote environment was not resolved. + * @deprecated use `userHome` instead. */ readonly resolvedUserHome: URI | undefined; } @@ -55,26 +55,35 @@ export abstract class AbstractPathService implements IPathService { declare readonly _serviceBrand: undefined; - private remoteOS: Promise; + private resolveOS: Promise; private resolveUserHome: Promise; private maybeUnresolvedUserHome: URI | undefined; constructor( - fallbackUserHome: () => URI, + private localUserHome: URI, @IRemoteAgentService private readonly remoteAgentService: IRemoteAgentService ) { - this.remoteOS = this.remoteAgentService.getEnvironment().then(env => env?.os || OS); - this.resolveUserHome = this.remoteAgentService.getEnvironment().then(env => { - const userHome = this.maybeUnresolvedUserHome = env?.userHome || fallbackUserHome(); + // OS + this.resolveOS = (async () => { + const env = await this.remoteAgentService.getEnvironment(); + + return env?.os || OS; + })(); + + // User Home + this.resolveUserHome = (async () => { + const env = await this.remoteAgentService.getEnvironment(); + const userHome = this.maybeUnresolvedUserHome = env?.userHome || localUserHome; + return userHome; - }); + })(); } - get userHome(): Promise { - return this.resolveUserHome; + async userHome(options?: { preferLocal: boolean }): Promise { + return options?.preferLocal ? this.localUserHome : this.resolveUserHome; } get resolvedUserHome(): URI | undefined { @@ -82,7 +91,7 @@ export abstract class AbstractPathService implements IPathService { } get path(): Promise { - return this.remoteOS.then(os => { + return this.resolveOS.then(os => { return os === OperatingSystem.Windows ? win32 : posix; @@ -95,7 +104,8 @@ export abstract class AbstractPathService implements IPathService { // normalize to fwd-slashes on windows, // on other systems bwd-slashes are valid // filename character, eg /f\oo/ba\r.txt - if ((await this.remoteOS) === OperatingSystem.Windows) { + const os = await this.resolveOS; + if (os === OperatingSystem.Windows) { _path = _path.replace(/\\/g, '/'); } diff --git a/src/vs/workbench/services/path/electron-browser/pathService.ts b/src/vs/workbench/services/path/electron-browser/pathService.ts index 58b8a78a252..8dbe77e0b38 100644 --- a/src/vs/workbench/services/path/electron-browser/pathService.ts +++ b/src/vs/workbench/services/path/electron-browser/pathService.ts @@ -15,7 +15,7 @@ export class NativePathService extends AbstractPathService { @IRemoteAgentService remoteAgentService: IRemoteAgentService, @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService ) { - super(() => environmentService.userHome, remoteAgentService); + super(environmentService.userHome, remoteAgentService); } } diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index aaf4fb8720b..e6a180a5c3e 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -210,7 +210,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic } const editorInput = this.getActiveSettingsEditorInput() || this.lastOpenedSettingsInput; - const resource = editorInput ? editorInput.master.resource! : this.userSettingsResource; + const resource = editorInput ? editorInput.primary.resource! : this.userSettingsResource; const target = this.getConfigurationTargetFromSettingsResource(resource); return this.openOrSwitchSettings(target, resource, { query: query }); } @@ -317,7 +317,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic private async openOrSwitchSettings(configurationTarget: ConfigurationTarget, resource: URI, options?: ISettingsEditorOptions, group: IEditorGroup = this.editorGroupService.activeGroup): Promise { const editorInput = this.getActiveSettingsEditorInput(group); if (editorInput) { - const editorInputResource = editorInput.master.resource; + const editorInputResource = editorInput.primary.resource; if (editorInputResource && editorInputResource.fsPath !== resource.fsPath) { return this.doSwitchSettings(configurationTarget, resource, editorInput, group, options); } diff --git a/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts b/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts index b15108b7385..18fee097595 100644 --- a/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts +++ b/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts @@ -29,7 +29,7 @@ export class PreferencesEditorInput extends SideBySideEditorInput { } getTitle(verbosity: Verbosity): string { - return this.master.getTitle(verbosity); + return this.primary.getTitle(verbosity); } } @@ -80,6 +80,7 @@ export class KeybindingsEditorInput extends EditorInput { constructor(@IInstantiationService instantiationService: IInstantiationService) { super(); + this.keybindingsModel = instantiationService.createInstance(KeybindingsEditorModel, OS); } @@ -91,13 +92,19 @@ export class KeybindingsEditorInput extends EditorInput { return nls.localize('keybindingsInputName', "Keyboard Shortcuts"); } - resolve(): Promise { - return Promise.resolve(this.keybindingsModel); + async resolve(): Promise { + return this.keybindingsModel; } matches(otherInput: unknown): boolean { return otherInput instanceof KeybindingsEditorInput; } + + dispose(): void { + this.keybindingsModel.dispose(); + + super.dispose(); + } } export class SettingsEditor2Input extends EditorInput { @@ -130,7 +137,13 @@ export class SettingsEditor2Input extends EditorInput { return nls.localize('settingsEditor2InputName', "Settings"); } - resolve(): Promise { - return Promise.resolve(this._settingsModel); + async resolve(): Promise { + return this._settingsModel; + } + + dispose(): void { + this._settingsModel.dispose(); + + super.dispose(); } } diff --git a/src/vs/workbench/services/remote/common/remoteExplorerService.ts b/src/vs/workbench/services/remote/common/remoteExplorerService.ts index 3227a9aff67..a8232c97d59 100644 --- a/src/vs/workbench/services/remote/common/remoteExplorerService.ts +++ b/src/vs/workbench/services/remote/common/remoteExplorerService.ts @@ -11,7 +11,9 @@ import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IEditableData } from 'vs/workbench/common/views'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TunnelInformation, TunnelDescription } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { TunnelInformation, TunnelDescription, IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection'; export const IRemoteExplorerService = createDecorator('remoteExplorerService'); export const REMOTE_EXPLORER_TYPE_KEY: string = 'remote.explorerType'; @@ -75,7 +77,9 @@ export class TunnelModel extends Disposable { constructor( @ITunnelService private readonly tunnelService: ITunnelService, @IStorageService private readonly storageService: IStorageService, - @IConfigurationService private readonly configurationService: IConfigurationService + @IConfigurationService private readonly configurationService: IConfigurationService, + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, + @IRemoteAuthorityResolverService private readonly remoteAuthorityResolverService: IRemoteAuthorityResolverService, ) { super(); this.forwarded = new Map(); @@ -137,7 +141,12 @@ export class TunnelModel extends Disposable { async forward(remote: { host: string, port: number }, local?: number, name?: string): Promise { const key = MakeAddress(remote.host, remote.port); if (!this.forwarded.has(key)) { - const tunnel = await this.tunnelService.openTunnel(remote.host, remote.port, local); + const authority = this.environmentService.configuration.remoteAuthority; + const addressProvider: IAddressProvider | undefined = authority ? { + getAddress: async () => { return (await this.remoteAuthorityResolverService.resolveAuthority(authority)).authority; } + } : undefined; + + const tunnel = await this.tunnelService.openTunnel(addressProvider, remote.host, remote.port, local); if (tunnel && tunnel.localAddress) { const newForward: Tunnel = { remoteHost: tunnel.tunnelRemoteHost, @@ -253,9 +262,11 @@ class RemoteExplorerService implements IRemoteExplorerService { constructor( @IStorageService private readonly storageService: IStorageService, @ITunnelService tunnelService: ITunnelService, - @IConfigurationService configurationService: IConfigurationService + @IConfigurationService configurationService: IConfigurationService, + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService, ) { - this._tunnelModel = new TunnelModel(tunnelService, storageService, configurationService); + this._tunnelModel = new TunnelModel(tunnelService, storageService, configurationService, environmentService, remoteAuthorityResolverService); } set targetType(name: string[]) { diff --git a/src/vs/workbench/services/remote/common/tunnelService.ts b/src/vs/workbench/services/remote/common/tunnelService.ts deleted file mode 100644 index 1e725fed9d3..00000000000 --- a/src/vs/workbench/services/remote/common/tunnelService.ts +++ /dev/null @@ -1,151 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { ITunnelService, RemoteTunnel, ITunnelProvider } from 'vs/platform/remote/common/tunnel'; -import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { ILogService } from 'vs/platform/log/common/log'; - -export abstract class AbstractTunnelService implements ITunnelService { - declare readonly _serviceBrand: undefined; - - private _onTunnelOpened: Emitter = new Emitter(); - public onTunnelOpened: Event = this._onTunnelOpened.event; - private _onTunnelClosed: Emitter<{ host: string, port: number }> = new Emitter(); - public onTunnelClosed: Event<{ host: string, port: number }> = this._onTunnelClosed.event; - protected readonly _tunnels = new Map }>>(); - protected _tunnelProvider: ITunnelProvider | undefined; - - public constructor( - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @ILogService protected readonly logService: ILogService - ) { } - - setTunnelProvider(provider: ITunnelProvider | undefined): IDisposable { - if (!provider) { - return { - dispose: () => { } - }; - } - this._tunnelProvider = provider; - return { - dispose: () => { - this._tunnelProvider = undefined; - } - }; - } - - public get tunnels(): Promise { - const promises: Promise[] = []; - Array.from(this._tunnels.values()).forEach(portMap => Array.from(portMap.values()).forEach(x => promises.push(x.value))); - return Promise.all(promises); - } - - dispose(): void { - for (const portMap of this._tunnels.values()) { - for (const { value } of portMap.values()) { - value.then(tunnel => tunnel.dispose()); - } - portMap.clear(); - } - this._tunnels.clear(); - } - - openTunnel(remoteHost: string | undefined, remotePort: number, localPort: number): Promise | undefined { - const remoteAuthority = this.environmentService.configuration.remoteAuthority; - if (!remoteAuthority) { - return undefined; - } - - if (!remoteHost || (remoteHost === '127.0.0.1')) { - remoteHost = 'localhost'; - } - - const resolvedTunnel = this.retainOrCreateTunnel(remoteAuthority, remoteHost, remotePort, localPort); - if (!resolvedTunnel) { - return resolvedTunnel; - } - - return resolvedTunnel.then(tunnel => { - const newTunnel = this.makeTunnel(tunnel); - if (tunnel.tunnelRemoteHost !== remoteHost || tunnel.tunnelRemotePort !== remotePort) { - this.logService.warn('Created tunnel does not match requirements of requested tunnel. Host or port mismatch.'); - } - this._onTunnelOpened.fire(newTunnel); - return newTunnel; - }); - } - - private makeTunnel(tunnel: RemoteTunnel): RemoteTunnel { - return { - tunnelRemotePort: tunnel.tunnelRemotePort, - tunnelRemoteHost: tunnel.tunnelRemoteHost, - tunnelLocalPort: tunnel.tunnelLocalPort, - localAddress: tunnel.localAddress, - dispose: () => { - const existingHost = this._tunnels.get(tunnel.tunnelRemoteHost); - if (existingHost) { - const existing = existingHost.get(tunnel.tunnelRemotePort); - if (existing) { - existing.refcount--; - this.tryDisposeTunnel(tunnel.tunnelRemoteHost, tunnel.tunnelRemotePort, existing); - } - } - } - }; - } - - private async tryDisposeTunnel(remoteHost: string, remotePort: number, tunnel: { refcount: number, readonly value: Promise }): Promise { - if (tunnel.refcount <= 0) { - const disposePromise: Promise = tunnel.value.then(tunnel => { - tunnel.dispose(true); - this._onTunnelClosed.fire({ host: tunnel.tunnelRemoteHost, port: tunnel.tunnelRemotePort }); - }); - if (this._tunnels.has(remoteHost)) { - this._tunnels.get(remoteHost)!.delete(remotePort); - } - return disposePromise; - } - } - - async closeTunnel(remoteHost: string, remotePort: number): Promise { - const portMap = this._tunnels.get(remoteHost); - if (portMap && portMap.has(remotePort)) { - const value = portMap.get(remotePort)!; - value.refcount = 0; - await this.tryDisposeTunnel(remoteHost, remotePort, value); - } - } - - protected addTunnelToMap(remoteHost: string, remotePort: number, tunnel: Promise) { - if (!this._tunnels.has(remoteHost)) { - this._tunnels.set(remoteHost, new Map()); - } - this._tunnels.get(remoteHost)!.set(remotePort, { refcount: 1, value: tunnel }); - } - - protected abstract retainOrCreateTunnel(remoteAuthority: string, remoteHost: string, remotePort: number, localPort?: number): Promise | undefined; -} - -export class TunnelService extends AbstractTunnelService { - protected retainOrCreateTunnel(remoteAuthority: string, remoteHost: string, remotePort: number, localPort?: number | undefined): Promise | undefined { - const portMap = this._tunnels.get(remoteHost); - const existing = portMap ? portMap.get(remotePort) : undefined; - if (existing) { - ++existing.refcount; - return existing.value; - } - - if (this._tunnelProvider) { - const tunnel = this._tunnelProvider.forwardPort({ remoteAddress: { host: remoteHost, port: remotePort } }); - if (tunnel) { - this.addTunnelToMap(remoteHost, remotePort, tunnel); - } - return tunnel; - } - return undefined; - } -} diff --git a/src/vs/workbench/services/search/common/search.ts b/src/vs/workbench/services/search/common/search.ts index 367de28d887..212cc51ea37 100644 --- a/src/vs/workbench/services/search/common/search.ts +++ b/src/vs/workbench/services/search/common/search.ts @@ -11,13 +11,11 @@ import * as objects from 'vs/base/common/objects'; import * as extpath from 'vs/base/common/extpath'; import { fuzzyContains, getNLines } from 'vs/base/common/strings'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { IFilesConfiguration, FILES_EXCLUDE_CONFIG } from 'vs/platform/files/common/files'; -import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IFilesConfiguration } from 'vs/platform/files/common/files'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { Event } from 'vs/base/common/event'; import { relative } from 'vs/base/common/path'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ResourceGlobMatcher } from 'vs/workbench/common/resources'; import { isPromiseCanceledError } from 'vs/base/common/errors'; export const VIEWLET_ID = 'workbench.view.search'; @@ -384,14 +382,6 @@ export function getExcludes(configuration: ISearchConfiguration, includeSearchEx return allExcludes; } -export function createResourceExcludeMatcher(instantiationService: IInstantiationService, configurationService: IConfigurationService): ResourceGlobMatcher { - return instantiationService.createInstance( - ResourceGlobMatcher, - root => getExcludes(root ? configurationService.getValue({ resource: root }) : configurationService.getValue()) || Object.create(null), - event => event.affectsConfiguration(FILES_EXCLUDE_CONFIG) || event.affectsConfiguration(SEARCH_EXCLUDE_CONFIG) - ); -} - export function pathIncludedInQuery(queryProps: ICommonQueryProps, fsPath: string): boolean { if (queryProps.excludePattern && glob.match(queryProps.excludePattern, fsPath)) { return false; diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts index d11789ec923..c6446cdc798 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts @@ -116,7 +116,8 @@ export class RipgrepTextSearchEngine { } /** - * Read the first line of stderr and return an error for display or undefined, based on a whitelist. + * Read the first line of stderr and return an error for display or undefined, based on a list of + * allowed properties. * Ripgrep produces stderr output which is not from a fatal error, and we only want the search to be * "failed" when a fatal error was produced. */ diff --git a/src/vs/workbench/services/search/node/textSearchManager.ts b/src/vs/workbench/services/search/node/textSearchManager.ts index 3433ce35537..84be2f01f98 100644 --- a/src/vs/workbench/services/search/node/textSearchManager.ts +++ b/src/vs/workbench/services/search/node/textSearchManager.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { toCanonicalName } from 'vs/base/node/encoding'; +import { toCanonicalName } from 'vs/workbench/services/textfile/common/encoding'; import * as pfs from 'vs/base/node/pfs'; import { ITextQuery } from 'vs/workbench/services/search/common/search'; import { TextSearchProvider } from 'vs/workbench/services/search/common/searchExtTypes'; diff --git a/src/vs/workbench/services/statusbar/common/statusbar.ts b/src/vs/workbench/services/statusbar/common/statusbar.ts index 018a049fa47..14a52e61d68 100644 --- a/src/vs/workbench/services/statusbar/common/statusbar.ts +++ b/src/vs/workbench/services/statusbar/common/statusbar.ts @@ -33,6 +33,12 @@ export interface IStatusbarEntry { */ readonly ariaLabel: string; + /** + * Role of the status bar entry which defines how a screen reader interacts with it. + * Default is 'button'. + */ + readonly role?: string; + /** * An optional tooltip text to show when you hover over the entry */ diff --git a/src/vs/workbench/services/textfile/browser/browserTextFileService.ts b/src/vs/workbench/services/textfile/browser/browserTextFileService.ts index 83d5fba161a..9c2bfa4f7cf 100644 --- a/src/vs/workbench/services/textfile/browser/browserTextFileService.ts +++ b/src/vs/workbench/services/textfile/browser/browserTextFileService.ts @@ -3,18 +3,22 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AbstractTextFileService } from 'vs/workbench/services/textfile/browser/textFileService'; -import { ITextFileService, IResourceEncodings, IResourceEncoding, TextFileEditorModelState } from 'vs/workbench/services/textfile/common/textfiles'; +import { AbstractTextFileService, EncodingOracle } from 'vs/workbench/services/textfile/browser/textFileService'; +import { ITextFileService, IResourceEncoding, TextFileEditorModelState } from 'vs/workbench/services/textfile/common/textfiles'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; export class BrowserTextFileService extends AbstractTextFileService { - readonly encoding: IResourceEncodings = { - getPreferredWriteEncoding(): IResourceEncoding { - return { encoding: 'utf8', hasBOM: false }; + private _browserEncoding: EncodingOracle | undefined; + + get encoding(): EncodingOracle { + if (!this._browserEncoding) { + this._browserEncoding = this._register(this.instantiationService.createInstance(BrowserEncodingOracle)); } - }; + + return this._browserEncoding; + } protected registerListeners(): void { super.registerListeners(); @@ -34,4 +38,18 @@ export class BrowserTextFileService extends AbstractTextFileService { } } +class BrowserEncodingOracle extends EncodingOracle { + async getPreferredWriteEncoding(): Promise { + return { encoding: 'utf8', hasBOM: false }; + } + + async getWriteEncoding(): Promise<{ encoding: string, addBOM: boolean }> { + return { encoding: 'utf8', addBOM: false }; + } + + async getReadEncoding(): Promise { + return 'utf8'; + } +} + registerSingleton(ITextFileService, BrowserTextFileService); diff --git a/src/vs/workbench/services/textfile/browser/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts index a27fc9bf049..b7c5414eba4 100644 --- a/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -5,11 +5,10 @@ import * as nls from 'vs/nls'; import { URI } from 'vs/base/common/uri'; -import { AsyncEmitter } from 'vs/base/common/event'; -import { ITextFileService, ITextFileStreamContent, ITextFileContent, IResourceEncodings, IReadTextFileOptions, IWriteTextFileOptions, toBufferOrReadable, TextFileOperationError, TextFileOperationResult, ITextFileSaveOptions, ITextFileEditorModelManager, TextFileCreateEvent } from 'vs/workbench/services/textfile/common/textfiles'; +import { ITextFileService, ITextFileStreamContent, ITextFileContent, IResourceEncodings, IReadTextFileOptions, IWriteTextFileOptions, toBufferOrReadable, TextFileOperationError, TextFileOperationResult, ITextFileSaveOptions, ITextFileEditorModelManager, IResourceEncoding, stringToSnapshot } from 'vs/workbench/services/textfile/common/textfiles'; import { IRevertOptions, IEncodingSupport } from 'vs/workbench/common/editor'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { IFileService, FileOperationError, FileOperationResult, IFileStatWithMetadata, ICreateFileOptions, FileOperation } from 'vs/platform/files/common/files'; +import { IFileService, FileOperationError, FileOperationResult, IFileStatWithMetadata, ICreateFileOptions, IFileStreamContent } from 'vs/platform/files/common/files'; import { Disposable } from 'vs/base/common/lifecycle'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IUntitledTextEditorService, IUntitledTextEditorModelManager } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; @@ -19,14 +18,13 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { Schemas } from 'vs/base/common/network'; import { createTextBufferFactoryFromSnapshot, createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { joinPath, dirname, basename, toLocalResource } from 'vs/base/common/resources'; +import { joinPath, dirname, basename, toLocalResource, extUri, extname, isEqualOrParent } from 'vs/base/common/resources'; import { IDialogService, IFileDialogService, IConfirmation } from 'vs/platform/dialogs/common/dialogs'; -import { VSBuffer } from 'vs/base/common/buffer'; +import { VSBuffer, VSBufferReadable, bufferToStream } from 'vs/base/common/buffer'; import { ITextSnapshot, ITextModel } from 'vs/editor/common/model'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; -import { CancellationToken } from 'vs/base/common/cancellation'; import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -35,6 +33,11 @@ import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { isValidBasename } from 'vs/base/common/extpath'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { UTF8, UTF8_with_bom, UTF16be, UTF16le, encodingExists, UTF8_BOM, detectEncodingByBOMFromBuffer, toEncodeReadable, toDecodeStream, IDecodeStreamResult } from 'vs/workbench/services/textfile/common/encoding'; +import { consumeStream } from 'vs/base/common/stream'; /** * The workbench file service implementation implements the raw file service spec and adds additional methods on top. @@ -43,19 +46,10 @@ export abstract class AbstractTextFileService extends Disposable implements ITex declare readonly _serviceBrand: undefined; - //#region events - - private _onDidCreateTextFile = this._register(new AsyncEmitter()); - readonly onDidCreateTextFile = this._onDidCreateTextFile.event; - - //#endregion - readonly files: ITextFileEditorModelManager = this._register(this.instantiationService.createInstance(TextFileEditorModelManager)); readonly untitled: IUntitledTextEditorModelManager = this.untitledTextEditorService; - abstract get encoding(): IResourceEncodings; - constructor( @IFileService protected readonly fileService: IFileService, @IUntitledTextEditorService private untitledTextEditorService: IUntitledTextEditorService, @@ -86,89 +80,102 @@ export abstract class AbstractTextFileService extends Disposable implements ITex //#region text file read / write / create - async read(resource: URI, options?: IReadTextFileOptions): Promise { - const content = await this.fileService.readFile(resource, options); + private _encoding: EncodingOracle | undefined; - // in case of acceptTextOnly: true, we check the first - // chunk for possibly being binary by looking for 0-bytes - // we limit this check to the first 512 bytes - this.validateBinary(content.value, options); + get encoding(): EncodingOracle { + if (!this._encoding) { + this._encoding = this._register(this.instantiationService.createInstance(EncodingOracle)); + } + + return this._encoding; + } + + async read(resource: URI, options?: IReadTextFileOptions): Promise { + const [bufferStream, decoder] = await this.doRead(resource, { + ...options, + // optimization: since we know that the caller does not + // care about buffering, we indicate this to the reader. + // this reduces all the overhead the buffered reading + // has (open, read, close) if the provider supports + // unbuffered reading. + preferUnbuffered: true + }); return { - ...content, - encoding: 'utf8', - value: content.value.toString() + ...bufferStream, + encoding: decoder.detected.encoding || UTF8, + value: await consumeStream(decoder.stream, strings => strings.join('')) }; } async readStream(resource: URI, options?: IReadTextFileOptions): Promise { - const stream = await this.fileService.readFileStream(resource, options); - - // in case of acceptTextOnly: true, we check the first - // chunk for possibly being binary by looking for 0-bytes - // we limit this check to the first 512 bytes - let checkedForBinary = false; - const throwOnBinary = (data: VSBuffer): Error | undefined => { - if (!checkedForBinary) { - checkedForBinary = true; - - this.validateBinary(data, options); - } - - return undefined; - }; + const [bufferStream, decoder] = await this.doRead(resource, options); return { - ...stream, - encoding: 'utf8', - value: await createTextBufferFactoryFromStream(stream.value, undefined, options?.acceptTextOnly ? throwOnBinary : undefined) + ...bufferStream, + encoding: decoder.detected.encoding || UTF8, + value: await createTextBufferFactoryFromStream(decoder.stream) }; } - private validateBinary(buffer: VSBuffer, options?: IReadTextFileOptions): void { - if (!options || !options.acceptTextOnly) { - return; // no validation needed + private async doRead(resource: URI, options?: IReadTextFileOptions & { preferUnbuffered?: boolean }): Promise<[IFileStreamContent, IDecodeStreamResult]> { + + // read stream raw (either buffered or unbuffered) + let bufferStream: IFileStreamContent; + if (options?.preferUnbuffered) { + const content = await this.fileService.readFile(resource, options); + bufferStream = { + ...content, + value: bufferToStream(content.value) + }; + } else { + bufferStream = await this.fileService.readFileStream(resource, options); } - // in case of acceptTextOnly: true, we check the first - // chunk for possibly being binary by looking for 0-bytes - // we limit this check to the first 512 bytes - for (let i = 0; i < buffer.byteLength && i < 512; i++) { - if (buffer.readUInt8(i) === 0) { - throw new TextFileOperationError(nls.localize('fileBinaryError', "File seems to be binary and cannot be opened as text"), TextFileOperationResult.FILE_IS_BINARY, options); - } + // read through encoding library + const decoder = await toDecodeStream(bufferStream.value, { + guessEncoding: options?.autoGuessEncoding || this.textResourceConfigurationService.getValue(resource, 'files.autoGuessEncoding'), + overwriteEncoding: detectedEncoding => this.encoding.getReadEncoding(resource, options, detectedEncoding) + }); + + // validate binary + if (options?.acceptTextOnly && decoder.detected.seemsBinary) { + throw new TextFileOperationError(nls.localize('fileBinaryError', "File seems to be binary and cannot be opened as text"), TextFileOperationResult.FILE_IS_BINARY, options); } + + return [bufferStream, decoder]; } async create(resource: URI, value?: string | ITextSnapshot, options?: ICreateFileOptions): Promise { + const readable = await this.getEncodedReadable(resource, value); - // file operation participation - await this.workingCopyFileService.runFileOperationParticipants(resource, undefined, FileOperation.CREATE); - - // create file on disk - const stat = await this.doCreate(resource, value, options); - - // If we had an existing model for the given resource, load - // it again to make sure it is up to date with the contents - // we just wrote into the underlying resource by calling - // revert() - const existingModel = this.files.get(resource); - if (existingModel && !existingModel.isDisposed()) { - await existingModel.revert(); - } - - // after event - await this._onDidCreateTextFile.fireAsync({ resource }, CancellationToken.None); - - return stat; - } - - protected doCreate(resource: URI, value?: string | ITextSnapshot, options?: ICreateFileOptions): Promise { - return this.fileService.createFile(resource, toBufferOrReadable(value), options); + return this.workingCopyFileService.create(resource, readable, options); } async write(resource: URI, value: string | ITextSnapshot, options?: IWriteTextFileOptions): Promise { - return this.fileService.writeFile(resource, toBufferOrReadable(value), options); + const readable = await this.getEncodedReadable(resource, value, options); + + return this.fileService.writeFile(resource, readable, options); + } + + private async getEncodedReadable(resource: URI, value?: string | ITextSnapshot): Promise; + private async getEncodedReadable(resource: URI, value: string | ITextSnapshot, options?: IWriteTextFileOptions): Promise; + private async getEncodedReadable(resource: URI, value?: string | ITextSnapshot, options?: IWriteTextFileOptions): Promise { + + // check for encoding + const { encoding, addBOM } = await this.encoding.getWriteEncoding(resource, options); + + // when encoding is standard skip encoding step + if (encoding === UTF8 && !addBOM) { + return typeof value === 'undefined' + ? undefined + : toBufferOrReadable(value); + } + + // otherwise create encoded readable + value = value || ''; + const snapshot = typeof value === 'string' ? stringToSnapshot(value) : value; + return toEncodeReadable(snapshot, encoding, { addBOM }); } //#endregion @@ -224,7 +231,7 @@ export abstract class AbstractTextFileService extends Disposable implements ITex } // Just save if target is same as models own resource - if (source.toString() === target.toString()) { + if (extUri.isEqual(source, target)) { return this.save(source, { ...options, force: true /* force to save, even if not dirty (https://github.com/microsoft/vscode/issues/99619) */ }); } @@ -234,7 +241,7 @@ export abstract class AbstractTextFileService extends Disposable implements ITex // However, this will only work if the source exists // and is not orphaned, so we need to check that too. if (this.fileService.canHandleResource(source) && this.uriIdentityService.extUri.isEqual(source, target) && (await this.fileService.exists(source))) { - await this.workingCopyFileService.move(source, target); + await this.workingCopyFileService.move([{ source, target }]); return this.save(target, options); } @@ -450,7 +457,7 @@ export abstract class AbstractTextFileService extends Disposable implements ITex // Try to place where last active file was if any // Otherwise fallback to user home - return joinPath(this.fileDialogService.defaultFilePath() || (await this.pathService.userHome), suggestedFilename); + return joinPath(this.fileDialogService.defaultFilePath() || (await this.pathService.userHome()), suggestedFilename); } //#endregion @@ -491,3 +498,150 @@ export abstract class AbstractTextFileService extends Disposable implements ITex //#endregion } + +export interface IEncodingOverride { + parent?: URI; + extension?: string; + encoding: string; +} + +export class EncodingOracle extends Disposable implements IResourceEncodings { + + private _encodingOverrides: IEncodingOverride[]; + protected get encodingOverrides(): IEncodingOverride[] { return this._encodingOverrides; } + protected set encodingOverrides(value: IEncodingOverride[]) { this._encodingOverrides = value; } + + constructor( + @ITextResourceConfigurationService private textResourceConfigurationService: ITextResourceConfigurationService, + @IEnvironmentService private environmentService: IEnvironmentService, + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IFileService private fileService: IFileService + ) { + super(); + + this._encodingOverrides = this.getDefaultEncodingOverrides(); + + this.registerListeners(); + } + + private registerListeners(): void { + + // Workspace Folder Change + this._register(this.contextService.onDidChangeWorkspaceFolders(() => this.encodingOverrides = this.getDefaultEncodingOverrides())); + } + + private getDefaultEncodingOverrides(): IEncodingOverride[] { + const defaultEncodingOverrides: IEncodingOverride[] = []; + + // Global settings + defaultEncodingOverrides.push({ parent: this.environmentService.userRoamingDataHome, encoding: UTF8 }); + + // Workspace files (via extension and via untitled workspaces location) + defaultEncodingOverrides.push({ extension: WORKSPACE_EXTENSION, encoding: UTF8 }); + defaultEncodingOverrides.push({ parent: this.environmentService.untitledWorkspacesHome, encoding: UTF8 }); + + // Folder Settings + this.contextService.getWorkspace().folders.forEach(folder => { + defaultEncodingOverrides.push({ parent: joinPath(folder.uri, '.vscode'), encoding: UTF8 }); + }); + + return defaultEncodingOverrides; + } + + async getWriteEncoding(resource: URI, options?: IWriteTextFileOptions): Promise<{ encoding: string, addBOM: boolean }> { + const { encoding, hasBOM } = await this.getPreferredWriteEncoding(resource, options ? options.encoding : undefined); + + // Some encodings come with a BOM automatically + if (hasBOM) { + return { encoding, addBOM: true }; + } + + // Ensure that we preserve an existing BOM if found for UTF8 + // unless we are instructed to overwrite the encoding + const overwriteEncoding = options?.overwriteEncoding; + if (!overwriteEncoding && encoding === UTF8) { + try { + const buffer = (await this.fileService.readFile(resource, { length: UTF8_BOM.length })).value; + if (detectEncodingByBOMFromBuffer(buffer, buffer.byteLength) === UTF8_with_bom) { + return { encoding, addBOM: true }; + } + } catch (error) { + // ignore - file might not exist + } + } + + return { encoding, addBOM: false }; + } + + async getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): Promise { + const resourceEncoding = await this.getEncodingForResource(resource, preferredEncoding); + + return { + encoding: resourceEncoding, + hasBOM: resourceEncoding === UTF16be || resourceEncoding === UTF16le || resourceEncoding === UTF8_with_bom // enforce BOM for certain encodings + }; + } + + getReadEncoding(resource: URI, options: IReadTextFileOptions | undefined, detectedEncoding: string | null): Promise { + let preferredEncoding: string | undefined; + + // Encoding passed in as option + if (options?.encoding) { + if (detectedEncoding === UTF8_with_bom && options.encoding === UTF8) { + preferredEncoding = UTF8_with_bom; // indicate the file has BOM if we are to resolve with UTF 8 + } else { + preferredEncoding = options.encoding; // give passed in encoding highest priority + } + } + + // Encoding detected + else if (detectedEncoding) { + preferredEncoding = detectedEncoding; + } + + // Encoding configured + else if (this.textResourceConfigurationService.getValue(resource, 'files.encoding') === UTF8_with_bom) { + preferredEncoding = UTF8; // if we did not detect UTF 8 BOM before, this can only be UTF 8 then + } + + return this.getEncodingForResource(resource, preferredEncoding); + } + + private async getEncodingForResource(resource: URI, preferredEncoding?: string): Promise { + let fileEncoding: string; + + const override = this.getEncodingOverride(resource); + if (override) { + fileEncoding = override; // encoding override always wins + } else if (preferredEncoding) { + fileEncoding = preferredEncoding; // preferred encoding comes second + } else { + fileEncoding = this.textResourceConfigurationService.getValue(resource, 'files.encoding'); // and last we check for settings + } + + if (!fileEncoding || !(await encodingExists(fileEncoding))) { + fileEncoding = UTF8; // the default is UTF 8 + } + + return fileEncoding; + } + + private getEncodingOverride(resource: URI): string | undefined { + if (this.encodingOverrides && this.encodingOverrides.length) { + for (const override of this.encodingOverrides) { + + // check if the resource is child of encoding override path + if (override.parent && isEqualOrParent(resource, override.parent)) { + return override.encoding; + } + + // check if the resource extension is equal to encoding override + if (override.extension && extname(resource) === `.${override.extension}`) { + return override.encoding; + } + } + } + + return undefined; + } +} diff --git a/src/vs/base/node/encoding.ts b/src/vs/workbench/services/textfile/common/encoding.ts similarity index 58% rename from src/vs/base/node/encoding.ts rename to src/vs/workbench/services/textfile/common/encoding.ts index ec3392a780e..1f1166f5584 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/workbench/services/textfile/common/encoding.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as iconv from 'iconv-lite'; -import { Readable, Writable } from 'stream'; -import { VSBuffer } from 'vs/base/common/buffer'; +import { DecoderStream } from 'iconv-lite-umd'; +import { Readable, ReadableStream, newWriteableStream } from 'vs/base/common/stream'; +import { VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; export const UTF8 = 'utf8'; export const UTF8_with_bom = 'utf8bom'; @@ -31,125 +31,156 @@ export interface IDecodeStreamOptions { guessEncoding: boolean; minBytesRequiredForDetection?: number; - overwriteEncoding(detectedEncoding: string | null): string; + overwriteEncoding(detectedEncoding: string | null): Promise; } export interface IDecodeStreamResult { - stream: NodeJS.ReadableStream; + stream: ReadableStream; detected: IDetectedEncodingResult; } -export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions): Promise { - if (!options.minBytesRequiredForDetection) { - options.minBytesRequiredForDetection = options.guessEncoding ? AUTO_ENCODING_GUESS_MIN_BYTES : NO_ENCODING_GUESS_MIN_BYTES; - } +export function toDecodeStream(source: VSBufferReadableStream, options: IDecodeStreamOptions): Promise { + const minBytesRequiredForDetection = options.minBytesRequiredForDetection ?? options.guessEncoding ? AUTO_ENCODING_GUESS_MIN_BYTES : NO_ENCODING_GUESS_MIN_BYTES; return new Promise((resolve, reject) => { - const writer = new class extends Writable { - private decodeStream: NodeJS.ReadWriteStream | undefined; - private decodeStreamPromise: Promise | undefined; + const target = newWriteableStream(strings => strings.join('')); - private bufferedChunks: Buffer[] = []; - private bytesBuffered = 0; + const bufferedChunks: VSBuffer[] = []; + let bytesBuffered = 0; - _write(chunk: Buffer, encoding: string, callback: (error: Error | null | undefined) => void): void { - if (!Buffer.isBuffer(chunk)) { - return callback(new Error('toDecodeStream(): data must be a buffer')); - } + let decoder: DecoderStream | undefined = undefined; - // if the decode stream is ready, we just write directly - if (this.decodeStream) { - this.decodeStream.write(chunk, callback); - - return; - } - - // otherwise we need to buffer the data until the stream is ready - this.bufferedChunks.push(chunk); - this.bytesBuffered += chunk.byteLength; - - // waiting for the decoder to be ready - if (this.decodeStreamPromise) { - this.decodeStreamPromise.then(() => callback(null), error => callback(error)); - } - - // buffered enough data for encoding detection, create stream and forward data - else if (typeof options.minBytesRequiredForDetection === 'number' && this.bytesBuffered >= options.minBytesRequiredForDetection) { - this._startDecodeStream(callback); - } - - // only buffering until enough data for encoding detection is there - else { - callback(null); - } - } - - _startDecodeStream(callback: (error: Error | null | undefined) => void): void { + const createDecoder = async () => { + try { // detect encoding from buffer - this.decodeStreamPromise = Promise.resolve(detectEncodingFromBuffer({ - buffer: Buffer.concat(this.bufferedChunks), - bytesRead: this.bytesBuffered - }, options.guessEncoding)).then(detected => { + const detected = await detectEncodingFromBuffer({ + buffer: VSBuffer.concat(bufferedChunks), + bytesRead: bytesBuffered + }, options.guessEncoding); - // ensure to respect overwrite of encoding - detected.encoding = options.overwriteEncoding(detected.encoding); + // ensure to respect overwrite of encoding + detected.encoding = await options.overwriteEncoding(detected.encoding); - // decode and write buffer - this.decodeStream = decodeStream(detected.encoding); - this.decodeStream.write(Buffer.concat(this.bufferedChunks), callback); - this.bufferedChunks.length = 0; + // decode and write buffered content + const iconv = await import('iconv-lite-umd'); + decoder = iconv.getDecoder(toNodeEncoding(detected.encoding)); + const decoded = decoder.write(VSBuffer.concat(bufferedChunks).buffer); + target.write(decoded); - // signal to the outside our detected encoding - // and final decoder stream - resolve({ detected, stream: this.decodeStream }); - }, error => { - this.emit('error', error); + bufferedChunks.length = 0; + bytesBuffered = 0; - callback(error); + // signal to the outside our detected encoding and final decoder stream + resolve({ + stream: target, + detected }); - } - - _final(callback: () => void) { - - // normal finish - if (this.decodeStream) { - this.decodeStream.end(callback); - } - - // we were still waiting for data to do the encoding - // detection. thus, wrap up starting the stream even - // without all the data to get things going - else { - this._startDecodeStream(() => { - if (this.decodeStream) { - this.decodeStream.end(callback); - } - }); - } + } catch (error) { + reject(error); } }; - // errors - readable.on('error', reject); + // Stream error: forward to target + source.on('error', error => target.error(error)); - // pipe through - readable.pipe(writer); + // Stream data + source.on('data', async chunk => { + + // if the decoder is ready, we just write directly + if (decoder) { + target.write(decoder.write(chunk.buffer)); + } + + // otherwise we need to buffer the data until the stream is ready + else { + bufferedChunks.push(chunk); + bytesBuffered += chunk.byteLength; + + // buffered enough data for encoding detection, create stream + if (bytesBuffered >= minBytesRequiredForDetection) { + + // pause stream here until the decoder is ready + source.pause(); + + await createDecoder(); + + // resume stream now that decoder is ready but + // outside of this stack to reduce recursion + setTimeout(() => source.resume()); + } + } + }); + + // Stream end + source.on('end', async () => { + + // we were still waiting for data to do the encoding + // detection. thus, wrap up starting the stream even + // without all the data to get things going + if (!decoder) { + await createDecoder(); + } + + // end the target with the remainders of the decoder + target.end(decoder?.end()); + }); }); } -export function encodingExists(encoding: string): boolean { +export async function toEncodeReadable(readable: Readable, encoding: string, options?: { addBOM?: boolean }): Promise { + const iconv = await import('iconv-lite-umd'); + const encoder = iconv.getEncoder(toNodeEncoding(encoding), options); + + let bytesRead = 0; + let done = false; + + return { + read() { + if (done) { + return null; + } + + const chunk = readable.read(); + if (typeof chunk !== 'string') { + done = true; + + // If we are instructed to add a BOM but we detect that no + // bytes have been read, we must ensure to return the BOM + // ourselves so that we comply with the contract. + if (bytesRead === 0 && options?.addBOM) { + switch (encoding) { + case UTF8: + case UTF8_with_bom: + return VSBuffer.wrap(Uint8Array.from(UTF8_BOM)); + case UTF16be: + return VSBuffer.wrap(Uint8Array.from(UTF16be_BOM)); + case UTF16le: + return VSBuffer.wrap(Uint8Array.from(UTF16le_BOM)); + } + } + + const leftovers = encoder.end(); + if (leftovers && leftovers.length > 0) { + return VSBuffer.wrap(leftovers); + } + + return null; + } + + bytesRead += chunk.length; + + return VSBuffer.wrap(encoder.write(chunk)); + } + }; +} + +export async function encodingExists(encoding: string): Promise { + const iconv = await import('iconv-lite-umd'); + return iconv.encodingExists(toNodeEncoding(encoding)); } -function decodeStream(encoding: string | null): NodeJS.ReadWriteStream { - return iconv.decodeStream(toNodeEncoding(encoding)); -} - -export function encodeStream(encoding: string, options?: { addBOM?: boolean }): NodeJS.ReadWriteStream { - return iconv.encodeStream(toNodeEncoding(encoding), options); -} - export function toNodeEncoding(enc: string | null): string { if (enc === UTF8_with_bom || enc === null) { return UTF8; // iconv does not distinguish UTF 8 with or without BOM, so we need to help it @@ -158,7 +189,7 @@ export function toNodeEncoding(enc: string | null): string { return enc; } -export function detectEncodingByBOMFromBuffer(buffer: Buffer | VSBuffer | null, bytesRead: number): typeof UTF8_with_bom | typeof UTF16le | typeof UTF16be | null { +export function detectEncodingByBOMFromBuffer(buffer: VSBuffer | null, bytesRead: number): typeof UTF8_with_bom | typeof UTF16le | typeof UTF16be | null { if (!buffer || bytesRead < UTF16be_BOM.length) { return null; } @@ -200,10 +231,22 @@ const IGNORE_ENCODINGS = ['ascii', 'utf-16', 'utf-32']; /** * Guesses the encoding from buffer. */ -async function guessEncodingByBuffer(buffer: Buffer): Promise { +async function guessEncodingByBuffer(buffer: VSBuffer): Promise { const jschardet = await import('jschardet'); - const guessed = jschardet.detect(buffer.slice(0, AUTO_ENCODING_GUESS_MAX_BYTES)); // ensure to limit buffer for guessing due to https://github.com/aadsm/jschardet/issues/53 + // ensure to limit buffer for guessing due to https://github.com/aadsm/jschardet/issues/53 + const limitedBuffer = buffer.slice(0, AUTO_ENCODING_GUESS_MAX_BYTES); + + // before guessing jschardet calls toString('binary') on input if it is a Buffer, + // since we are using it inside browser environment as well we do conversion ourselves + // https://github.com/aadsm/jschardet/blob/v2.1.1/src/index.js#L36-L40 + const binaryString = encodeLatin1(limitedBuffer.buffer); + + // override type since jschardet expects Buffer even though can accept string + // can be fixed once https://github.com/aadsm/jschardet/pull/58 is merged + const jschardetTypingsWorkaround = binaryString as any; + + const guessed = jschardet.detect(jschardetTypingsWorkaround); if (!guessed || !guessed.encoding) { return null; } @@ -228,6 +271,15 @@ function toIconvLiteEncoding(encodingName: string): string { return mapped || normalizedEncodingName; } +function encodeLatin1(buffer: Uint8Array): string { + let result = ''; + for (let i = 0; i < buffer.length; i++) { + result += String.fromCharCode(buffer[i]); + } + + return result; +} + /** * The encodings that are allowed in a settings file don't match the canonical encoding labels specified by WHATWG. * See https://encoding.spec.whatwg.org/#names-and-labels @@ -271,7 +323,7 @@ export interface IDetectedEncodingResult { } export interface IReadResult { - buffer: Buffer | null; + buffer: VSBuffer | null; bytesRead: number; } @@ -298,7 +350,7 @@ export function detectEncodingFromBuffer({ buffer, bytesRead }: IReadResult, aut // that is using 4 bytes to encode a character). for (let i = 0; i < bytesRead && i < ZERO_BYTE_DETECTION_BUFFER_MAX_LEN; i++) { const isEndian = (i % 2 === 1); // assume 2-byte sequences typical for UTF-16 - const isZeroByte = (buffer.readInt8(i) === 0); + const isZeroByte = (buffer.readUInt8(i) === 0); if (isZeroByte) { containsZeroByte = true; diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index d0972af43d2..df83105952a 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -286,6 +286,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } private async loadFromBackup(backup: IResolvedBackup, options?: ITextFileLoadOptions): Promise { + const preferredEncoding = await this.textFileService.encoding.getPreferredWriteEncoding(this.resource, this.preferredEncoding); // Load with backup this.loadFromContent({ @@ -296,7 +297,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil size: backup.meta ? backup.meta.size : 0, etag: backup.meta ? backup.meta.etag : ETAG_DISABLED, // etag disabled if unknown! value: backup.value, - encoding: this.textFileService.encoding.getPreferredWriteEncoding(this.resource, this.preferredEncoding).encoding + encoding: preferredEncoding.encoding }, options, true /* from backup */); // Restore orphaned flag based on state diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts index 64678af9e2d..316dbdf5510 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts @@ -63,7 +63,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE return { onSaveError(error: Error, model: ITextFileEditorModel): void { - notificationService.error(localize('genericSaveError', "Failed to save '{0}': {1}", model.name, toErrorMessage(error, false))); + notificationService.error(localize({ key: 'genericSaveError', comment: ['{0} is the resource that failed to save and {1} the error message'] }, "Failed to save '{0}': {1}", model.name, toErrorMessage(error, false))); } }; })(); @@ -135,50 +135,58 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE private onWillRunWorkingCopyFileOperation(e: WorkingCopyFileEvent): void { // Move / Copy: remember models to restore after the operation - const source = e.source; - if (source && (e.operation === FileOperation.COPY || e.operation === FileOperation.MOVE)) { - - // find all models that related to either source or target (can be many if resource is a folder) - const sourceModels: TextFileEditorModel[] = []; - const targetModels: TextFileEditorModel[] = []; - for (const model of this.models) { - const resource = model.resource; - - if (extUri.isEqualOrParent(resource, e.target)) { - // EXPLICITLY do not ignorecase, see https://github.com/Microsoft/vscode/issues/56384 - targetModels.push(model); - } - - if (this.uriIdentityService.extUri.isEqualOrParent(resource, source)) { - sourceModels.push(model); - } - } - - // remember each source model to load again after move is done - // with optional content to restore if it was dirty + if (e.operation === FileOperation.MOVE || e.operation === FileOperation.COPY) { const modelsToRestore: { source: URI, target: URI, snapshot?: ITextSnapshot; mode?: string; encoding?: string; }[] = []; - for (const sourceModel of sourceModels) { - const sourceModelResource = sourceModel.resource; - // If the source is the actual model, just use target as new resource - let targetModelResource: URI; - if (this.uriIdentityService.extUri.isEqual(sourceModelResource, e.source)) { - targetModelResource = e.target; + for (const { source, target } of e.files) { + if (source) { + if (this.uriIdentityService.extUri.isEqual(source, target)) { + continue; // ignore if resources are considered equal + } + + // find all models that related to either source or target (can be many if resource is a folder) + const sourceModels: TextFileEditorModel[] = []; + const targetModels: TextFileEditorModel[] = []; + for (const model of this.models) { + const resource = model.resource; + + if (extUri.isEqualOrParent(resource, target)) { + // EXPLICITLY do not ignorecase, see https://github.com/Microsoft/vscode/issues/56384 + targetModels.push(model); + } + + if (this.uriIdentityService.extUri.isEqualOrParent(resource, source)) { + sourceModels.push(model); + } + } + + // remember each source model to load again after move is done + // with optional content to restore if it was dirty + for (const sourceModel of sourceModels) { + const sourceModelResource = sourceModel.resource; + + // If the source is the actual model, just use target as new resource + let targetModelResource: URI; + if (this.uriIdentityService.extUri.isEqual(sourceModelResource, source)) { + targetModelResource = target; + } + + // Otherwise a parent folder of the source is being moved, so we need + // to compute the target resource based on that + else { + targetModelResource = joinPath(target, sourceModelResource.path.substr(source.path.length + 1)); + } + + modelsToRestore.push({ + source: sourceModelResource, + target: targetModelResource, + mode: sourceModel.getMode(), + encoding: sourceModel.getEncoding(), + snapshot: sourceModel.isDirty() ? sourceModel.createSnapshot() : undefined + }); + } + } - - // Otherwise a parent folder of the source is being moved, so we need - // to compute the target resource based on that - else { - targetModelResource = joinPath(e.target, sourceModelResource.path.substr(source.path.length + 1)); - } - - modelsToRestore.push({ - source: sourceModelResource, - target: targetModelResource, - mode: sourceModel.getMode(), - encoding: sourceModel.getEncoding(), - snapshot: sourceModel.isDirty() ? sourceModel.createSnapshot() : undefined - }); } this.mapCorrelationIdToModelsToRestore.set(e.correlationId, modelsToRestore); @@ -188,13 +196,12 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE private onDidFailWorkingCopyFileOperation(e: WorkingCopyFileEvent): void { // Move / Copy: restore dirty flag on models to restore that were dirty - if ((e.operation === FileOperation.COPY || e.operation === FileOperation.MOVE)) { + if ((e.operation === FileOperation.MOVE || e.operation === FileOperation.COPY)) { const modelsToRestore = this.mapCorrelationIdToModelsToRestore.get(e.correlationId); if (modelsToRestore) { this.mapCorrelationIdToModelsToRestore.delete(e.correlationId); modelsToRestore.forEach(model => { - // snapshot presence means this model used to be dirty and so we restore that // flag. we do NOT have to restore the content because the model was only soft // reverted and did not loose its original dirty contents. @@ -207,40 +214,55 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE } private onDidRunWorkingCopyFileOperation(e: WorkingCopyFileEvent): void { + switch (e.operation) { - // Move / Copy: restore models that were loaded before the operation took place - if ((e.operation === FileOperation.COPY || e.operation === FileOperation.MOVE)) { - e.waitUntil((async () => { - const modelsToRestore = this.mapCorrelationIdToModelsToRestore.get(e.correlationId); - if (modelsToRestore) { - this.mapCorrelationIdToModelsToRestore.delete(e.correlationId); - - await Promise.all(modelsToRestore.map(async modelToRestore => { - - // restore the model, forcing a reload. this is important because - // we know the file has changed on disk after the move and the - // model might have still existed with the previous state. this - // ensures we are not tracking a stale state. - const restoredModel = await this.resolve(modelToRestore.target, { reload: { async: false }, encoding: modelToRestore.encoding }); - - // restore previous dirty content if any and ensure to mark the model as dirty - let textBufferFactory: ITextBufferFactory | undefined = undefined; - if (modelToRestore.snapshot) { - textBufferFactory = createTextBufferFactoryFromSnapshot(modelToRestore.snapshot); + // Create: Revert existing models + case FileOperation.CREATE: + e.waitUntil((async () => { + for (const { target } of e.files) { + const model = this.get(target); + if (model && !model.isDisposed()) { + await model.revert(); } + } + })()); + break; - // restore previous mode only if the mode is now unspecified - let preferredMode: string | undefined = undefined; - if (restoredModel.getMode() === PLAINTEXT_MODE_ID && modelToRestore.mode !== PLAINTEXT_MODE_ID) { - preferredMode = modelToRestore.mode; - } + // Move/Copy: restore models that were loaded before the operation took place + case FileOperation.MOVE: + case FileOperation.COPY: + e.waitUntil((async () => { + const modelsToRestore = this.mapCorrelationIdToModelsToRestore.get(e.correlationId); + if (modelsToRestore) { + this.mapCorrelationIdToModelsToRestore.delete(e.correlationId); - if (textBufferFactory || preferredMode) { - restoredModel.updateTextEditorModel(textBufferFactory, preferredMode); - } - })); - } - })()); + await Promise.all(modelsToRestore.map(async modelToRestore => { + + // restore the model, forcing a reload. this is important because + // we know the file has changed on disk after the move and the + // model might have still existed with the previous state. this + // ensures we are not tracking a stale state. + const restoredModel = await this.resolve(modelToRestore.target, { reload: { async: false }, encoding: modelToRestore.encoding }); + + // restore previous dirty content if any and ensure to mark the model as dirty + let textBufferFactory: ITextBufferFactory | undefined = undefined; + if (modelToRestore.snapshot) { + textBufferFactory = createTextBufferFactoryFromSnapshot(modelToRestore.snapshot); + } + + // restore previous mode only if the mode is now unspecified + let preferredMode: string | undefined = undefined; + if (restoredModel.getMode() === PLAINTEXT_MODE_ID && modelToRestore.mode !== PLAINTEXT_MODE_ID) { + preferredMode = modelToRestore.mode; + } + + if (textBufferFactory || preferredMode) { + restoredModel.updateTextEditorModel(textBufferFactory, preferredMode); + } + })); + } + })()); + break; } } diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts index 8d36fd9716e..078864f95f6 100644 --- a/src/vs/workbench/services/textfile/common/textfiles.ts +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { Event, IWaitUntil } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IEncodingSupport, IModeSupport, ISaveOptions, IRevertOptions, SaveReason } from 'vs/workbench/common/editor'; import { IBaseStatWithMetadata, IFileStatWithMetadata, IReadFileOptions, IWriteFileOptions, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; @@ -21,10 +21,6 @@ import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress'; export const ITextFileService = createDecorator('textFileService'); -export interface TextFileCreateEvent extends IWaitUntil { - readonly resource: URI; -} - export interface ITextFileService extends IDisposable { readonly _serviceBrand: undefined; @@ -95,11 +91,6 @@ export interface ITextFileService extends IDisposable { */ write(resource: URI, value: string | ITextSnapshot, options?: IWriteTextFileOptions): Promise; - /** - * An event that is fired after a text file has been created. - */ - readonly onDidCreateTextFile: Event; - /** * Create a file. If the file exists it will be overwritten with the contents if * the options enable to overwrite. @@ -171,7 +162,7 @@ export class TextFileOperationError extends FileOperationError { } export interface IResourceEncodings { - getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding; + getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): Promise; } export interface IResourceEncoding { diff --git a/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts b/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts index 557622abf89..81eb8b7192f 100644 --- a/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts +++ b/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts @@ -3,30 +3,20 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { tmpdir } from 'os'; import { localize } from 'vs/nls'; import { AbstractTextFileService } from 'vs/workbench/services/textfile/browser/textFileService'; -import { ITextFileService, ITextFileStreamContent, ITextFileContent, IResourceEncodings, IResourceEncoding, IReadTextFileOptions, IWriteTextFileOptions, stringToSnapshot, TextFileOperationResult, TextFileOperationError } from 'vs/workbench/services/textfile/common/textfiles'; +import { ITextFileService, ITextFileStreamContent, ITextFileContent, IReadTextFileOptions, IWriteTextFileOptions } from 'vs/workbench/services/textfile/common/textfiles'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { URI } from 'vs/base/common/uri'; -import { IFileStatWithMetadata, ICreateFileOptions, FileOperationError, FileOperationResult, IFileStreamContent, IFileService } from 'vs/platform/files/common/files'; +import { IFileStatWithMetadata, FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files'; import { Schemas } from 'vs/base/common/network'; -import { exists, stat, chmod, rimraf, MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/base/node/pfs'; +import { stat, chmod, MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/base/node/pfs'; import { join, dirname } from 'vs/base/common/path'; import { isMacintosh } from 'vs/base/common/platform'; import { IProductService } from 'vs/platform/product/common/productService'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { UTF8, UTF8_with_bom, UTF16be, UTF16le, encodingExists, encodeStream, UTF8_BOM, toDecodeStream, IDecodeStreamResult, detectEncodingByBOMFromBuffer, isUTFEncoding } from 'vs/base/node/encoding'; -import { WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; -import { joinPath, extname, isEqualOrParent } from 'vs/base/common/resources'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { VSBufferReadable, bufferToStream } from 'vs/base/common/buffer'; -import { Readable } from 'stream'; -import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; +import { UTF8, UTF8_with_bom } from 'vs/workbench/services/textfile/common/encoding'; import { ITextSnapshot } from 'vs/editor/common/model'; -import { nodeReadableToString, streamToNodeReadable, nodeStreamToVSBufferReadable } from 'vs/base/node/stream'; import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -66,72 +56,20 @@ export class NativeTextFileService extends AbstractTextFileService { super(fileService, untitledTextEditorService, lifecycleService, instantiationService, modelService, environmentService, dialogService, fileDialogService, textResourceConfigurationService, filesConfigurationService, textModelService, codeEditorService, pathService, workingCopyFileService, uriIdentityService); } - private _encoding: EncodingOracle | undefined; - get encoding(): EncodingOracle { - if (!this._encoding) { - this._encoding = this._register(this.instantiationService.createInstance(EncodingOracle)); - } - - return this._encoding; - } - async read(resource: URI, options?: IReadTextFileOptions): Promise { - const [bufferStream, decoder] = await this.doRead(resource, { - ...options, - // optimization: since we know that the caller does not - // care about buffering, we indicate this to the reader. - // this reduces all the overhead the buffered reading - // has (open, read, close) if the provider supports - // unbuffered reading. - preferUnbuffered: true - }); - return { - ...bufferStream, - encoding: decoder.detected.encoding || UTF8, - value: await nodeReadableToString(decoder.stream) - }; + // ensure size & memory limits + options = this.ensureLimits(options); + + return super.read(resource, options); } async readStream(resource: URI, options?: IReadTextFileOptions): Promise { - const [bufferStream, decoder] = await this.doRead(resource, options); - return { - ...bufferStream, - encoding: decoder.detected.encoding || UTF8, - value: await createTextBufferFactoryFromStream(decoder.stream) - }; - } - - private async doRead(resource: URI, options?: IReadTextFileOptions & { preferUnbuffered?: boolean }): Promise<[IFileStreamContent, IDecodeStreamResult]> { - - // ensure limits + // ensure size & memory limits options = this.ensureLimits(options); - // read stream raw (either buffered or unbuffered) - let bufferStream: IFileStreamContent; - if (options.preferUnbuffered) { - const content = await this.fileService.readFile(resource, options); - bufferStream = { - ...content, - value: bufferToStream(content.value) - }; - } else { - bufferStream = await this.fileService.readFileStream(resource, options); - } - - // read through encoding library - const decoder = await toDecodeStream(streamToNodeReadable(bufferStream.value), { - guessEncoding: options?.autoGuessEncoding || this.textResourceConfigurationService.getValue(resource, 'files.autoGuessEncoding'), - overwriteEncoding: detectedEncoding => this.encoding.getReadEncoding(resource, options, detectedEncoding) - }); - - // validate binary - if (options?.acceptTextOnly && decoder.detected.seemsBinary) { - throw new TextFileOperationError(localize('fileBinaryError', "File seems to be binary and cannot be opened as text"), TextFileOperationResult.FILE_IS_BINARY, options); - } - - return [bufferStream, decoder]; + return super.readStream(resource, options); } private ensureLimits(options?: IReadTextFileOptions): IReadTextFileOptions { @@ -155,31 +93,22 @@ export class NativeTextFileService extends AbstractTextFileService { } if (typeof ensuredLimits.memory !== 'number') { - ensuredLimits.memory = Math.max(typeof this.environmentService.args['max-memory'] === 'string' ? parseInt(this.environmentService.args['max-memory']) * 1024 * 1024 || 0 : 0, MAX_HEAP_SIZE); + const maxMemory = this.environmentService.args['max-memory']; + ensuredLimits.memory = Math.max( + typeof maxMemory === 'string' + ? parseInt(maxMemory) * 1024 * 1024 || 0 + : 0, MAX_HEAP_SIZE + ); } return ensuredOptions; } - protected async doCreate(resource: URI, value?: string, options?: ICreateFileOptions): Promise { - - // check for encoding - const { encoding, addBOM } = await this.encoding.getWriteEncoding(resource); - - // return to parent when encoding is standard - if (encoding === UTF8 && !addBOM) { - return super.doCreate(resource, value, options); - } - - // otherwise create with encoding - return this.fileService.createFile(resource, this.getEncodedReadable(value || '', encoding, addBOM), options); - } - async write(resource: URI, value: string | ITextSnapshot, options?: IWriteTextFileOptions): Promise { // check for overwriteReadonly property (only supported for local file://) try { - if (options?.overwriteReadonly && resource.scheme === Schemas.file && await exists(resource.fsPath)) { + if (options?.overwriteReadonly && resource.scheme === Schemas.file && await this.fileService.exists(resource)) { const fileStat = await stat(resource.fsPath); // try to change mode to writeable @@ -195,19 +124,7 @@ export class NativeTextFileService extends AbstractTextFileService { } try { - - // check for encoding - const { encoding, addBOM } = await this.encoding.getWriteEncoding(resource, options); - - // return to parent when encoding is standard - if (encoding === UTF8 && !addBOM) { - return await super.write(resource, value, options); - } - - // otherwise save with encoding - else { - return await this.fileService.writeFile(resource, this.getEncodedReadable(value, encoding, addBOM), options); - } + return super.write(resource, value, options); } catch (error) { // In case of permission denied, we need to check for readonly @@ -231,57 +148,26 @@ export class NativeTextFileService extends AbstractTextFileService { } } - private getEncodedReadable(value: string | ITextSnapshot, encoding: string, addBOM: boolean): VSBufferReadable { - const readable = this.snapshotToNodeReadable(typeof value === 'string' ? stringToSnapshot(value) : value); - const encoder = encodeStream(encoding, { addBOM }); - - const encodedReadable = readable.pipe(encoder); - - return nodeStreamToVSBufferReadable(encodedReadable, addBOM && isUTFEncoding(encoding) ? { encoding } : undefined); - } - - private snapshotToNodeReadable(snapshot: ITextSnapshot): Readable { - return new Readable({ - read: function () { - try { - let chunk: string | null = null; - let canPush = true; - - // Push all chunks as long as we can push and as long as - // the underlying snapshot returns strings to us - while (canPush && typeof (chunk = snapshot.read()) === 'string') { - canPush = this.push(chunk); - } - - // Signal EOS by pushing NULL - if (typeof chunk !== 'string') { - this.push(null); - } - } catch (error) { - this.emit('error', error); - } - }, - encoding: UTF8 // very important, so that strings are passed around and not buffers! - }); - } - private async writeElevated(resource: URI, value: string | ITextSnapshot, options?: IWriteTextFileOptions): Promise { // write into a tmp file first - const tmpPath = join(tmpdir(), `code-elevated-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 6)}`); + const source = URI.file(join(this.environmentService.userDataPath, `code-elevated-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 6)}`)); const { encoding, addBOM } = await this.encoding.getWriteEncoding(resource, options); - await this.write(URI.file(tmpPath), value, { encoding: encoding === UTF8 && addBOM ? UTF8_with_bom : encoding }); + try { + await this.write(source, value, { encoding: encoding === UTF8 && addBOM ? UTF8_with_bom : encoding }); - // sudo prompt copy - await this.sudoPromptCopy(tmpPath, resource.fsPath, options); + // sudo prompt copy + await this.sudoPromptCopy(source, resource, options); + } finally { - // clean up - await rimraf(tmpPath); + // clean up + await this.fileService.del(source); + } return this.fileService.resolve(resource, { resolveMetadata: true }); } - private async sudoPromptCopy(source: string, target: string, options?: IWriteTextFileOptions): Promise { + private async sudoPromptCopy(source: URI, target: URI, options?: IWriteTextFileOptions): Promise { // load sudo-prompt module lazy const sudoPrompt = await import('sudo-prompt'); @@ -297,7 +183,7 @@ export class NativeTextFileService extends AbstractTextFileService { sudoCommand.push('--file-chmod'); } - sudoCommand.push('--file-write', `"${source}"`, `"${target}"`); + sudoCommand.push('--file-write', `"${source.fsPath}"`, `"${target.fsPath}"`); sudoPrompt.exec(sudoCommand.join(' '), promptOptions, (error: string, stdout: string, stderr: string) => { if (stdout) { @@ -318,151 +204,4 @@ export class NativeTextFileService extends AbstractTextFileService { } } -export interface IEncodingOverride { - parent?: URI; - extension?: string; - encoding: string; -} - -export class EncodingOracle extends Disposable implements IResourceEncodings { - - private _encodingOverrides: IEncodingOverride[]; - protected get encodingOverrides(): IEncodingOverride[] { return this._encodingOverrides; } - protected set encodingOverrides(value: IEncodingOverride[]) { this._encodingOverrides = value; } - - constructor( - @ITextResourceConfigurationService private textResourceConfigurationService: ITextResourceConfigurationService, - @IEnvironmentService private environmentService: IEnvironmentService, - @IWorkspaceContextService private contextService: IWorkspaceContextService, - @IFileService private fileService: IFileService - ) { - super(); - - this._encodingOverrides = this.getDefaultEncodingOverrides(); - - this.registerListeners(); - } - - private registerListeners(): void { - - // Workspace Folder Change - this._register(this.contextService.onDidChangeWorkspaceFolders(() => this.encodingOverrides = this.getDefaultEncodingOverrides())); - } - - private getDefaultEncodingOverrides(): IEncodingOverride[] { - const defaultEncodingOverrides: IEncodingOverride[] = []; - - // Global settings - defaultEncodingOverrides.push({ parent: this.environmentService.userRoamingDataHome, encoding: UTF8 }); - - // Workspace files (via extension and via untitled workspaces location) - defaultEncodingOverrides.push({ extension: WORKSPACE_EXTENSION, encoding: UTF8 }); - defaultEncodingOverrides.push({ parent: this.environmentService.untitledWorkspacesHome, encoding: UTF8 }); - - // Folder Settings - this.contextService.getWorkspace().folders.forEach(folder => { - defaultEncodingOverrides.push({ parent: joinPath(folder.uri, '.vscode'), encoding: UTF8 }); - }); - - return defaultEncodingOverrides; - } - - async getWriteEncoding(resource: URI, options?: IWriteTextFileOptions): Promise<{ encoding: string, addBOM: boolean }> { - const { encoding, hasBOM } = this.getPreferredWriteEncoding(resource, options ? options.encoding : undefined); - - // Some encodings come with a BOM automatically - if (hasBOM) { - return { encoding, addBOM: true }; - } - - // Ensure that we preserve an existing BOM if found for UTF8 - // unless we are instructed to overwrite the encoding - const overwriteEncoding = options?.overwriteEncoding; - if (!overwriteEncoding && encoding === UTF8) { - try { - const buffer = (await this.fileService.readFile(resource, { length: UTF8_BOM.length })).value; - if (detectEncodingByBOMFromBuffer(buffer, buffer.byteLength) === UTF8_with_bom) { - return { encoding, addBOM: true }; - } - } catch (error) { - // ignore - file might not exist - } - } - - return { encoding, addBOM: false }; - } - - getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding { - const resourceEncoding = this.getEncodingForResource(resource, preferredEncoding); - - return { - encoding: resourceEncoding, - hasBOM: resourceEncoding === UTF16be || resourceEncoding === UTF16le || resourceEncoding === UTF8_with_bom // enforce BOM for certain encodings - }; - } - - getReadEncoding(resource: URI, options: IReadTextFileOptions | undefined, detectedEncoding: string | null): string { - let preferredEncoding: string | undefined; - - // Encoding passed in as option - if (options?.encoding) { - if (detectedEncoding === UTF8_with_bom && options.encoding === UTF8) { - preferredEncoding = UTF8_with_bom; // indicate the file has BOM if we are to resolve with UTF 8 - } else { - preferredEncoding = options.encoding; // give passed in encoding highest priority - } - } - - // Encoding detected - else if (detectedEncoding) { - preferredEncoding = detectedEncoding; - } - - // Encoding configured - else if (this.textResourceConfigurationService.getValue(resource, 'files.encoding') === UTF8_with_bom) { - preferredEncoding = UTF8; // if we did not detect UTF 8 BOM before, this can only be UTF 8 then - } - - return this.getEncodingForResource(resource, preferredEncoding); - } - - private getEncodingForResource(resource: URI, preferredEncoding?: string): string { - let fileEncoding: string; - - const override = this.getEncodingOverride(resource); - if (override) { - fileEncoding = override; // encoding override always wins - } else if (preferredEncoding) { - fileEncoding = preferredEncoding; // preferred encoding comes second - } else { - fileEncoding = this.textResourceConfigurationService.getValue(resource, 'files.encoding'); // and last we check for settings - } - - if (!fileEncoding || !encodingExists(fileEncoding)) { - fileEncoding = UTF8; // the default is UTF 8 - } - - return fileEncoding; - } - - private getEncodingOverride(resource: URI): string | undefined { - if (this.encodingOverrides && this.encodingOverrides.length) { - for (const override of this.encodingOverrides) { - - // check if the resource is child of encoding override path - if (override.parent && isEqualOrParent(resource, override.parent)) { - return override.encoding; - } - - // check if the resource extension is equal to encoding override - if (override.extension && extname(resource) === `.${override.extension}`) { - return override.encoding; - } - } - } - - return undefined; - } -} - registerSingleton(ITextFileService, NativeTextFileService); diff --git a/src/vs/workbench/services/textfile/test/browser/browserTextFileService.io.test.ts b/src/vs/workbench/services/textfile/test/browser/browserTextFileService.io.test.ts new file mode 100644 index 00000000000..031c61de33f --- /dev/null +++ b/src/vs/workbench/services/textfile/test/browser/browserTextFileService.io.test.ts @@ -0,0 +1,115 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { workbenchInstantiationService, TestInMemoryFileSystemProvider, TestBrowserTextFileServiceWithEncodingOverrides } from 'vs/workbench/test/browser/workbenchTestServices'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { FileService } from 'vs/platform/files/common/fileService'; +import { Schemas } from 'vs/base/common/network'; +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IFileService, IStat } from 'vs/platform/files/common/files'; +import { URI } from 'vs/base/common/uri'; +import { join } from 'vs/base/common/path'; +import { UTF16le, detectEncodingByBOMFromBuffer, UTF8_with_bom, UTF16be, toCanonicalName } from 'vs/workbench/services/textfile/common/encoding'; +import { VSBuffer } from 'vs/base/common/buffer'; +import files from 'vs/workbench/services/textfile/test/browser/fixtures/files'; +import createSuite from 'vs/workbench/services/textfile/test/common/textFileService.io.test'; +import { isWeb } from 'vs/base/common/platform'; +import { IWorkingCopyFileService, WorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; +import { TestWorkingCopyService } from 'vs/workbench/test/common/workbenchTestServices'; +import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; + +// optimization: we don't need to run this suite in native environment, +// because we have nativeTextFileService.io.test.ts for it, +// so our tests run faster +if (isWeb) { + suite('Files - BrowserTextFileService i/o', function () { + const disposables = new DisposableStore(); + + let service: ITextFileService; + let fileProvider: TestInMemoryFileSystemProvider; + const testDir = 'test'; + + createSuite({ + setup: async () => { + const instantiationService = workbenchInstantiationService(); + + const logService = new NullLogService(); + const fileService = new FileService(logService); + + fileProvider = new TestInMemoryFileSystemProvider(); + disposables.add(fileService.registerProvider(Schemas.file, fileProvider)); + disposables.add(fileProvider); + + const collection = new ServiceCollection(); + collection.set(IFileService, fileService); + + collection.set(IWorkingCopyFileService, new WorkingCopyFileService(fileService, new TestWorkingCopyService(), instantiationService, new UriIdentityService(fileService))); + + service = instantiationService.createChild(collection).createInstance(TestBrowserTextFileServiceWithEncodingOverrides); + + await fileProvider.mkdir(URI.file(testDir)); + for (let fileName in files) { + await fileProvider.writeFile( + URI.file(join(testDir, fileName)), + files[fileName], + { create: true, overwrite: false } + ); + } + + return { service, testDir }; + }, + + teardown: async () => { + (service.files).dispose(); + + disposables.clear(); + }, + + exists, + stat, + readFile, + detectEncodingByBOM + }); + + async function exists(fsPath: string): Promise { + try { + await fileProvider.readFile(URI.file(fsPath)); + return true; + } + catch (e) { + return false; + } + } + + async function readFile(fsPath: string): Promise; + async function readFile(fsPath: string, encoding: string): Promise; + async function readFile(fsPath: string, encoding?: string): Promise { + const file = await fileProvider.readFile(URI.file(fsPath)); + + if (!encoding) { + return VSBuffer.wrap(file); + } + + return new TextDecoder(toCanonicalName(encoding)).decode(file); + } + + async function stat(fsPath: string): Promise { + return fileProvider.stat(URI.file(fsPath)); + } + + async function detectEncodingByBOM(fsPath: string): Promise { + try { + const buffer = await readFile(fsPath); + + return detectEncodingByBOMFromBuffer(buffer.slice(0, 3), 3); + } catch (error) { + return null; // ignore errors (like file not found) + } + } + }); +} diff --git a/src/vs/workbench/services/textfile/test/browser/fixtures/files.ts b/src/vs/workbench/services/textfile/test/browser/fixtures/files.ts new file mode 100644 index 00000000000..f3d0c5d6cd2 --- /dev/null +++ b/src/vs/workbench/services/textfile/test/browser/fixtures/files.ts @@ -0,0 +1,421 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { range } from 'vs/base/common/arrays'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { UTF8_BOM } from 'vs/workbench/services/textfile/common/encoding'; + +const fixtures: { [filename: string]: Uint8Array } = {}; + +export default fixtures; + +// encoded from 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя' +fixtures['some_cyrillic.txt'] = Uint8Array.from([...range(128, 175 + 1), ...range(224, 239 + 1)]); + +// encoded from '中国abc' +fixtures['some_gbk.txt'] = Uint8Array.from([214, 208, 185, 250, 97, 98, 99]); + +// encoded from '中文abc' +fixtures['some_big5.txt'] = Uint8Array.from([164, 164, 164, 229, 97, 98, 99]); + +// encoded from '中文abc' +fixtures['some_shiftjis.txt'] = Uint8Array.from([146, 134, 149, 182, 97, 98, 99]); + +// encoded from 'ObjectCount = LoadObjects("Öffentlicher Ordner");\nPrivate = "Persönliche Information"' +fixtures['some_cp1252.txt'] = Uint8Array.from([ + 79, 98, 106, 101, 99, 116, 67, 111, 117, 110, 116, 32, 61, 32, 76, 111, 97, 100, 79, 98, 106, 101, 99, 116, 115, 40, 34, 214, 102, 102, 101, 110, 116, 108, 105, 99, 104, 101, 114, 32, 79, 114, 100, 110, 101, 114, 34, 41, 59, 10, 10, 80, 114, 105, 118, 97, 116, 101, 32, 61, 32, 34, 80, 101, 114, 115, 246, 110, 108, 105, 99, 104, 101, 32, 73, 110, 102, 111, 114, 109, 97, 116, 105, 111, 110, 34, 10 +]); + +// encoded from 'Private = "Persönliche Information"' +fixtures['some_small_cp1252.txt'] = Uint8Array.from([ + 80, 114, 105, 118, 97, 116, 101, 32, 61, 32, 34, 80, 101, 114, 115, 246, 110, 108, 105, 99, 104, 101, 223, 32, 73, 110, 102, 111, 114, 109, 97, 116, 105, 111, 110, 34 +]); + +// encoded from 'This is some UTF 8 with BOM file.' +fixtures['some_utf8_bom.txt'] = Uint8Array.from([ + 239, 187, 191, 84, 104, 105, 115, 32, 105, 115, 32, 115, 111, 109, 101, 32, 85, 84, 70, 32, 56, 32, 119, 105, 116, 104, 32, 66, 79, 77, 32, 102, 105, 108, 101, 46 +]); + +// encoded from 'This is some UTF 16 with BOM file.' +fixtures['some.utf16le'] = Uint8Array.from([ + 255, 254, 84, 0, 104, 0, 105, 0, 115, 0, 32, 0, 105, 0, 115, 0, 32, 0, 115, 0, 111, 0, 109, 0, 101, 0, 32, 0, 85, 0, 84, 0, 70, 0, 32, 0, 49, 0, 54, 0, 32, 0, 119, 0, 105, 0, 116, 0, 104, 0, 32, 0, 66, 0, 79, 0, 77, 0, 32, 0, 102, 0, 105, 0, 108, 0, 101, 0, 46, 0 +]); + +// encoded from 'this is utf-16 be without böm' +fixtures['utf16_be_nobom.txt'] = Uint8Array.from([ + 0, 116, 0, 104, 0, 105, 0, 115, 0, 32, 0, 105, 0, 115, 0, 32, 0, 117, 0, 116, 0, 102, 0, 45, 0, 49, 0, 54, 0, 32, 0, 98, 0, 101, 0, 32, 0, 119, 0, 105, 0, 116, 0, 104, 0, 111, 0, 117, 0, 116, 0, 32, 0, 98, 0, 246, 0, 109 +]); + +// encoded from 'this is utf-16 le without böm' +fixtures['utf16_le_nobom.txt'] = Uint8Array.from([ + 116, 0, 104, 0, 105, 0, 115, 0, 32, 0, 105, 0, 115, 0, 32, 0, 117, 0, 116, 0, 102, 0, 45, 0, 49, 0, 54, 0, 32, 0, 108, 0, 101, 0, 32, 0, 119, 0, 105, 0, 116, 0, 104, 0, 111, 0, 117, 0, 116, 0, 32, 0, 98, 0, 246, 0, 109, 0 +]); + +// encoded from 'Small file' +fixtures['small.txt'] = Uint8Array.from([83, 109, 97, 108, 108, 32, 102, 105, 108, 101]); + +fixtures['binary.txt'] = Uint8Array.from([ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 73, 0, 0, 0, 67, 8, 2, 0, 0, 0, 95, 138, 191, 237, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, 177, 143, 11, 252, 97, 5, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 14, 195, 0, 0, 14, 195, 1, 199, 111, 168, 100, 0, 0, 0, 71, 116, 69, 88, 116, 83, 111, 117, 114, 99, 101, 0, 83, 104, 111, 116, 116, 121, 32, 118, 50, 46, 48, 46, 50, 46, 50, 49, 54, 32, 40, 67, 41, 32, 84, 104, 111, 109, 97, 115, 32, 66, 97, 117, 109, 97, 110, 110, 32, 45, 32, 104, 116, 116, 112, 58, 47, 47, 115, 104, 111, 116, 116, 121, 46, 100, 101, 118, 115, 45, 111, 110, 46, 110, 101, 116, 44, 132, 21, 213, 0, 0, 0, 84, 73, 68, 65, 84, 120, 218, 237, 207, 65, 17, 0, 0, 12, 2, 32, 211, 217, 63, 146, 37, 246, 218, 65, 3, 210, 191, 226, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 118, 100, 169, 4, 173, 8, 44, 248, 184, 40, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130 +]); + +fixtures['some_utf16le.css'] = Uint8Array.from([ + 255, 254, 47, 0, 42, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 13, 0, 10, 0, 84, 0, 104, 0, 101, 0, 32, 0, 98, 0, 97, 0, 115, 0, 101, 0, 32, 0, 99, 0, 111, 0, 108, 0, 111, 0, 114, 0, 32, 0, 102, 0, 111, 0, 114, 0, 32, 0, 116, 0, 104, 0, 105, 0, 115, 0, 32, 0, 116, 0, 101, 0, 109, 0, 112, 0, 108, 0, 97, 0, 116, 0, 101, 0, 32, 0, 105, 0, 115, 0, 32, 0, 35, 0, 53, 0, 99, 0, 56, 0, 55, 0, 98, 0, 50, 0, 46, 0, 32, 0, 73, 0, 102, 0, 32, 0, 121, 0, 111, 0, 117, 0, 39, 0, 100, 0, 32, 0, 108, 0, 105, 0, 107, 0, 101, 0, 13, 0, 10, 0, 116, 0, 111, 0, 32, 0, 117, 0, 115, 0, 101, 0, 32, 0, 97, 0, 32, 0, 100, 0, 105, 0, 102, 0, 102, 0, 101, 0, 114, 0, 101, 0, 110, 0, 116, 0, 32, 0, 99, 0, 111, 0, 108, 0, 111, 0, 114, 0, 32, 0, 115, 0, 116, 0, 97, 0, 114, 0, 116, 0, 32, 0, 98, 0, 121, 0, 32, 0, 114, 0, 101, 0, 112, 0, 108, 0, 97, 0, 99, 0, 105, 0, 110, 0, 103, 0, 32, 0, 97, 0, 108, 0, 108, 0, 32, 0, 105, 0, 110, 0, 115, 0, 116, 0, 97, 0, 110, 0, 99, 0, 101, 0, 115, 0, 32, 0, 111, 0, 102, 0, 13, 0, 10, 0, 35, 0, 53, 0, 99, 0, 56, 0, 55, 0, 98, 0, 50, 0, 32, 0, 119, 0, 105, 0, 116, 0, 104, 0, 32, 0, 121, 0, 111, 0, 117, 0, 114, 0, 32, 0, 110, 0, 101, 0, 119, 0, 32, 0, 99, 0, 111, 0, 108, 0, 111, 0, 114, 0, 46, 0, 13, 0, 10, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 42, 0, 47, 0, 13, 0, 10, 0, 98, 0, 111, 0, 100, 0, 121, 0, 13, 0, 10, 0, 123, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 98, 0, 97, 0, 99, 0, 107, 0, 103, 0, 114, 0, 111, 0, 117, 0, 110, 0, 100, 0, 45, 0, 99, 0, 111, 0, 108, 0, 111, 0, 114, 0, 58, 0, 32, 0, 35, 0, 53, 0, 99, 0, 56, 0, 55, 0, 98, 0, 50, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 102, 0, 111, 0, 110, 0, 116, 0, 45, 0, 115, 0, 105, 0, 122, 0, 101, 0, 58, 0, 32, 0, 46, 0, 55, 0, 53, 0, 101, 0, 109, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 102, 0, 111, 0, 110, 0, 116, 0, 45, 0, 102, 0, 97, 0, 109, 0, 105, 0, 108, 0, 121, 0, 58, 0, 32, 0, 83, 0, 101, 0, 103, 0, 111, 0, 101, 0, 32, 0, 85, 0, 73, 0, 44, 0, 32, 0, 86, 0, 101, 0, 114, 0, 100, 0, 97, 0, 110, 0, 97, 0, 44, 0, 32, 0, 72, 0, 101, 0, 108, 0, 118, 0, 101, 0, 116, 0, 105, 0, 99, 0, 97, 0, 44, 0, 32, 0, 83, 0, 97, 0, 110, 0, 115, 0, 45, 0, 83, 0, 101, 0, 114, 0, 105, 0, 102, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 109, 0, 97, 0, 114, 0, 103, 0, 105, 0, 110, 0, 58, 0, 32, 0, 56, 0, 112, 0, 120, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 112, 0, 97, 0, 100, 0, 100, 0, 105, 0, 110, 0, 103, 0, 58, 0, 32, 0, 48, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 99, 0, 111, 0, 108, 0, 111, 0, 114, 0, 58, 0, 32, 0, 35, 0, 54, 0, 57, 0, 54, 0, 57, 0, 54, 0, 57, 0, 59, 0, 13, 0, 10, 0, 125, 0, 13, 0, 10, 0, 13, 0, 10, 0, 104, 0, 49, 0, 44, 0, 32, 0, 104, 0, 50, 0, 44, 0, 32, 0, 104, 0, 51, 0, 44, 0, 32, 0, 104, 0, 52, 0, 44, 0, 32, 0, 104, 0, 53, 0, 44, 0, 32, 0, 104, 0, 54, 0, 13, 0, 10, 0, 123, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 99, 0, 111, 0, 108, 0, 111, 0, 114, 0, 58, 0, 32, 0, 35, 0, 48, 0, 48, 0, 48, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 102, 0, 111, 0, 110, 0, 116, 0, 45, 0, 115, 0, 105, 0, 122, 0, 101, 0, 58, 0, 32, 0, 52, 0, 48, 0, 112, 0, 120, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 109, 0, 97, 0, 114, 0, 103, 0, 105, 0, 110, 0, 58, 0, 32, 0, 48, 0, 112, 0, 120, 0, 59, 0, 13, 0, 10, 0, 125, 0, 13, 0, 10, 0, 13, 0, 10, 0, 116, 0, 101, 0, 120, 0, 116, 0, 97, 0, 114, 0, 101, 0, 97, 0, 32, 0, 13, 0, 10, 0, 123, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 102, 0, 111, 0, 110, 0, 116, 0, 45, 0, 102, 0, 97, 0, 109, 0, 105, 0, 108, 0, 121, 0, 58, 0, 32, 0, 67, 0, 111, 0, 110, 0, 115, 0, 111, 0, 108, 0, 97, 0, 115, 0, 13, 0, 10, 0, 125, 0, 13, 0, 10, 0, 13, 0, 10, 0, 35, 0, 114, 0, 101, 0, 115, 0, 117, 0, 108, 0, 116, 0, 115, 0, 32, 0, 13, 0, 10, 0, 123, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 109, 0, 97, 0, 114, 0, 103, 0, 105, 0, 110, 0, 45, 0, 116, 0, 111, 0, 112, 0, 58, 0, 32, 0, 50, 0, 101, 0, 109, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 109, 0, 97, 0, 114, 0, 103, 0, 105, 0, 110, 0, 45, 0, 108, 0, 101, 0, 102, 0, 116, 0, 58, 0, 32, 0, 50, 0, 101, 0, 109, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 99, 0, 111, 0, 108, 0, 111, 0, 114, 0, 58, 0, 32, 0, 98, 0, 108, 0, 97, 0, 99, 0, 107, 0, 59, 0, 13, 0, 10, 0, 32, 0, 32, 0, 32, 0, 32, 0, 102, 0, 111, 0, 110, 0, 116, 0, 45, 0, 115, 0, 105, 0, 122, 0, 101, 0, 58, 0, 32, 0, 109, 0, 101, 0, 100, 0, 105, 0, 117, 0, 109, 0, 59, 0, 13, 0, 10, 0, 125, 0, 13, 0, 10, 0, 13, 0, 10, 0 +]); + +fixtures['index.html'] = Uint8Array.from([ + 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 62, 10, 60, 104, 101, 97, 100, 32, 105, 100, 61, 39, 104, 101, 97, 100, 73, 68, 39, 62, 10, 32, 32, 32, 32, 60, 109, 101, 116, 97, 32, 104, 116, 116, 112, 45, 101, 113, 117, 105, 118, 61, 34, 88, 45, 85, 65, 45, 67, 111, 109, 112, 97, 116, 105, 98, 108, 101, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, 73, 69, 61, 101, 100, 103, 101, 34, 32, 47, 62, 10, 32, 32, 32, 32, 60, 116, 105, 116, 108, 101, 62, 83, 116, 114, 97, 100, 97, 32, 60, 47, 116, 105, 116, 108, 101, 62, 10, 32, 32, 32, 32, 60, 108, 105, 110, 107, 32, 104, 114, 101, 102, 61, 34, 115, 105, 116, 101, 46, 99, 115, 115, 34, 32, 114, 101, 108, 61, 34, 115, 116, 121, 108, 101, 115, 104, 101, 101, 116, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 99, 115, 115, 34, 32, 47, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 106, 113, 117, 101, 114, 121, 45, 49, 46, 52, 46, 49, 46, 106, 115, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 46, 46, 47, 99, 111, 109, 112, 105, 108, 101, 114, 47, 100, 116, 114, 101, 101, 46, 106, 115, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 46, 46, 47, 99, 111, 109, 112, 105, 108, 101, 114, 47, 116, 121, 112, 101, 115, 99, 114, 105, 112, 116, 46, 106, 115, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 10, 10, 32, 32, 32, 32, 47, 47, 32, 67, 111, 109, 112, 105, 108, 101, 32, 115, 116, 114, 97, 100, 97, 32, 115, 111, 117, 114, 99, 101, 32, 105, 110, 116, 111, 32, 114, 101, 115, 117, 108, 116, 105, 110, 103, 32, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 10, 32, 32, 32, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 99, 111, 109, 112, 105, 108, 101, 40, 112, 114, 111, 103, 44, 32, 108, 105, 98, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 111, 117, 116, 102, 105, 108, 101, 32, 61, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 111, 117, 114, 99, 101, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 87, 114, 105, 116, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 32, 116, 104, 105, 115, 46, 115, 111, 117, 114, 99, 101, 32, 43, 61, 32, 115, 59, 32, 125, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 87, 114, 105, 116, 101, 76, 105, 110, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 32, 116, 104, 105, 115, 46, 115, 111, 117, 114, 99, 101, 32, 43, 61, 32, 115, 32, 43, 32, 34, 92, 114, 34, 59, 32, 125, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 32, 61, 32, 91, 93, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 99, 111, 109, 112, 105, 108, 101, 114, 61, 110, 101, 119, 32, 84, 111, 111, 108, 115, 46, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 67, 111, 109, 112, 105, 108, 101, 114, 40, 111, 117, 116, 102, 105, 108, 101, 44, 116, 114, 117, 101, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 115, 101, 116, 69, 114, 114, 111, 114, 67, 97, 108, 108, 98, 97, 99, 107, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 115, 116, 97, 114, 116, 44, 108, 101, 110, 44, 32, 109, 101, 115, 115, 97, 103, 101, 41, 32, 123, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 46, 112, 117, 115, 104, 40, 123, 115, 116, 97, 114, 116, 58, 115, 116, 97, 114, 116, 44, 32, 108, 101, 110, 58, 108, 101, 110, 44, 32, 109, 101, 115, 115, 97, 103, 101, 58, 109, 101, 115, 115, 97, 103, 101, 125, 41, 59, 32, 125, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 97, 100, 100, 85, 110, 105, 116, 40, 108, 105, 98, 84, 101, 120, 116, 44, 34, 108, 105, 98, 46, 116, 115, 34, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 97, 100, 100, 85, 110, 105, 116, 40, 112, 114, 111, 103, 44, 34, 105, 110, 112, 117, 116, 46, 116, 115, 34, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 116, 121, 112, 101, 67, 104, 101, 99, 107, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 101, 109, 105, 116, 40, 41, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 40, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 46, 108, 101, 110, 103, 116, 104, 32, 62, 32, 48, 32, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 116, 104, 114, 111, 119, 32, 110, 101, 119, 32, 69, 114, 114, 111, 114, 40, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 9, 119, 104, 105, 108, 101, 40, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 91, 48, 93, 32, 61, 61, 32, 39, 47, 39, 32, 38, 38, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 91, 49, 93, 32, 61, 61, 32, 39, 47, 39, 32, 38, 38, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 91, 50, 93, 32, 61, 61, 32, 39, 32, 39, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 32, 61, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 46, 115, 108, 105, 99, 101, 40, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 46, 105, 110, 100, 101, 120, 79, 102, 40, 39, 92, 114, 39, 41, 43, 49, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 101, 114, 114, 111, 114, 80, 114, 101, 102, 105, 120, 32, 61, 32, 34, 34, 59, 10, 9, 102, 111, 114, 40, 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 105, 60, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 46, 108, 101, 110, 103, 116, 104, 59, 105, 43, 43, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 101, 114, 114, 111, 114, 80, 114, 101, 102, 105, 120, 32, 43, 61, 32, 34, 47, 47, 32, 69, 114, 114, 111, 114, 58, 32, 40, 34, 32, 43, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 91, 105, 93, 46, 115, 116, 97, 114, 116, 32, 43, 32, 34, 44, 34, 32, 43, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 91, 105, 93, 46, 108, 101, 110, 32, 43, 32, 34, 41, 32, 34, 32, 43, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 91, 105, 93, 46, 109, 101, 115, 115, 97, 103, 101, 32, 43, 32, 34, 92, 114, 34, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 101, 114, 114, 111, 114, 80, 114, 101, 102, 105, 120, 32, 43, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 59, 10, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 10, 9, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 108, 105, 98, 84, 101, 120, 116, 32, 61, 32, 34, 34, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 36, 46, 103, 101, 116, 40, 34, 46, 46, 47, 99, 111, 109, 112, 105, 108, 101, 114, 47, 108, 105, 98, 46, 116, 115, 34, 44, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 110, 101, 119, 76, 105, 98, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 108, 105, 98, 84, 101, 120, 116, 32, 61, 32, 110, 101, 119, 76, 105, 98, 84, 101, 120, 116, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 59, 9, 10, 32, 32, 32, 32, 32, 32, 32, 32, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, 101, 120, 101, 99, 117, 116, 101, 32, 116, 104, 101, 32, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 32, 105, 110, 32, 116, 104, 101, 32, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 32, 112, 97, 110, 101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 101, 120, 101, 99, 117, 116, 101, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 40, 39, 35, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 39, 41, 46, 116, 101, 120, 116, 40, 34, 82, 117, 110, 110, 105, 110, 103, 46, 46, 46, 34, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 116, 120, 116, 32, 61, 32, 36, 40, 39, 35, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 39, 41, 46, 118, 97, 108, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 114, 101, 115, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 116, 114, 121, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 114, 101, 116, 32, 61, 32, 101, 118, 97, 108, 40, 116, 120, 116, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 115, 32, 61, 32, 34, 82, 97, 110, 32, 115, 117, 99, 99, 101, 115, 115, 102, 117, 108, 108, 121, 33, 34, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, 40, 101, 41, 32, 123, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 115, 32, 61, 32, 34, 69, 120, 99, 101, 112, 116, 105, 111, 110, 32, 116, 104, 114, 111, 119, 110, 58, 32, 34, 32, 43, 32, 101, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 40, 39, 35, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 39, 41, 46, 116, 101, 120, 116, 40, 83, 116, 114, 105, 110, 103, 40, 114, 101, 115, 41, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, 114, 101, 99, 111, 109, 112, 105, 108, 101, 32, 116, 104, 101, 32, 115, 116, 114, 97, 100, 97, 83, 114, 99, 32, 97, 110, 100, 32, 112, 111, 112, 117, 108, 97, 116, 101, 32, 116, 104, 101, 32, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 32, 112, 97, 110, 101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, 114, 99, 85, 112, 100, 97, 116, 101, 100, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 110, 101, 119, 84, 101, 120, 116, 32, 61, 32, 36, 40, 39, 35, 115, 116, 114, 97, 100, 97, 83, 114, 99, 39, 41, 46, 118, 97, 108, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 116, 114, 121, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 32, 61, 32, 99, 111, 109, 112, 105, 108, 101, 40, 110, 101, 119, 84, 101, 120, 116, 44, 32, 108, 105, 98, 84, 101, 120, 116, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, 32, 40, 101, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 32, 61, 32, 34, 47, 47, 80, 97, 114, 115, 101, 32, 101, 114, 114, 111, 114, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 118, 97, 114, 32, 105, 32, 105, 110, 32, 101, 41, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 32, 43, 61, 32, 34, 92, 114, 47, 47, 32, 34, 32, 43, 32, 101, 91, 105, 93, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 40, 39, 35, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 39, 41, 46, 118, 97, 108, 40, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, 80, 111, 112, 117, 108, 97, 116, 101, 32, 116, 104, 101, 32, 115, 116, 114, 97, 100, 97, 83, 114, 99, 32, 112, 97, 110, 101, 32, 119, 105, 116, 104, 32, 111, 110, 101, 32, 111, 102, 32, 116, 104, 101, 32, 98, 117, 105, 108, 116, 32, 105, 110, 32, 115, 97, 109, 112, 108, 101, 115, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 101, 120, 97, 109, 112, 108, 101, 83, 101, 108, 101, 99, 116, 105, 111, 110, 67, 104, 97, 110, 103, 101, 100, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 101, 120, 97, 109, 112, 108, 101, 115, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 101, 120, 97, 109, 112, 108, 101, 115, 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 115, 101, 108, 101, 99, 116, 101, 100, 69, 120, 97, 109, 112, 108, 101, 32, 61, 32, 101, 120, 97, 109, 112, 108, 101, 115, 46, 111, 112, 116, 105, 111, 110, 115, 91, 101, 120, 97, 109, 112, 108, 101, 115, 46, 115, 101, 108, 101, 99, 116, 101, 100, 73, 110, 100, 101, 120, 93, 46, 118, 97, 108, 117, 101, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 115, 101, 108, 101, 99, 116, 101, 100, 69, 120, 97, 109, 112, 108, 101, 32, 33, 61, 32, 34, 34, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 46, 103, 101, 116, 40, 39, 101, 120, 97, 109, 112, 108, 101, 115, 47, 39, 32, 43, 32, 115, 101, 108, 101, 99, 116, 101, 100, 69, 120, 97, 109, 112, 108, 101, 44, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 114, 99, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 40, 39, 35, 115, 116, 114, 97, 100, 97, 83, 114, 99, 39, 41, 46, 118, 97, 108, 40, 115, 114, 99, 84, 101, 120, 116, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 101, 116, 84, 105, 109, 101, 111, 117, 116, 40, 115, 114, 99, 85, 112, 100, 97, 116, 101, 100, 44, 49, 48, 48, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 44, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 101, 114, 114, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 101, 114, 114, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 60, 47, 104, 101, 97, 100, 62, 10, 60, 98, 111, 100, 121, 62, 10, 32, 32, 32, 32, 60, 104, 49, 62, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 60, 47, 104, 49, 62, 10, 32, 32, 32, 32, 60, 98, 114, 32, 47, 62, 10, 32, 32, 32, 32, 60, 115, 101, 108, 101, 99, 116, 32, 105, 100, 61, 34, 101, 120, 97, 109, 112, 108, 101, 115, 34, 32, 111, 110, 99, 104, 97, 110, 103, 101, 61, 39, 101, 120, 97, 109, 112, 108, 101, 83, 101, 108, 101, 99, 116, 105, 111, 110, 67, 104, 97, 110, 103, 101, 100, 40, 41, 39, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 34, 62, 83, 101, 108, 101, 99, 116, 46, 46, 46, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 115, 109, 97, 108, 108, 46, 116, 115, 34, 62, 83, 109, 97, 108, 108, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 101, 109, 112, 108, 111, 121, 101, 101, 46, 116, 115, 34, 62, 69, 109, 112, 108, 111, 121, 101, 101, 115, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 99, 111, 110, 119, 97, 121, 46, 116, 115, 34, 62, 67, 111, 110, 119, 97, 121, 32, 71, 97, 109, 101, 32, 111, 102, 32, 76, 105, 102, 101, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 116, 121, 112, 101, 115, 99, 114, 105, 112, 116, 46, 116, 115, 34, 62, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 32, 67, 111, 109, 112, 105, 108, 101, 114, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 60, 47, 115, 101, 108, 101, 99, 116, 62, 10, 10, 32, 32, 32, 32, 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 101, 120, 116, 97, 114, 101, 97, 32, 105, 100, 61, 39, 115, 116, 114, 97, 100, 97, 83, 114, 99, 39, 32, 114, 111, 119, 115, 61, 39, 52, 48, 39, 32, 99, 111, 108, 115, 61, 39, 56, 48, 39, 32, 111, 110, 99, 104, 97, 110, 103, 101, 61, 39, 115, 114, 99, 85, 112, 100, 97, 116, 101, 100, 40, 41, 39, 32, 111, 110, 107, 101, 121, 117, 112, 61, 39, 115, 114, 99, 85, 112, 100, 97, 116, 101, 100, 40, 41, 39, 32, 115, 112, 101, 108, 108, 99, 104, 101, 99, 107, 61, 34, 102, 97, 108, 115, 101, 34, 62, 10, 47, 47, 84, 121, 112, 101, 32, 121, 111, 117, 114, 32, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 32, 104, 101, 114, 101, 46, 46, 46, 10, 32, 32, 32, 32, 32, 32, 60, 47, 116, 101, 120, 116, 97, 114, 101, 97, 62, 10, 32, 32, 32, 32, 32, 32, 60, 116, 101, 120, 116, 97, 114, 101, 97, 32, 105, 100, 61, 39, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 39, 32, 114, 111, 119, 115, 61, 39, 52, 48, 39, 32, 99, 111, 108, 115, 61, 39, 56, 48, 39, 32, 115, 112, 101, 108, 108, 99, 104, 101, 99, 107, 61, 34, 102, 97, 108, 115, 101, 34, 62, 10, 47, 47, 67, 111, 109, 112, 105, 108, 101, 100, 32, 99, 111, 100, 101, 32, 119, 105, 108, 108, 32, 115, 104, 111, 119, 32, 117, 112, 32, 104, 101, 114, 101, 46, 46, 46, 10, 32, 32, 32, 32, 32, 32, 60, 47, 116, 101, 120, 116, 97, 114, 101, 97, 62, 10, 32, 32, 32, 32, 32, 32, 60, 98, 114, 32, 47, 62, 10, 32, 32, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, 110, 32, 111, 110, 99, 108, 105, 99, 107, 61, 39, 101, 120, 101, 99, 117, 116, 101, 40, 41, 39, 47, 62, 82, 117, 110, 60, 47, 98, 117, 116, 116, 111, 110, 62, 32, 10, 32, 32, 32, 32, 32, 32, 60, 100, 105, 118, 32, 105, 100, 61, 39, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 39, 62, 80, 114, 101, 115, 115, 32, 39, 114, 117, 110, 39, 32, 116, 111, 32, 101, 120, 101, 99, 117, 116, 101, 32, 99, 111, 100, 101, 46, 46, 46, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 32, 32, 60, 100, 105, 118, 32, 105, 100, 61, 39, 114, 101, 115, 117, 108, 116, 115, 39, 62, 46, 46, 46, 119, 114, 105, 116, 101, 32, 121, 111, 117, 114, 32, 114, 101, 115, 117, 108, 116, 115, 32, 105, 110, 116, 111, 32, 35, 114, 101, 115, 117, 108, 116, 115, 46, 46, 46, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 105, 100, 61, 39, 98, 111, 100, 39, 32, 115, 116, 121, 108, 101, 61, 39, 100, 105, 115, 112, 108, 97, 121, 58, 110, 111, 110, 101, 39, 62, 60, 47, 100, 105, 118, 62, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 10 +]); + +const lorem = getLorem(); + +// needle encoded from 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя' +fixtures['lorem_cp866.txt'] = getTestData( + Uint8Array.from([...range(128, 175 + 1), ...range(224, 239 + 1)]) +); + +// needle encoded from öäüß +fixtures['lorem_cp1252.txt'] = getTestData(Uint8Array.from([246, 228, 252, 223])); + +// needle encoded from '中文abc' +fixtures['lorem_big5.txt'] = getTestData(Uint8Array.from([164, 164, 164, 229, 97, 98, 99])); + +// needle encoded from '中文abc' +fixtures['lorem_shiftjis.txt'] = getTestData(Uint8Array.from([146, 134, 149, 182, 97, 98, 99])); + +// needle encoded from '中国abc' +fixtures['lorem_gbk.txt'] = getTestData(Uint8Array.from([214, 208, 185, 250, 97, 98, 99])); + +// needle encoded from öäüß +fixtures['lorem.txt'] = getTestData(Uint8Array.from([246, 228, 252, 223])); + +fixtures['lorem_utf8bom.txt'] = VSBuffer.concat([ + VSBuffer.wrap(Uint8Array.from(UTF8_BOM)), + VSBuffer.wrap(getTestData(Uint8Array.from([195, 182, 195, 164, 195, 188, 195, 159]))), +]).buffer; + +fixtures['lorem_utf16be.txt'] = + Uint8Array.from( + fixtures['lorem.txt'].reduce((acc, byte, i) => { + acc[2 * i] = 0; + acc[2 * i + 1] = byte; + return acc; + }, [] as number[]) + ); + +fixtures['lorem_utf16le.txt'] = + Uint8Array.from( + fixtures['lorem.txt'].reduce((acc, byte, i) => { + acc[2 * i] = byte; + acc[2 * i + 1] = 0; + return acc; + }, [] as number[]) + ); + + +function getTestData(needle: Uint8Array): Uint8Array { + const needleBuffer = VSBuffer.wrap(needle); + return VSBuffer + .concat( + [ + needleBuffer, + VSBuffer.fromString(' '), + lorem.head, + needleBuffer, + VSBuffer.fromString(' '), + lorem.tail, + ] + ) + .buffer; +} + +function getLorem() { + return { + head: VSBuffer.fromString(`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur vulputate, ipsum quis interdum fermentum, lorem sem fermentum eros, vitae auctor neque lacus in nisi. Suspendisse potenti. Maecenas et scelerisque elit, in tincidunt quam. Sed eu tincidunt quam. Nullam justo ex, imperdiet a imperdiet et, fermentum sit amet eros. Aenean quis tempus sem. Pellentesque accumsan magna mi, ut mollis velit sagittis id. Etiam quis ipsum orci. Fusce purus ante, accumsan a lobortis at, venenatis eu nisl. Praesent ornare sed ante placerat accumsan. Suspendisse tempus dignissim fermentum. Nunc a leo ac lacus sodales iaculis eu vitae mi. In feugiat ante at massa finibus cursus. Suspendisse posuere fringilla ornare. Mauris elementum ac quam id convallis. Vestibulum non elit quis urna volutpat aliquam a eu lacus. + +Aliquam vestibulum imperdiet neque, suscipit aliquam elit ultrices bibendum. Suspendisse ultrices pulvinar cursus. Morbi risus nisi, cursus consequat rutrum vitae, molestie sed dui. Fusce posuere, augue quis dignissim aliquam, nisi ipsum porttitor ante, quis fringilla nisl turpis ac nisi. Nulla varius enim eget lorem vehicula gravida. Donec finibus malesuada leo nec semper. Proin ac enim eros. Vivamus non tincidunt nisi, vel tristique lorem. + +Nunc consequat ex id eros dignissim, id rutrum risus laoreet. Sed euismod non erat eu ultricies. Etiam vehicula gravida lacus ut porta. Vestibulum eu eros quis nunc aliquet luctus. Cras quis semper ligula. Nullam gravida vehicula quam sed porta. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In porta cursus vulputate. Quisque porta a nisi eget cursus. Aliquam risus leo, luctus ac magna in, efficitur cursus magna. In condimentum non mi id semper. Donec interdum ante eget commodo maximus. + +Vivamus sit amet vestibulum lectus. Fusce tincidunt mi sapien, dictum sollicitudin diam vulputate in. Integer fringilla consequat mollis. Cras aliquet consequat felis eget feugiat. Nunc tempor cursus arcu, vitae ornare nunc varius et. Vestibulum et tortor vel ante viverra porttitor. Nam at tortor ullamcorper, facilisis augue quis, tristique erat. Aenean ut euismod nibh. Quisque eu tincidunt est, nec euismod eros. + +Proin vehicula nibh non viverra egestas. Phasellus sem dolor, ultricies ac sagittis tristique, lacinia a purus. Vestibulum in ante eros. Pellentesque lacus nulla, tristique vitae interdum vel, malesuada ac diam. Aenean bibendum posuere turpis in accumsan. Ut est nulla, ullamcorper quis turpis at, viverra sagittis mauris. Sed in interdum purus. Praesent scelerisque nibh eget sem euismod, ut imperdiet mi venenatis. Vivamus pulvinar orci sed dapibus auctor. Nulla facilisi. Vestibulum tincidunt erat nec porttitor egestas. Mauris quis risus ante. Nulla facilisi. + +Aliquam ullamcorper ornare lobortis. Phasellus quis sem et ipsum mollis malesuada sed in ex. Ut aliquam ex eget metus finibus maximus. Proin suscipit mauris eu nibh lacinia, quis feugiat dui dapibus. Nam sed libero est. Aenean vulputate orci sit amet diam faucibus, eu sagittis sapien volutpat. Nam imperdiet felis turpis, at pretium odio pulvinar in. Sed vestibulum id eros nec ultricies. Sed quis aliquam tortor, vitae ullamcorper tellus. Donec egestas laoreet eros, id suscipit est rutrum nec. Sed auctor nulla eget metus aliquam, ut condimentum enim elementum. + +Aliquam suscipit non turpis sit amet bibendum. Fusce velit ligula, euismod et maximus at, luctus sed neque. Quisque pretium, nisl at ullamcorper finibus, lectus leo mattis sapien, vel euismod mauris diam ullamcorper ex. Nulla ut risus finibus, lacinia ligula at, auctor erat. Mauris consectetur sagittis ligula vel dapibus. Nullam libero libero, lobortis aliquam libero vel, venenatis ultricies leo. Duis porttitor, nibh congue fermentum posuere, erat libero pulvinar tortor, a pellentesque nunc ipsum vel sem. Nullam volutpat, eros sit amet facilisis consectetur, ipsum est vehicula massa, non vestibulum neque elit in mauris. Nunc hendrerit ipsum non enim bibendum, vitae rhoncus mi egestas. Etiam ullamcorper massa vel nisl sagittis, nec bibendum arcu malesuada. Aenean aliquet turpis justo, a consectetur arcu mollis convallis. Etiam tellus ipsum, ultricies vitae lorem et, ornare facilisis orci. Praesent fringilla justo urna, vel mollis neque pulvinar vestibulum. + +Donec non iaculis erat. Aliquam et mi sed nunc pulvinar ultricies in ut ipsum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent feugiat lacus ac dignissim semper. Phasellus vitae quam nisi. Morbi vel diam ultricies risus lobortis ornare. Fusce maximus et ligula quis iaculis. Sed congue ex eget felis convallis, sit amet hendrerit elit tempor. Donec vehicula blandit ante eget commodo. Vestibulum eleifend diam at feugiat euismod. Etiam magna tellus, dignissim eget fermentum vel, vestibulum vitae mauris. Nam accumsan et erat id sagittis. Donec lacinia, odio ut ornare ultricies, dolor velit accumsan tortor, non finibus erat tellus quis ligula. Nunc quis metus in leo volutpat ornare vulputate eu nisl. + +Donec quis viverra ex. Nullam id feugiat mauris, eu fringilla nulla. Vestibulum id maximus elit. Cras elementum elit sed felis lobortis, eget sagittis nisi hendrerit. Vivamus vitae elit neque. Donec vulputate lacus ut libero ultrices accumsan. Vivamus accumsan nulla orci, in dignissim est laoreet sagittis. Proin at commodo velit. Curabitur in velit felis. Aliquam erat volutpat. Sed consequat, nulla et cursus sodales, nisi lacus mattis risus, quis eleifend erat ex nec turpis. Sed suscipit ultrices lorem in hendrerit. + +Morbi vitae lacus nec libero ornare tempus eu et diam. Suspendisse magna ipsum, fermentum vel odio quis, molestie aliquam urna. Fusce mollis turpis a eros accumsan porttitor. Pellentesque rhoncus dolor sit amet magna rutrum, et dapibus justo tempor. Sed purus nisi, maximus vitae fringilla eu, molestie nec urna. Fusce malesuada finibus pretium. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec sed aliquet eros. Pellentesque luctus diam ante, eget euismod nisl aliquet eu. Sed accumsan elit purus, tempor varius ligula tempus nec. Curabitur ornare leo suscipit suscipit fermentum. Morbi eget nulla est. Maecenas faucibus interdum tristique. + +Etiam ut elit eros. Nulla pharetra suscipit molestie. Nulla facilisis bibendum nisl non molestie. Curabitur turpis lectus, facilisis vel diam non, vulputate ultrices mauris. Aenean placerat aliquam convallis. Suspendisse sed scelerisque tellus. Vivamus lacinia neque eget risus cursus suscipit. Proin consequat dolor vel neque tempor, eu aliquam sem scelerisque. Duis non eros a purus malesuada pharetra non et nulla. Suspendisse potenti. Mauris libero eros, finibus vel nulla id, sagittis dapibus ante. Proin iaculis sed nunc et cursus. + +Quisque accumsan lorem sit amet lorem aliquet euismod. Curabitur fermentum rutrum posuere. Etiam ultricies, sem id pellentesque suscipit, urna magna lacinia eros, quis efficitur risus nisl at lacus. Nulla quis lacus tortor. Mauris placerat ex in dolor tincidunt, vel aliquet nisi pretium. Cras iaculis risus vitae pellentesque aliquet. Quisque a enim imperdiet, ullamcorper arcu vitae, rutrum risus. Nullam consectetur libero at felis fringilla, nec congue nibh dignissim. Nam et lobortis felis, eu pellentesque ligula. Aenean facilisis, ligula non imperdiet maximus, massa orci gravida sapien, at sagittis lacus nisl in lacus. Nulla quis mauris luctus, scelerisque felis consequat, tempus risus. Fusce auctor nisl non nulla luctus molestie. Maecenas sapien nisl, auctor non dolor et, iaculis scelerisque lorem. Suspendisse egestas enim aliquet, accumsan mauris nec, posuere quam. Nulla iaculis dui dui, sit amet vestibulum erat ultricies ac. + +Cras eget dolor erat. Proin at nisl ut leo consectetur ultricies vel ut arcu. Nulla in felis malesuada, ullamcorper tortor et, convallis massa. Nunc urna justo, ornare in nibh vitae, hendrerit condimentum libero. Etiam vitae libero in purus venenatis fringilla. Nullam velit nulla, consequat ut turpis non, egestas hendrerit nibh. Duis tortor turpis, interdum non ante ac, cursus accumsan lectus. Cras pharetra bibendum augue quis dictum. Sed euismod vestibulum justo. Proin porta lobortis purus. Duis venenatis diam tortor, sit amet condimentum eros rhoncus a. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc at magna nec diam lobortis efficitur sit amet ut lacus. Nulla quis orci tortor. Pellentesque tempus velit a odio finibus porta. + +Proin feugiat mauris a tellus scelerisque convallis. Maecenas libero magna, blandit nec ultrices id, congue vel mi. Aliquam lacinia, quam vel condimentum convallis, tortor turpis aliquam odio, sed blandit libero lacus et eros. In eleifend iaculis magna ac finibus. Praesent auctor facilisis tellus in congue. Sed molestie lobortis dictum. Nam quis dignissim augue, vel euismod lorem. Curabitur posuere dapibus luctus. Donec ultricies dictum lectus, quis blandit arcu commodo ac. Aenean tincidunt ligula in nunc imperdiet dignissim. Curabitur egestas sollicitudin sapien ut semper. Aenean nec dignissim lacus. + +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec aliquam dictum vehicula. Donec tortor est, volutpat non nisi nec, varius gravida ex. Nunc vel tristique nunc, vitae mattis nisi. Nunc nec luctus ex, vitae tincidunt lectus. In hac habitasse platea dictumst. Curabitur lobortis ex eget tincidunt tempor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut a vehicula mi. + +Fusce eu libero finibus, interdum nulla a, placerat neque. Cras bibendum tempor libero nec feugiat. Cras ut sodales eros. Proin viverra, massa sit amet viverra egestas, neque nisl porta ex, sit amet hendrerit libero ligula vel urna. Mauris suscipit lacus id justo rhoncus suscipit. Etiam vel libero tellus. Maecenas non diam molestie, condimentum tellus a, bibendum enim. Mauris aliquet imperdiet tellus, eget sagittis dolor. Sed blandit in neque et luctus. Cras elementum sagittis nunc, vel mollis lorem euismod et. Donec posuere at lacus eget suscipit. + +Nulla nunc mi, pretium non massa vel, tempor semper magna. Nunc a leo pulvinar, tincidunt nunc at, dignissim mi. Aliquam erat volutpat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut viverra nulla a nisl finibus, at hendrerit ligula ullamcorper. Donec a lorem semper, tempor magna et, lobortis libero. Mauris id sapien leo. Donec dignissim, quam vitae porttitor dignissim, quam justo mattis dui, vel consequat odio elit quis orci. Etiam nec pretium neque, sit amet pretium orci. Duis ac tortor venenatis, feugiat purus non, feugiat nunc. Proin scelerisque nisl in turpis aliquam vulputate. + +Praesent sed est semper, fringilla lorem vitae, tincidunt nibh. Cras eros metus, auctor at mauris sit amet, sodales semper orci. Nunc a ornare ex. Curabitur bibendum arcu congue urna vulputate egestas. Vestibulum finibus id risus et accumsan. Aenean ut volutpat tellus. Aenean tincidunt malesuada urna sit amet vestibulum. Mauris vel tellus dictum, varius lacus quis, dictum arcu. + +Aenean quis metus eu erat feugiat cursus vel at ligula. Proin dapibus sodales urna, id euismod lectus tempus id. Pellentesque ex ligula, convallis et erat vel, vulputate condimentum nisl. Pellentesque pharetra nulla quis massa eleifend hendrerit. Praesent sed massa ipsum. Maecenas vehicula dolor massa, id sodales urna faucibus et. Mauris ac quam non massa tincidunt feugiat et at lacus. Fusce libero massa, vulputate vel scelerisque non, mollis in leo. Ut sit amet ultricies odio. Suspendisse in sapien viverra, facilisis purus ut, pretium libero. + +Vivamus tristique pharetra molestie. Nam a volutpat purus. Praesent consequat gravida nisi, ac blandit nisi suscipit ut. Quisque posuere, ligula a ultrices laoreet, ligula nunc vulputate libero, ut rutrum erat odio tincidunt justo. Sed vitae leo at leo fringilla bibendum. Vestibulum ut augue nec dolor auctor accumsan. Praesent laoreet id eros pulvinar commodo. Suspendisse potenti. Ut pharetra, mauris vitae blandit fringilla, odio ante tincidunt lorem, sit amet tempor metus diam ut turpis. + +Praesent quis egestas arcu. Nullam at porta arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi vulputate ligula malesuada ligula luctus, vulputate tempus erat bibendum. Nunc ullamcorper non lectus at euismod. Etiam nibh felis, tincidunt a metus vel, pellentesque rhoncus neque. Etiam at diam in erat luctus interdum. Nunc vel ipsum pulvinar, sollicitudin lacus ac, tempus urna. Etiam vel lacinia sapien. Pellentesque sagittis velit vel mi efficitur iaculis. Integer euismod sit amet urna in sagittis. Cras eleifend ut nibh in facilisis. Donec et lacus vitae nunc placerat sodales. Nulla sed hendrerit ligula, at dapibus sapien. + +Praesent at iaculis ex. Curabitur est purus, cursus a faucibus quis, dictum id velit. Donec dignissim fringilla viverra. Nunc mauris felis, laoreet sit amet sagittis at, vestibulum in libero. Maecenas quis orci turpis. Quisque ut nibh vitae magna mollis consequat id at mauris. Aliquam eu odio eget nulla bibendum sodales. Quisque vel orci eleifend nisi pretium lacinia. Suspendisse eget risus eget mi volutpat molestie eget quis lacus. Duis nisi libero, tincidunt nec nulla id, faucibus cursus felis. + +Donec tempor eget risus pellentesque molestie. Phasellus porta neque vel arcu egestas, nec blandit velit fringilla. Nullam porta faucibus justo vitae laoreet. Pellentesque viverra id nunc eu varius. Nulla pulvinar lobortis iaculis. Etiam vestibulum odio nec velit tristique, a tristique nisi mattis. In sed fringilla orci, vitae efficitur odio. Quisque dui odio, ornare eget velit at, lacinia consequat libero. Quisque lectus nulla, aliquet eu leo in, porta rutrum diam. Donec nec mattis neque. Nam rutrum, odio ac eleifend bibendum, dolor arcu rutrum neque, eget porta elit tellus a lacus. Sed massa metus, sollicitudin et sapien eu, finibus tempus orci. Proin et sapien sit amet erat molestie interdum. In quis rutrum velit, faucibus ultrices tellus. + +Sed sagittis sed justo eget tincidunt. Maecenas ut leo sagittis, feugiat magna et, viverra velit. Maecenas ex arcu, feugiat at consequat vitae, auctor eu massa. Integer egestas, enim vitae maximus convallis, est lectus pretium mauris, ac posuere lectus nisl quis quam. Aliquam tempus laoreet mi, vitae dapibus dolor varius dapibus. Suspendisse potenti. Donec sit amet purus nec libero dapibus tristique. Pellentesque viverra bibendum ligula. Donec sed felis et ex lobortis laoreet. Phasellus a fringilla libero, vitae malesuada nulla. Pellentesque blandit mattis lacus, et blandit tortor laoreet consequat. Suspendisse libero nunc, viverra sed fermentum in, accumsan egestas arcu. Proin in placerat elit. Sed interdum imperdiet malesuada. Suspendisse aliquet quis mauris eget sollicitudin. + +Vivamus accumsan tellus non erat volutpat, quis dictum dolor feugiat. Praesent rutrum nunc ac est mollis cursus. Fusce semper volutpat dui ut egestas. Curabitur sit amet posuere massa. Cras tincidunt nulla et mi mollis imperdiet. Suspendisse scelerisque ex id sodales vulputate. In nunc augue, pharetra in placerat eu, mattis id tellus. Vivamus cursus efficitur vehicula. Nulla aliquet vehicula aliquet. + +Sed cursus tellus sed porta pulvinar. Sed vitae nisi neque. Nullam aliquet, lorem et efficitur scelerisque, arcu diam aliquam felis, sed pulvinar lorem odio et turpis. Praesent convallis pulvinar turpis eu iaculis. Aliquam nec gravida mi. Curabitur eu nibh tempor, blandit justo in, ultrices felis. Fusce placerat metus non mi sagittis rutrum. Morbi sed dui fringilla, sagittis mauris eget, imperdiet nunc. Phasellus hendrerit sem elit, id hendrerit libero auctor sit amet. Integer sodales elit sit amet consequat cursus. + +Nam semper est eget nunc mollis, in pellentesque lectus fringilla. In finibus vel diam id semper. Nunc mattis quis erat eu consectetur. In hac habitasse platea dictumst. Nullam et ipsum vestibulum ex pulvinar ultricies sit amet id velit. Aenean suscipit mi tortor, a lobortis magna viverra non. Nulla condimentum aliquet ante et ullamcorper. Pellentesque porttitor arcu a posuere tempus. Aenean lacus quam, imperdiet eu justo vitae, pretium efficitur ex. Duis id purus id magna rhoncus ultrices id eu risus. Nunc dignissim et libero id dictum. + +Quisque a tincidunt neque. Phasellus commodo mi sit amet tempor fringilla. Ut rhoncus, neque non porttitor elementum, libero nulla egestas augue, sed fringilla sapien felis ac velit. Phasellus viverra rhoncus mollis. Nam ullamcorper leo vel erat laoreet luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus semper a metus a cursus. Nulla sed orci egestas, efficitur purus ac, malesuada tellus. Aenean rutrum velit at tellus fermentum mollis. Aliquam eleifend euismod metus. + +In hac habitasse platea dictumst. Vestibulum volutpat neque vitae porttitor laoreet. Nam at tellus consequat, sodales quam in, pulvinar arcu. Maecenas varius convallis diam, ac lobortis tellus pellentesque quis. Maecenas eget augue massa. Nullam volutpat nibh ac justo rhoncus, ut iaculis tellus rutrum. Fusce efficitur efficitur libero quis condimentum. Curabitur congue neque non tincidunt tristique. Fusce eget tempor ex, at pellentesque odio. Praesent luctus dictum vestibulum. Etiam non orci nunc. Vivamus vitae laoreet purus, a lobortis velit. Curabitur tincidunt purus ac lectus elementum pellentesque. Quisque sed tincidunt est. + +Sed vel ultrices massa, vitae ultricies justo. Cras finibus mauris nec lacus tempus dignissim. Cras faucibus maximus velit, eget faucibus orci luctus vehicula. Nulla massa nunc, porta ac consequat eget, rhoncus non tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce sed maximus metus, vel imperdiet ipsum. Ut scelerisque lectus at blandit porttitor. Ut vulputate nunc pharetra, aliquet sapien ac, sollicitudin sapien. Aenean eget ante lorem. Nam accumsan venenatis tellus id dignissim. + +Curabitur fringilla, magna non maximus dapibus, nulla sapien vestibulum lectus, sit amet semper dolor neque vitae nisl. Nunc ultrices vehicula augue sed iaculis. Maecenas nec diam mollis, suscipit orci et, vestibulum ante. Pellentesque eu nisl tortor. Nunc eleifend, lacus quis volutpat volutpat, nisi mi molestie sem, quis mollis ipsum libero a tellus. Ut viverra dolor mattis convallis interdum. Sed tempus nisl at nunc scelerisque aliquet. Quisque tempor tempor lorem id feugiat. Nullam blandit lectus velit, vitae porta lacus tincidunt a. Vivamus sit amet arcu ultrices, tincidunt mi quis, viverra quam. Aenean fringilla libero elementum lorem semper, quis pulvinar eros gravida. Nullam sodales blandit mauris, sed fermentum velit fermentum sit amet. Donec malesuada mauris in augue sodales vulputate. Vestibulum gravida turpis id elit rhoncus dignissim. Integer non congue lorem, eu viverra orci. + +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec at dolor magna. Aliquam consectetur erat augue, id iaculis velit pharetra ac. Integer rutrum venenatis dignissim. Integer non sodales elit. Curabitur ut magna ut nibh feugiat aliquam ac ut risus. Morbi nibh quam, aliquam id placerat nec, vestibulum eget velit. Suspendisse at dignissim quam. Vivamus aliquet sem sed nisl volutpat, ut cursus orci ultrices. Aliquam ultrices lacinia enim, vitae aliquet neque. + +Quisque scelerisque finibus diam in mattis. Cras cursus auctor velit. Aliquam sem leo, fermentum et maximus et, molestie a libero. Aenean justo elit, rutrum a ornare id, egestas eget enim. Aenean auctor tristique erat. Curabitur condimentum libero lacus, nec consequat orci vestibulum sed. Fusce elit ligula, blandit vitae sapien vitae, dictum ultrices risus. Nam laoreet suscipit sapien, at interdum velit faucibus sit amet. Duis quis metus egestas lectus elementum posuere non nec libero. Aliquam a dolor bibendum, facilisis nunc a, maximus diam. Vestibulum suscipit tristique magna, non dignissim turpis sodales sed. Nunc ornare, velit ac facilisis fringilla, dolor mi consectetur lorem, vitae finibus erat justo suscipit urna. Maecenas sit amet eros erat. Nunc non arcu ornare, suscipit lorem eget, sodales mauris. Aliquam tincidunt, quam nec mollis lacinia, nisi orci fermentum libero, consequat eleifend lectus quam et sapien. Vestibulum a quam urna. + +Cras arcu leo, euismod ac ullamcorper at, faucibus sed massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus porttitor velit in enim interdum, non commodo metus ornare. Morbi vel lorem quis nisl luctus tristique quis vitae nisl. Suspendisse condimentum tortor enim, nec eleifend ipsum euismod et. Sed gravida quam ut tristique lacinia. Mauris eu interdum ipsum, ac ultrices odio. Nullam auctor tellus a risus porttitor vehicula. Nulla blandit euismod dictum. In pharetra, enim iaculis pulvinar interdum, dui nunc placerat nunc, sit amet pretium lectus nulla vitae quam. Phasellus quis enim sollicitudin, varius nulla id, ornare purus. Donec quam lacus, vestibulum quis nunc ac, mollis dictum nisi. Cras ut mollis elit. Maecenas ultrices ligula at risus faucibus scelerisque. Etiam vitae porttitor purus. Curabitur blandit lectus urna, ut hendrerit tortor feugiat ut. + +Phasellus fringilla, sapien pellentesque commodo pharetra, ante libero aliquam tellus, ut consectetur augue libero a sapien. Maecenas blandit luctus nisl eget aliquet. Maecenas vitae porta dolor, faucibus laoreet sapien. Suspendisse lobortis, ipsum sed vehicula aliquam, elit purus scelerisque dui, rutrum consectetur diam odio et lorem. In nec lacinia metus. Donec viverra libero est, vel bibendum erat condimentum quis. Donec feugiat purus leo. In laoreet vitae felis a porttitor. Mauris ullamcorper, lacus id condimentum suscipit, neque magna pellentesque arcu, eget cursus neque tellus id metus. Curabitur volutpat ac orci vel ultricies. + +Sed ut finibus erat. Sed diam purus, varius non tincidunt quis, ultrices sit amet ipsum. Donec et egestas nulla. Suspendisse placerat nisi at dui laoreet iaculis. Aliquam aliquet leo at augue faucibus molestie. Nullam lacus augue, hendrerit sed nisi eu, faucibus porta est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam ut leo aliquet sem fermentum rutrum quis ac justo. Integer placerat aliquam nisl ut sagittis. Proin erat orci, lobortis et sem eget, eleifend fringilla augue. Mauris varius laoreet arcu, sed tincidunt felis. Pellentesque venenatis lorem odio, id pulvinar velit molestie feugiat. Donec mattis lacus sed eleifend pulvinar. + +Sed condimentum ex in tincidunt hendrerit. Etiam eget risus lacinia, euismod nibh eu, pellentesque quam. Proin elit eros, convallis id mauris ac, bibendum ultrices lectus. Morbi venenatis, purus id fermentum consequat, nunc libero tincidunt ligula, non dictum ligula orci nec quam. Nulla nec ultrices lorem. Aenean maximus augue vel dictum pharetra. Etiam turpis urna, pellentesque quis malesuada eu, molestie faucibus felis. + +Vestibulum pharetra augue ut quam blandit congue in nec risus. Proin eu nibh eu dui eleifend porta vitae id lectus. Proin lacus nibh, lobortis sed ligula vitae, interdum lobortis erat. Suspendisse potenti. In sollicitudin quis sapien ut aliquet. Mauris ac nulla arcu. Fusce tristique justo quis lectus mollis, eu volutpat lectus finibus. Vivamus venenatis facilisis ex ut vestibulum. + +Etiam varius lobortis purus, in hendrerit elit tristique at. In tempus, augue vestibulum fermentum gravida, ligula tellus vulputate arcu, eu molestie ex sapien at purus. Vestibulum nec egestas metus. Duis pulvinar quam nec consequat interdum. Aenean non dapibus lacus. Aliquam sit amet aliquet nulla. Sed venenatis volutpat purus nec convallis. Phasellus aliquet semper sodales. Cras risus sapien, condimentum auctor urna a, pulvinar ornare nisl. Sed tincidunt felis elit, ut elementum est bibendum ac. Morbi interdum justo vel dui faucibus condimentum. + +Sed convallis eu sem at tincidunt. Nullam at auctor est, et ullamcorper ipsum. Pellentesque eget ante ante. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer euismod, sapien sed dapibus ornare, nibh enim maximus lacus, lacinia placerat urna quam quis felis. Morbi accumsan id nisl ut condimentum. Donec bibendum nisi est, sed volutpat lorem rhoncus in. Vestibulum ac lacinia nunc, eget volutpat magna. Integer aliquam pharetra ipsum, id placerat nunc volutpat quis. Etiam urna diam, rhoncus sit amet varius vel, euismod vel sem. Nullam vel molestie urna. Vivamus ornare erat at venenatis euismod. Suspendisse potenti. Fusce diam justo, tincidunt vel sem at, commodo faucibus nisl. Duis gravida efficitur diam, vel sagittis erat pulvinar ut. + +Quisque vel pharetra felis. Duis efficitur tortor dolor, vitae porttitor erat fermentum sed. Sed eu mi purus. Etiam dignissim tortor eu tempus molestie. Aenean pretium erat enim, in hendrerit ante hendrerit at. Sed ut risus vel nunc venenatis ultricies quis in lacus. Pellentesque vitae purus euismod, placerat risus non, ullamcorper augue. Quisque varius quam ligula, nec aliquet ex faucibus vitae. Quisque rhoncus sit amet leo tincidunt mattis. Cras id mauris eget purus pretium gravida sit amet eu augue. Aliquam dapibus odio augue, id lacinia velit pulvinar eu. + +Mauris fringilla, tellus nec pharetra iaculis, neque nisi ultrices massa, et tincidunt sem dui sed mi. Curabitur erat lorem, venenatis quis tempus lacinia, tempus sit amet nunc. Aliquam at neque ac metus commodo dictum quis vitae justo. Phasellus eget lacus tempus, blandit lorem vel, rutrum est. Aenean pharetra sem ut augue lobortis dignissim. Sed rhoncus at nulla id ultrices. Cras id condimentum felis. In suscipit luctus vulputate. Donec tincidunt lacus nec enim tincidunt sollicitudin ut quis enim. Nam at libero urna. Praesent sit amet massa vitae massa ullamcorper vehicula. + +Nullam bibendum augue ut turpis condimentum bibendum. Proin sit amet urna hendrerit, sodales tortor a, lobortis lectus. Integer sagittis velit turpis, et tincidunt nisi commodo eget. Duis tincidunt elit finibus accumsan cursus. Aenean dignissim scelerisque felis vel lacinia. Nunc lacinia maximus luctus. In hac habitasse platea dictumst. Vestibulum eget urna et enim tempor tempor. Nam feugiat, felis vel vestibulum tempus, orci justo viverra diam, id dapibus lorem justo in ligula. + +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In ac pellentesque sem. Vestibulum lacinia magna dui, eu lacinia augue placerat et. Maecenas pulvinar congue est. Pellentesque commodo dui non pulvinar scelerisque. Etiam interdum est posuere sem bibendum, ac commodo magna dictum. Cras ipsum turpis, rhoncus nec posuere vitae, laoreet a arcu. Integer ac massa sit amet enim placerat lacinia sed ultrices arcu. Suspendisse sem nibh, luctus sit amet volutpat in, pellentesque eu metus. Ut gravida neque eget mi accumsan tempus. Nam sit amet aliquet nibh. + +Pellentesque a purus cursus nulla hendrerit congue quis et odio. Aenean hendrerit, leo ullamcorper sagittis hendrerit, erat dui molestie quam, sed condimentum lacus risus sed tellus. Morbi a dapibus lectus, ut feugiat ex. Phasellus pretium quam et sapien mollis, vel iaculis dui dignissim. Sed ullamcorper est turpis, a viverra lorem consectetur in. Aenean aliquet nibh non cursus rutrum. Suspendisse at tristique urna, id lobortis urna. In hac habitasse platea dictumst. Phasellus libero velit, rutrum sed tellus nec, dapibus tincidunt ligula. Quisque vel dui venenatis, consequat nisl ut, lacinia ipsum. Phasellus vitae magna pellentesque, lobortis est id, faucibus quam. Nam eleifend faucibus dui vel pellentesque. + +Etiam ut est non lacus tincidunt interdum. Maecenas sed massa urna. Quisque ut nibh tortor. Pellentesque felis ipsum, tempor finibus ipsum et, euismod pretium metus. Donec sit amet est ipsum. Quisque rhoncus justo non finibus elementum. Nulla nec lectus ac tortor placerat fringilla. Phasellus ac ultrices nunc, eu efficitur nisl. Nulla rhoncus nunc vitae ante dictum tincidunt. Nunc ultrices, massa sit amet malesuada dignissim, lectus lacus consequat sapien, non eleifend metus sem in eros. Phasellus mauris ante, dictum sit amet suscipit ac, rhoncus eget nisi. Phasellus at orci mollis, imperdiet neque eget, faucibus nulla. In at purus massa. Pellentesque quis rutrum lectus. + +Integer eu faucibus turpis, sit amet mollis massa. Vestibulum id nulla commodo, rutrum ipsum sed, semper ante. Phasellus condimentum orci nec nibh convallis, ac maximus orci ullamcorper. Maecenas vitae sollicitudin mi. Integer et finibus lectus, et condimentum ligula. Donec elementum tristique quam vitae dapibus. Morbi euismod ipsum in tristique ullamcorper. + +Duis fermentum non enim eu auctor. Quisque lacinia nibh vehicula nibh posuere, eu volutpat turpis facilisis. Ut ac faucibus nulla. Sed eleifend quis ex et pellentesque. Vestibulum sollicitudin in libero id fringilla. Phasellus dignissim purus consequat, condimentum dui sit amet, condimentum ante. Pellentesque ac consectetur massa, quis sagittis est. Nulla maximus tristique risus accumsan convallis. Curabitur imperdiet ac lacus a ultrices. Nulla facilisi. Sed quis quam quis lectus placerat lobortis vel sed turpis. In mollis dui id neque iaculis, ut aliquet tellus malesuada. Proin at luctus odio, vel blandit sapien. Praesent dignissim tortor vehicula libero fringilla, nec ultrices erat suscipit. Maecenas scelerisque purus in dapibus fermentum. + +Curabitur magna odio, mattis in tortor ut, porttitor congue est. Vestibulum mollis lacinia elementum. Fusce maximus erat vitae nunc rutrum lobortis. Integer ligula eros, auctor vel elit non, posuere luctus lacus. Maecenas quis auctor massa. Ut ipsum lacus, efficitur posuere euismod et, hendrerit efficitur est. Phasellus fringilla, quam id tincidunt pretium, nunc dui sollicitudin orci, eu dignissim nisi metus ut magna. Integer lobortis interdum dolor, non bibendum purus posuere et. Donec non lectus aliquet, pretium dolor eu, cursus massa. Sed ut dui sapien. In sed vestibulum massa. Pellentesque blandit, dui non sodales vehicula, orci metus mollis nunc, non pharetra ex tellus ac est. Mauris sagittis metus et fermentum pretium. Nulla facilisi. Quisque quis ante ut nulla placerat mattis ut quis nisi. + +Sed quis nulla ligula. Quisque dignissim ligula urna, sed aliquam purus semper at. Suspendisse potenti. Nunc massa lectus, pharetra vehicula arcu bibendum, imperdiet sodales ipsum. Nam ac sapien diam. Mauris iaculis fringilla mattis. Pellentesque tempus eros sit amet justo volutpat mollis. Phasellus ac turpis ipsum. Morbi vel ante elit. Aenean posuere quam consequat velit varius suscipit. Donec tempor quam ut nibh cursus efficitur. + +Morbi molestie dolor nec sem egestas suscipit. Etiam placerat pharetra lectus, et ullamcorper risus tristique in. Sed faucibus ullamcorper lectus eget fringilla. Maecenas malesuada hendrerit congue. Sed eget neque a erat placerat tincidunt. Aliquam vitae dignissim turpis. Fusce at placerat magna, a laoreet lectus. Maecenas a purus nec diam gravida fringilla. Nam malesuada euismod ante non vehicula. In faucibus bibendum leo, faucibus posuere nisl pretium quis. Fusce finibus bibendum finibus. Vestibulum eu justo maximus, hendrerit diam nec, dignissim sapien. Aenean dolor lacus, malesuada quis vestibulum ac, venenatis ac ipsum. Cras a est id nunc finibus facilisis. Cras lacinia neque et interdum vehicula. Suspendisse vulputate tellus elit, eget tempor dui finibus vel. + +Cras sed pretium odio. Proin hendrerit elementum felis in tincidunt. Nam sed turpis vel justo molestie accumsan condimentum eu nunc. Praesent lobortis euismod rhoncus. Nulla vitae euismod nibh, quis mattis mi. Fusce ultrices placerat porttitor. Duis sem ipsum, pellentesque sit amet odio a, molestie vulputate mauris. + +Duis blandit mollis ligula, sit amet mattis ligula finibus sit amet. Nunc a leo molestie, placerat diam et, vestibulum leo. Suspendisse facilisis neque purus, nec pellentesque ligula fermentum nec. Aenean malesuada mauris lorem, eu blandit arcu pulvinar quis. Duis laoreet urna lacus, non maximus arcu rutrum ultricies. Nulla augue dolor, suscipit eu mollis eu, aliquam condimentum diam. Ut semper orci luctus, pharetra turpis at, euismod mi. Nulla leo diam, finibus sit amet purus sed, maximus dictum lorem. Integer eu mi id turpis laoreet rhoncus. + +Integer a mauris tincidunt, finibus orci ut, pretium mauris. Nulla molestie nunc mi, id finibus lorem elementum sed. Proin quis laoreet ante. Integer nulla augue, commodo id molestie quis, rutrum ut turpis. Suspendisse et tortor turpis. Sed ut pharetra massa. Pellentesque elementum blandit sem, ut elementum tellus egestas a. Fusce eu purus nibh. + +Cras dignissim ligula scelerisque magna faucibus ullamcorper. Proin at condimentum risus, auctor malesuada quam. Nullam interdum interdum egestas. Nulla aliquam nisi vitae felis mollis dictum. Suspendisse dapibus consectetur tortor. Ut ut nisi non sem bibendum tincidunt. Vivamus suscipit leo quis gravida dignissim. + +Aliquam interdum, leo id vehicula mollis, eros eros rhoncus diam, non mollis ligula mi eu mauris. Sed ultrices vel velit sollicitudin tincidunt. Nunc auctor metus at ligula gravida elementum. Praesent interdum eu elit et mollis. Duis egestas quam sit amet velit dignissim consequat. Aliquam ac turpis nec nunc convallis sagittis. Fusce blandit, erat ac fringilla consectetur, dolor eros sodales leo, vel aliquet risus nisl et diam. Aliquam luctus felis vitae est eleifend euismod facilisis et lacus. Sed leo tellus, auctor eu arcu in, volutpat sagittis nisl. Pellentesque nisl ligula, placerat vel ullamcorper at, vulputate ac odio. Morbi ac faucibus orci, et tempus nulla. Proin rhoncus rutrum dolor, in venenatis mauris. Suspendisse a fermentum augue, non semper mi. Nunc eget pretium neque. Phasellus augue erat, feugiat ac aliquam congue, rutrum non sapien. Pellentesque ac diam gravida, consectetur felis at, ornare neque. + +Nullam interdum mattis sapien quis porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Phasellus aliquet rutrum ipsum id euismod. Maecenas consectetur massa et mi porta viverra. Nunc quam nibh, dignissim vitae maximus et, ullamcorper nec lorem. Nunc vitae justo dapibus, luctus lacus vitae, pretium elit. Maecenas et efficitur leo. Curabitur mauris lectus, placerat quis vehicula vitae, auctor ut urna. Quisque rhoncus pharetra luctus. In hac habitasse platea dictumst. Integer sit amet metus nec eros malesuada aliquam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi hendrerit mi ac leo aliquam, sit amet ultricies libero commodo. Mauris dapibus purus metus, sit amet viverra nibh imperdiet et. Nullam porta nulla tellus, quis vehicula diam imperdiet non. Vivamus enim massa, bibendum in fermentum in, ultrices at ex. + +Suspendisse fermentum id nibh eget accumsan. Duis dapibus bibendum erat ut sollicitudin. Aliquam nec felis risus. Pellentesque rhoncus ligula id sem maximus mollis sed nec massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ipsum ipsum, sodales sed enim id, convallis faucibus eros. Donec ultricies dictum tincidunt. Cras vitae nibh arcu. Pellentesque cursus, sapien nec consequat fermentum, ipsum ante suscipit dui, imperdiet hendrerit est nisl eu massa. Quisque vitae sem ligula. Aenean iaculis metus ut mauris interdum laoreet. Vivamus sed gravida dolor. + +Morbi nulla metus, porttitor sed eros sit amet, efficitur efficitur est. In vel nisl urna. Ut aliquet tellus at congue convallis. Phasellus imperdiet lobortis sollicitudin. Integer sodales, sem eu ultricies pharetra, erat erat porttitor odio, eget dapibus libero ipsum eget velit. Phasellus gravida nulla nisl, eu pharetra mi auctor vel. Sed blandit pharetra velit, ut egestas libero placerat non. Aliquam a interdum quam. Proin at tortor nec dui sollicitudin tempus sed vestibulum elit. Nunc non sollicitudin velit. + +Aenean consequat diam velit, sed rutrum tortor faucibus dictum. Quisque at semper augue. Duis ut est eget mi ornare bibendum id et ligula. Phasellus consequat tortor non leo pulvinar posuere. Proin vestibulum eleifend felis, in hendrerit tortor sollicitudin eu. Phasellus hendrerit, lacus vel laoreet interdum, dui tortor consequat justo, commodo ultricies arcu felis vitae enim. Vivamus eu sapien at leo suscipit rutrum eu at justo. Aenean et dolor a libero ullamcorper posuere. Integer laoreet placerat nisi in vulputate. Mauris laoreet eget risus sed cursus. Donec scelerisque neque a libero eleifend hendrerit. Nulla varius condimentum nunc sit amet fermentum. Aliquam lorem ex, varius nec mollis ut, ultrices in neque. Morbi sit amet porta leo. Integer iaculis fermentum lacus in vestibulum. + +Ut gravida, tellus ut maximus ultrices, erat est venenatis nisl, vitae pretium massa ex ac magna. Sed non purus eget ligula aliquet volutpat non quis arcu. Nam aliquam tincidunt risus, sit amet fringilla sapien vulputate ut. Mauris luctus suscipit pellentesque. Nunc porttitor dapibus ex quis tempus. Ut ullamcorper metus a eros vulputate, vitae viverra lectus convallis. Mauris semper imperdiet augue quis tincidunt. Integer porta pretium magna, sed cursus sem scelerisque sollicitudin. Nam efficitur, nibh pretium eleifend vestibulum, purus diam posuere sem, in egestas mauris augue sit amet urna. + +Vestibulum tincidunt euismod massa in congue. Duis interdum metus non laoreet fringilla. Donec at ligula congue, tincidunt nunc non, scelerisque nunc. Donec bibendum magna non est scelerisque feugiat at nec neque. Ut orci tortor, tempus eget massa non, dignissim faucibus dolor. Nam odio risus, accumsan pretium neque eget, accumsan dignissim dui. In ut neque auctor, scelerisque tellus sed, ullamcorper nisi. Suspendisse varius cursus quam at hendrerit. Vivamus elit libero, sagittis vitae sem ac, vulputate iaculis ligula. + +Sed lobortis laoreet purus sit amet rutrum. Pellentesque feugiat non leo vel lacinia. Quisque feugiat nisl a orci bibendum vestibulum. In et sollicitudin urna. Morbi a arcu ac metus faucibus tempus. Nam eu imperdiet sapien, suscipit mattis tortor. Aenean blandit ipsum nisi, a eleifend ligula euismod at. Integer tincidunt pharetra felis, mollis placerat mauris hendrerit at. Curabitur convallis, est sit amet luctus volutpat, massa lacus cursus augue, sed eleifend magna quam et risus. Aliquam lobortis tincidunt metus vitae porttitor. Suspendisse potenti. Aenean ullamcorper, neque id commodo luctus, nulla nunc lobortis quam, id dapibus neque dui nec mauris. Etiam quis lorem quis elit commodo ornare. Ut pharetra purus ultricies enim ultrices efficitur. Proin vehicula tincidunt molestie. Mauris et placerat sem. + +Aliquam erat volutpat. Suspendisse velit turpis, posuere ac lacus eu, lacinia laoreet velit. Sed interdum felis neque, id blandit sem malesuada sit amet. Ut sagittis justo erat, efficitur semper orci tempor sed. Donec enim massa, posuere varius lectus egestas, pellentesque posuere mi. Cras tincidunt ut libero sed mattis. Suspendisse quis magna et tellus posuere interdum vel at purus. Pellentesque fringilla tristique neque, id aliquet tellus ultricies non. Duis ut tellus vel odio lobortis vulputate. + +Integer at magna ac erat convallis vestibulum. Sed lobortis porttitor mauris. Fusce varius lorem et volutpat pulvinar. Aenean ac vulputate lectus, vitae consequat velit. Suspendisse ex dui, varius ut risus ut, dictum scelerisque sem. Vivamus urna orci, volutpat ut convallis ac, venenatis vitae urna. In hac habitasse platea dictumst. Etiam eu purus arcu. Aenean vulputate leo urna, vel tristique dui sagittis euismod. Suspendisse non tellus efficitur ante rhoncus volutpat at et sapien. + +Sed dapibus accumsan porttitor. Phasellus facilisis lectus finibus ligula dignissim, id pulvinar lectus feugiat. Nullam egestas commodo nisi posuere aliquet. Morbi sit amet tortor sagittis, rutrum dui nec, dapibus sapien. Sed posuere tortor tortor, interdum auctor magna varius vitae. Vestibulum id sagittis augue. Curabitur fermentum arcu sem, eu condimentum quam rutrum non. Phasellus rutrum nibh quis lectus rhoncus pretium. Curabitur dictum interdum elit. Vestibulum maximus sodales imperdiet. Mauris auctor nec purus sed venenatis. In in urna purus. + +Duis placerat molestie suscipit. Morbi a elit id purus efficitur consequat. Nunc ac commodo turpis. Etiam sit amet lacus a ipsum tempus venenatis sed vel nibh. Duis elementum aliquam mi sed tristique. Morbi ligula tortor, semper ac est vel, lobortis maximus erat. Curabitur ipsum felis, laoreet vel condimentum eget, ullamcorper sit amet mauris. Nulla facilisi. Nam at purus sed mi egestas placerat vitae vel magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse at dignissim diam. Phasellus consectetur eget neque vel viverra. Donec sollicitudin mattis dolor vel malesuada. Vivamus vehicula leo neque, vitae fermentum leo posuere et. Praesent dui est, finibus sit amet tristique quis, pharetra vel nibh. + +Duis nulla leo, accumsan eu odio eget, sagittis semper orci. Quisque ullamcorper ligula quam, commodo porttitor mauris ullamcorper eu. Cras varius sagittis felis in aliquam. Duis sodales risus ac justo vehicula, nec mattis diam lacinia. Cras eget lectus ipsum. Ut commodo, enim vitae malesuada hendrerit, ex dolor egestas lectus, sit amet hendrerit metus diam nec est. Vestibulum tortor metus, lobortis sit amet ante eget, tempor molestie lacus. In molestie et urna et semper. Mauris mollis, sem non hendrerit condimentum, sapien nisi cursus est, non suscipit quam justo non metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam enim est, porta ac feugiat vitae, rutrum in lorem. Duis vehicula tortor ut posuere maximus. + +Nullam vestibulum non tellus sed commodo. Quisque mattis elit sit amet sapien sollicitudin, ut condimentum nisl congue. Aenean sagittis massa vel elit faucibus fermentum. Donec tincidunt nisi nec nisl sodales pellentesque. Mauris congue congue ligula ut suscipit. Vivamus velit tortor, tempor et gravida eget, fermentum sit amet ante. Nullam fringilla, lorem at ultrices cursus, urna neque ornare dolor, eu lacinia orci enim sed nibh. Ut a ullamcorper lectus, id mattis purus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean maximus sollicitudin posuere. Nunc at augue lacus. Aenean efficitur leo sit amet lacinia efficitur. + +Quisque venenatis quam mi, in pharetra odio vulputate eu. In vel nisl pulvinar, pulvinar ligula ut, sodales risus. Sed efficitur lectus at vestibulum tincidunt. Vestibulum eu ullamcorper elit. Fusce vestibulum magna enim, et tempor lacus posuere vitae. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer leo elit, luctus nec mattis sit amet, sollicitudin in turpis. + +Proin convallis venenatis leo, vitae tristique erat iaculis nec. Nulla facilisi. Duis porttitor, sapien et bibendum vulputate, sem libero sodales lacus, non malesuada felis erat ut libero. Nam non felis semper, finibus est a, mattis mauris. Praesent nec eros quam. Nulla hendrerit, augue consectetur eleifend ultricies, purus mi condimentum nulla, eget dapibus est nunc sed libero. Nullam elementum dui erat, vitae luctus libero sollicitudin et. Nulla odio magna, placerat in augue eu, dapibus imperdiet odio. Suspendisse imperdiet metus sit amet rhoncus dapibus. Cras at enim et urna vehicula cursus eu a mauris. Integer magna ante, eleifend ac placerat vitae, porta at nisi. Cras eget malesuada orci. Curabitur nunc est, vulputate id viverra et, dignissim sed odio. Curabitur non mattis sem. Sed bibendum, turpis vitae vehicula faucibus, nunc quam ultricies lectus, vitae viverra felis turpis at libero. + +Nullam ut egestas ligula. Proin hendrerit justo a lectus commodo venenatis. Nulla facilisi. Ut cursus lorem quis est bibendum condimentum. Aenean in tristique odio. Fusce tempor hendrerit ipsum. Curabitur mollis felis justo, quis dapibus erat auctor vel. Sed augue lectus, finibus ut urna quis, ullamcorper vestibulum dui. Etiam molestie aliquam tempor. Integer mattis sollicitudin erat, et tristique elit varius vel. Mauris a ex justo. + +Nam eros est, imperdiet non volutpat rutrum, pellentesque accumsan ligula. Duis sit amet turpis metus. Aenean in rhoncus metus, ac fringilla ex. Suspendisse condimentum egestas purus, ut pharetra odio vulputate vel. Duis tincidunt massa a placerat ultrices. Mauris ultricies nibh sit amet condimentum malesuada. Duis tincidunt id ipsum sed congue. + +Praesent eu ex augue. Nullam in porta ligula. In tincidunt accumsan arcu, in pellentesque magna tristique in. Mauris eleifend libero ac nisl viverra faucibus. Nam sollicitudin dolor in commodo hendrerit. Cras at orci metus. Ut quis laoreet orci. Vivamus ultrices leo pellentesque tempor aliquet. Maecenas ut eros vitae purus placerat vestibulum. Etiam vitae gravida dolor, quis rhoncus diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. + +Suspendisse fringilla lacinia sagittis. Integer tincidunt consectetur tristique. Morbi non orci convallis, congue sapien quis, vulputate nunc. Donec a libero vel magna elementum facilisis non quis mi. Mauris posuere tellus non ipsum ultrices elementum. Vivamus massa velit, facilisis quis placerat aliquet, aliquet nec leo. Praesent a maximus sem. Sed neque elit, feugiat vel quam non, molestie sagittis nunc. Etiam luctus nunc ac mauris scelerisque, nec rhoncus lacus convallis. Nunc pharetra, nunc ac pulvinar aliquam, ex ipsum euismod augue, nec porttitor lacus turpis vitae neque. Fusce bibendum odio id tortor faucibus pellentesque. Sed ac porta nibh, eu gravida erat. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam quis ullamcorper felis. Nulla mattis sagittis ante ac tincidunt. Integer ac felis efficitur, viverra libero et, facilisis ligula. Suspendisse a metus a massa rhoncus posuere. Phasellus suscipit ligula ut lacus facilisis, ac pellentesque ex tempor. Quisque consectetur massa mi, ac molestie libero dictum quis. Proin porttitor ligula quis erat tincidunt venenatis. Proin congue nunc sed elit gravida, nec consectetur lectus sodales. Etiam tincidunt convallis ipsum at vestibulum. Quisque maximus enim et mauris porttitor, et molestie magna tristique. Morbi vitae metus elit. Maecenas sed volutpat turpis. Aliquam vitae dolor vestibulum, elementum purus eget, dapibus nibh. Nullam egestas dui ac rutrum semper. + +Etiam hendrerit est metus, et condimentum metus aliquam ac. Pellentesque id neque id ipsum rhoncus vulputate. Aliquam erat nisl, posuere sit amet ligula ac, fermentum blandit felis. Vivamus fermentum mi risus, non lacinia purus viverra id. Aenean ac sapien consequat, finibus mauris nec, porta sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed quis consectetur ex, dignissim bibendum nulla. Phasellus ac libero at quam vehicula euismod non eu leo. Phasellus a sapien augue. + +Maecenas ligula dui, bibendum vitae mauris et, auctor laoreet felis. Duis non libero a mi semper mattis. Quisque consequat luctus massa, quis tristique eros auctor feugiat. Maecenas sodales euismod neque vitae facilisis. Nullam laoreet imperdiet velit at pellentesque. Etiam massa odio, facilisis a consequat vitae, placerat vel magna. Nunc sagittis eros nec urna fringilla, pulvinar vestibulum nibh scelerisque. Sed magna metus, cursus eu consequat et, pharetra a est. Suspendisse elementum neque a dui malesuada lacinia. Donec sed ipsum volutpat, cursus urna id, ullamcorper arcu. Maecenas laoreet nisl eget velit egestas sollicitudin. Etiam nisl turpis, mollis id dignissim vitae, tristique vehicula ante. Maecenas eget placerat est, at rutrum augue. Vivamus faucibus lacinia ullamcorper. Sed pulvinar urna sodales ante sodales, at gravida leo dictum. + +Morbi maximus, quam a lobortis bibendum, enim felis varius elit, ac vehicula elit nisl ut lacus. Quisque ut arcu augue. Praesent id turpis quam. Sed sed arcu eros. Maecenas at cursus lorem, ac eleifend nisi. Fusce mattis felis at commodo pharetra. Praesent ac commodo ipsum. Quisque finibus et eros vitae tincidunt. In hac habitasse platea dictumst. Praesent purus ipsum, luctus lobortis ornare quis, auctor eget justo. Nam vel enim sollicitudin, faucibus tortor eu, sagittis eros. Ut nec consectetur erat. Donec ultricies malesuada ligula, a hendrerit sapien volutpat in. Maecenas sed enim vitae sapien pulvinar faucibus. + +Proin semper nunc nibh, non consequat neque ullamcorper vel. Maecenas lobortis sagittis blandit. Aenean et arcu ultricies turpis malesuada malesuada. Ut quam ex, laoreet ut blandit cursus, feugiat vitae dolor. Etiam ex lacus, scelerisque vel erat vel, efficitur tincidunt magna. Morbi tristique lacinia dolor, in egestas magna ultrices vitae. Integer ultrices leo ac tempus venenatis. Praesent ac porta tortor. Vivamus ornare blandit tristique. Nulla rutrum finibus pellentesque. In non dui elementum, fermentum ipsum vel, varius magna. Pellentesque euismod tortor risus, ac pellentesque nisl faucibus eget. + +Vivamus eu enim purus. Cras ultrices rutrum egestas. Sed mollis erat nibh, at posuere nisl luctus nec. Nunc vulputate, sapien id auctor molestie, nisi diam tristique ante, non convallis tellus nibh at orci. Morbi a posuere purus, in ullamcorper ligula. Etiam elementum sit amet dui imperdiet iaculis. Proin vitae tincidunt ipsum, sit amet placerat lectus. Curabitur commodo sapien quam, et accumsan lectus fringilla non. Nullam eget accumsan enim, ac pharetra mauris. Sed quis tristique velit, vitae commodo nisi. Duis turpis dui, maximus ut risus at, finibus consequat nunc. Maecenas sed est accumsan, aliquet diam in, facilisis risus. Curabitur vehicula rutrum auctor. Nam iaculis risus pulvinar maximus viverra. Nulla vel augue et ex sagittis blandit. + +Ut sem nulla, porta ac ante ac, posuere laoreet eros. Donec sodales posuere justo a auctor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras mollis at orci hendrerit porta. Nullam sodales tortor tortor, non lacinia diam finibus id. Duis libero orci, suscipit ac odio et, dictum consequat ipsum. Pellentesque eu ligula sagittis, volutpat eros at, lacinia lorem. Cras euismod tellus in iaculis tempor. Quisque accumsan, magna a congue venenatis, ante ipsum aliquam lectus, at egestas enim nunc at justo. Quisque sem purus, viverra ut tristique ut, maximus id enim. Etiam quis placerat sem. In sollicitudin, lacus eu rutrum mollis, nulla eros luctus elit, vel dapibus urna purus nec urna. Phasellus egestas massa quam, ac molestie erat hendrerit a. Praesent ultrices neque ut turpis molestie auctor. Etiam molestie placerat purus, et euismod erat aliquam in. Morbi id suscipit justo. + +Proin est ante, consequat at varius a, mattis quis felis. Sed accumsan nibh sit amet ipsum elementum posuere. Vestibulum bibendum id diam sit amet gravida. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi nec dolor vel ipsum dignissim hendrerit vel non ipsum. Praesent facilisis orci quis elit auctor lobortis. Phasellus cursus risus lectus, vel lobortis libero dapibus in. Quisque tristique tempus leo a pulvinar. Pellentesque a magna tincidunt, pellentesque massa nec, laoreet orci. Morbi congue ornare dolor quis commodo. Phasellus massa nisi, tincidunt at eros dictum, hendrerit lobortis urna. Maecenas porta, magna id mattis molestie, nibh tellus lobortis sem, eget tincidunt ipsum quam eu turpis. + +Ut gravida orci risus, vel rutrum mauris vehicula id. Etiam bibendum, neque a placerat condimentum, ex orci imperdiet lectus, quis dapibus arcu lacus eget lectus. Sed consequat non mi sit amet venenatis. Fusce vestibulum erat libero, eget hendrerit risus vulputate sollicitudin. Integer sed eleifend felis. Donec commodo, sem eu mattis placerat, urna odio aliquam tellus, et laoreet justo tellus eget erat. Fusce sed suscipit tortor. Nam hendrerit nibh ac nunc auctor lacinia. Pellentesque placerat condimentum ipsum, eget semper tortor hendrerit vel. Nullam non urna eu lacus pellentesque congue ut id eros. + +Nunc finibus leo in rhoncus tristique. Sed eu ipsum nec nisl egestas faucibus eget a felis. Pellentesque vitae nisi in nulla accumsan fermentum. Sed venenatis feugiat eleifend. Fusce porttitor varius placerat. Aliquam aliquet lacus sit amet mattis mollis. Sed vel nulla quis dolor suscipit vehicula ac viverra lorem. Duis viverra ipsum eget nulla ullamcorper fermentum. Mauris tincidunt arcu quis quam fringilla ornare. Donec et iaculis tortor. Nam ultricies libero vel ipsum aliquet efficitur. Morbi eget dolor aliquam, tempus sapien eget, viverra ante. Donec varius mollis ex, sed efficitur purus euismod interdum. Quisque vel sapien non neque tincidunt semper. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. + +Suspendisse sit amet purus leo. Fusce lectus lorem, aliquam ac nulla eget, imperdiet ornare eros. Nullam sem augue, varius in nisi non, sollicitudin pellentesque ante. Etiam eu odio condimentum, tempor libero et, egestas arcu. Cras pellentesque eleifend aliquet. Pellentesque non blandit ligula. Ut congue viverra rhoncus. Phasellus mattis mi ac eros placerat, eu feugiat tellus ultrices. Aenean mollis laoreet libero eu imperdiet. Cras sed pulvinar mi, ac vehicula ligula. Vestibulum sit amet ex massa. In a egestas eros. + +Mauris pretium ipsum risus, venenatis cursus ante imperdiet id. Praesent eu turpis nec risus feugiat maximus ullamcorper ac lectus. Integer placerat at mi vel dapibus. Vestibulum fermentum turpis sit amet turpis viverra, id aliquet diam suscipit. Nam nec ex sed ante ullamcorper pharetra quis sit amet risus. Sed ac faucibus velit, id feugiat nibh. Nullam eget ipsum ex. Vivamus tincidunt non nunc non faucibus. Quisque bibendum viverra facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur at nisi hendrerit quam suscipit egestas. Curabitur laoreet maximus ultricies. Duis ut tellus ac augue molestie dictum. + +Suspendisse rhoncus iaculis erat, ut ullamcorper est tristique eget. Donec auctor nec risus at gravida. Vivamus volutpat vulputate tellus, vel ultricies eros suscipit eget. Ut pulvinar id mi eu tempus. Morbi malesuada augue in dui varius, nec blandit neque vehicula. Donec ornare nec nisl in mollis. Morbi enim nisi, rhoncus nec est id, dapibus tempus urna. Ut id elit a felis vestibulum consectetur. Duis lectus quam, pharetra sit amet diam sed, posuere vestibulum erat. Fusce vitae maximus massa. Nullam id metus tempus, iaculis risus eu, lobortis urna. Quisque in congue urna. Pellentesque placerat neque in augue dapibus, non varius ex malesuada. Curabitur ut eleifend libero. Fusce vitae ligula luctus, fermentum enim vitae, ultrices erat. + +Sed viverra augue turpis, scelerisque egestas sapien mattis eu. Duis laoreet magna at ex pharetra dapibus. Praesent eget odio vel quam venenatis dictum. Nulla in sollicitudin dolor. Mauris lobortis nec eros vel rhoncus. Vestibulum porta viverra venenatis. Curabitur vel scelerisque quam, a egestas velit. Praesent volutpat tincidunt magna at laoreet. + +Cras nec lorem odio. Pellentesque quis dui urna. Praesent at tellus ac lectus scelerisque placerat nec eu risus. Vestibulum sit amet mattis ligula. Vivamus sed nisi at leo elementum accumsan at sit amet arcu. Aenean mattis tellus nec leo gravida, eget hendrerit nisl faucibus. Mauris pellentesque luctus condimentum. Maecenas pretium sapien nunc, eget commodo dolor maximus id. Mauris vestibulum accumsan massa a dictum. Phasellus interdum quam ligula, ut maximus diam blandit aliquam. Nunc vitae ex eu erat condimentum consectetur. Maecenas interdum condimentum volutpat. + +Donec et enim a libero rutrum laoreet. Praesent a condimentum sem, at tincidunt quam. In vel molestie risus. Sed urna dui, molestie vitae mollis laoreet, tempor quis lectus. Praesent vitae auctor est, et aliquet nunc. Curabitur vulputate blandit nulla, at gravida metus. Maecenas gravida dui eu iaculis tristique. Pellentesque posuere turpis nec auctor eleifend. Suspendisse bibendum diam eu tellus lobortis, et laoreet quam congue. In hac habitasse platea dictumst. Morbi dictum neque velit, eget rutrum eros ultrices sit amet. + +Phasellus fermentum risus pharetra consectetur bibendum. Donec magna tortor, lacinia vitae nibh quis, aliquet pretium lorem. Donec turpis nisi, pretium eu enim volutpat, mattis malesuada augue. Nullam vel tellus iaculis, sollicitudin elit eget, tincidunt lacus. Fusce elementum elementum felis et iaculis. Suspendisse porta eros nec neque malesuada, in malesuada ante sollicitudin. Vivamus bibendum viverra molestie. + +Integer feugiat, erat nec convallis aliquam, velit felis congue erat, molestie eleifend tellus erat in tellus. Nunc et justo purus. Donec egestas fermentum dui non feugiat. Quisque in sapien sagittis, gravida quam id, iaculis lectus. Cras sagittis rhoncus bibendum. Fusce quis metus in velit scelerisque tincidunt at non ipsum. Vivamus efficitur ante eu odio vulputate, vitae ultricies risus vehicula. Proin eget odio eu sem tincidunt feugiat vel id lorem. + +Vestibulum sit amet nulla dignissim, euismod mi in, fermentum tortor. Donec ut aliquet libero, lacinia accumsan velit. Donec et nulla quam. Nullam laoreet odio nec nunc imperdiet, a congue eros venenatis. Quisque nec tellus sit amet neque interdum posuere. Duis quis mi gravida, tincidunt diam convallis, ultricies augue. Mauris consequat risus non porttitor congue. Ut in ligula consequat, viverra nunc a, eleifend enim. Duis ligula urna, imperdiet nec facilisis et, ornare eu ex. Proin lobortis lectus a lobortis porttitor. Nulla leo metus, egestas eu libero sed, pretium faucibus felis. Vestibulum non sem tortor. Nam cursus est leo. Vivamus luctus enim odio, non interdum sem dapibus a. Aenean accumsan consequat lectus in imperdiet. + +Donec vehicula laoreet ipsum in posuere. Quisque vel quam imperdiet, sollicitudin nisi quis, suscipit velit. Morbi id sodales mauris. Curabitur tellus arcu, feugiat sed dui sit amet, sodales sagittis libero. Aenean vel suscipit metus, non placerat leo. Vestibulum quis nulla elit. Proin scelerisque non ante ut commodo. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Sed non urna dolor. Suspendisse convallis mi porta pulvinar ultrices. Suspendisse quam ipsum, hendrerit non scelerisque molestie, interdum dictum nunc. Morbi condimentum condimentum turpis eu luctus. Pellentesque sagittis sollicitudin odio, sed ultricies felis ornare sit amet. Sed ultrices ex leo, a tincidunt nisl gravida sed. Nullam ornare accumsan porta. Praesent consectetur id est nec sollicitudin. + +In hac habitasse platea dictumst. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sed ultrices nibh. Duis accumsan suscipit eros, a dictum odio tempus sit amet. Aenean imperdiet erat ac lacus finibus, scelerisque cursus massa imperdiet. Mauris molestie risus ut lacinia posuere. Nulla et sodales purus. Maecenas orci erat, placerat in tristique quis, placerat in mi. + +Donec sollicitudin pellentesque odio in feugiat. Morbi eu dolor ut mauris congue sollicitudin. Aliquam erat volutpat. Nulla id varius dui. Curabitur finibus urna ante, consectetur interdum nisi volutpat a. Quisque quis mi tristique, consequat tellus eget, rutrum sapien. Vivamus vitae tellus vulputate, rutrum ex eu, vulputate sem. Suspendisse viverra lorem tellus, vel interdum orci gravida quis. Ut laoreet arcu at mi ullamcorper finibus. Duis porta sagittis vestibulum. Sed commodo nisl vitae urna sollicitudin, nec lacinia est sodales. Curabitur imperdiet sodales dui sed iaculis. Sed ac tellus maximus, eleifend quam sit amet, feugiat elit. Aenean viverra, dui at mattis varius, est odio vestibulum sapien, sit amet mollis libero massa nec velit. Etiam quis sodales justo. + +Ut ultricies, sem eget sodales feugiat, nunc arcu congue elit, ac tempor justo massa nec purus. Maecenas enim nunc, pharetra eget dictum sit amet, tempus pellentesque velit. Suspendisse venenatis ligula in nulla mattis, et imperdiet ex tincidunt. Etiam vulputate, tellus et ultrices suscipit, enim velit laoreet massa, vitae congue odio enim ac urna. Morbi quam lorem, iaculis ac varius sagittis, euismod quis dolor. In ut dui eu purus feugiat consectetur. Vestibulum cursus velit quis lacus pellentesque iaculis. Cras in risus sed mauris porta rutrum. Nulla facilisi. Nullam eu bibendum est, non pellentesque lectus. Sed imperdiet feugiat lorem, quis convallis ante auctor in. Maecenas justo magna, scelerisque sit amet tellus eget, varius elementum risus. Duis placerat et quam sed varius. + +Duis nec nibh vitae nibh dignissim mollis quis sed felis. Curabitur vitae quam placerat, venenatis purus ut, euismod nisl. Curabitur porttitor nibh eu pulvinar ullamcorper. Suspendisse posuere nec ipsum ac dapibus. Cras convallis consectetur urna. Phasellus a nibh in dolor lacinia posuere id eget augue. In eu pharetra lorem, vitae cursus lacus. Aliquam tincidunt nibh lectus. Aenean facilisis ultricies posuere. Sed ut placerat orci. Curabitur scelerisque gravida blandit. Maecenas placerat ligula eget suscipit fringilla. Mauris a tortor justo. Aliquam hendrerit semper mollis. Phasellus et tincidunt libero. Etiam vel quam libero. + +Quisque aliquet tempor ex. Ut ante sem, vehicula at enim vel, gravida porta elit. Etiam vitae lacus a neque lobortis consectetur. Mauris sed interdum odio. Mauris elementum ex blandit tempor cursus. Integer in enim in leo viverra elementum. Fusce consectetur metus et sem rutrum, mattis euismod diam semper. Nunc sed ipsum vel urna consequat vehicula. Donec cursus pretium lorem, vestibulum pretium felis commodo sit amet. Nam blandit felis enim, eget gravida ex faucibus a. In nec neque massa. Etiam laoreet posuere ipsum. Praesent volutpat nunc dolor, ac vulputate magna facilisis non. Aenean congue turpis vel lectus sollicitudin tristique. Sed nec consequat purus, non vehicula quam. Etiam ultricies, est ac dictum tincidunt, turpis turpis pretium massa, a vulputate libero justo at nibh. + +Aliquam erat volutpat. Cras ultrices augue ac sollicitudin lobortis. Curabitur et aliquet purus. Duis feugiat semper facilisis. Phasellus lobortis cursus velit, a sollicitudin tortor. Nam feugiat sapien non dapibus condimentum. Morbi at mi bibendum, commodo quam at, laoreet enim. Integer eu ultrices enim. Sed vestibulum eu urna ut dictum. Curabitur at mattis leo, sed cursus massa. Aliquam porttitor, felis quis fermentum porttitor, justo velit feugiat nulla, eget condimentum sem dui ut sapien. + +In fringilla elit eu orci aliquam consequat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut eget fringilla tellus. Curabitur fermentum, mi et condimentum suscipit, elit neque bibendum dui, et hendrerit nunc metus id ipsum. Morbi placerat mi in hendrerit congue. Ut feugiat mauris eget scelerisque viverra. Vivamus sit amet erat dictum, sagittis lectus nec, pulvinar lorem. Sed non enim ac dui sollicitudin aliquet. Quisque ut lacus dolor. Fusce hendrerit malesuada euismod. Nulla faucibus vel mauris eu mollis. Mauris est diam, fringilla ac arcu feugiat, efficitur volutpat turpis. Aliquam venenatis cursus massa sed porttitor. Ut ac finibus enim, in tincidunt sapien. + +Nunc faucibus semper turpis a lacinia. Phasellus gravida, libero vel pulvinar ornare, ex sem tincidunt lectus, sit amet convallis augue risus at tortor. Quisque sit amet ipsum id nulla posuere vestibulum. Pellentesque scelerisque mauris vel leo viverra sodales. Nulla viverra aliquam ex, ut rutrum enim fermentum venenatis. Aenean eget dapibus ex, eget faucibus metus. Vestibulum volutpat leo in diam semper, eget porta magna suscipit. Sed sit amet nulla blandit, aliquam dolor ac, gravida velit. Sed vel velit viverra, maximus est id, convallis justo. + +Curabitur nulla ante, vulputate at libero vel, ullamcorper rutrum nibh. Pellentesque porttitor eu mauris id mattis. Duis vulputate augue elit, eget interdum justo pretium vel. Maecenas eu vulputate arcu, eget posuere purus. Suspendisse viverra a velit dictum eleifend. Suspendisse vitae dapibus diam. Donec vehicula justo in ante interdum, eu luctus diam placerat. Vivamus convallis ipsum eu orci suscipit, sed fermentum enim euismod. Maecenas faucibus elit vitae ex ornare tristique. Donec vestibulum nec elit sit amet porttitor. Aenean tempor lectus eget tortor hendrerit luctus. Nullam interdum vitae lectus vel feugiat. Cras in risus non magna consectetur lobortis. Sed faucibus enim quis gravida convallis. + +Phasellus eget massa sit amet libero ultrices suscipit. Vivamus at risus sapien. Nam mollis nunc eget velit dictum maximus. Sed pellentesque, nunc ac fringilla lacinia, quam enim mattis ex, sed euismod tortor metus eu neque. Ut mattis nisl ut lectus rhoncus, sodales bibendum eros porta. Nulla porttitor enim nec diam sagittis, eget porta velit efficitur. Vestibulum ultricies eros neque. Phasellus rutrum suscipit enim, in interdum ante gravida vitae. Sed in sagittis diam, non commodo velit. + +Morbi hendrerit odio orci, nec tincidunt odio rhoncus nec. Mauris neque velit, vehicula a lorem at, suscipit tristique dui. Sed finibus, nisl in mattis convallis, turpis neque sodales lacus, eu porta enim magna non diam. Nam commodo sodales risus consectetur malesuada. In eget elementum justo. Phasellus sit amet massa imperdiet, dapibus nunc sit amet, suscipit orci. Fusce condimentum laoreet feugiat. Ut ut viverra ante. Praesent bibendum interdum commodo. Nulla mollis nisi a est ornare volutpat. Sed at ligula eu nisi dapibus tempus. Proin cursus vestibulum justo, nec efficitur justo dignissim vel. Nunc quis maximus eros. + +Cras viverra, diam a tristique mattis, libero felis vulputate tellus, a ornare felis leo a dui. Nulla ante nulla, finibus ut tellus ut, blandit pharetra nibh. Proin eleifend fermentum ex, eget auctor libero vulputate in. Nullam ultricies, mauris placerat pretium placerat, leo urna lobortis leo, vel placerat arcu libero sed mauris. Aliquam mauris ligula, ornare at urna at, eleifend gravida ligula. Vestibulum consectetur ut nulla non scelerisque. Donec ornare, sem nec elementum aliquam, urna nulla bibendum metus, eu euismod dui ligula ac est. Fusce laoreet erat eu ex lobortis, quis bibendum ligula interdum. Sed vel mi erat. Vivamus id lacus ac enim mattis tempor. Nunc ultricies pellentesque enim sed euismod. Fusce tincidunt convallis elit quis aliquam. Mauris nulla ipsum, sollicitudin quis diam ac, feugiat volutpat tellus. In nibh nibh, vulputate quis tincidunt quis, pulvinar eget magna. Pellentesque quis finibus dolor. Suspendisse viverra vitae lectus non eleifend. + +Nunc ut orci et sapien maximus semper. Nulla dignissim sem urna, ac varius lectus ultricies id. Quisque aliquet pulvinar pretium. In ultricies molestie tellus vehicula porta. Nam enim lorem, aliquam eget ex et, hendrerit volutpat quam. Maecenas diam lacus, pellentesque eget tempus ac, pharetra eu elit. Donec vel eros a sem facilisis vulputate. Nullam ac nisi vulputate, laoreet nisl ac, eleifend sem. Nullam mi massa, rhoncus sed pharetra interdum, tincidunt eget nunc. Aliquam viverra mattis posuere. Mauris et dui sed nisl sollicitudin fermentum quis ut arcu. Nam placerat eget orci at tincidunt. Curabitur vel turpis metus. Phasellus nibh nulla, fermentum scelerisque sem vel, gravida tincidunt velit. Pellentesque vel quam tempor, finibus massa pellentesque, condimentum dui. + +Donec at mattis neque. Etiam velit diam, consequat auctor mauris id, hendrerit faucibus metus. Maecenas ullamcorper eros a est sodales, ac consectetur odio scelerisque. Donec leo metus, imperdiet at pellentesque vel, feugiat id erat. Suspendisse at magna enim. Vestibulum placerat sodales lorem id sollicitudin. Aenean at euismod ligula, eget mollis diam. Phasellus pulvinar, orci nec pretium condimentum, est erat facilisis purus, quis feugiat augue elit aliquam nulla. Aenean vitae tortor id risus congue tincidunt. Sed dolor enim, mattis a ullamcorper id, volutpat ac leo. + +Proin vehicula feugiat augue, id feugiat quam sodales quis. Donec et ultricies massa, a lacinia nulla. Duis aliquam augue ornare euismod viverra. Ut lectus risus, rutrum sit amet efficitur a, luctus nec nisl. Cras volutpat ullamcorper congue. Sed vitae odio metus. Phasellus aliquet euismod varius. + +Nullam sem ex, malesuada ut magna ut, pretium mollis arcu. Nam porttitor eros cursus mi lacinia faucibus. Suspendisse aliquet eleifend iaculis. Maecenas sit amet viverra tortor. Nunc a mollis risus. Etiam tempus dolor in tortor malesuada mattis. Ut tincidunt venenatis est sit amet dignissim. Vestibulum massa enim, tristique sed scelerisque eu, fringilla ac velit. Donec efficitur quis urna sit amet malesuada. Vestibulum consequat ac ligula in dapibus. Maecenas massa massa, molestie non posuere nec, elementum ut magna. In nisi erat, mollis non venenatis eu, faucibus in justo. Morbi gravida non ex non egestas. Pellentesque finibus laoreet diam, eu commodo augue congue vitae. + +Aenean sem mi, ullamcorper dapibus lobortis vitae, interdum tincidunt tortor. Vivamus eget vulputate libero. Ut bibendum posuere lectus, vel tincidunt tortor aliquet at. Phasellus malesuada orci et bibendum accumsan. Aliquam quis libero vel leo mollis porta. Sed sagittis leo ac lacus dictum, ac malesuada elit finibus. Suspendisse pharetra luctus commodo. Vivamus ultricies a odio non interdum. Vivamus scelerisque tincidunt turpis quis tempor. Pellentesque tortor ligula, varius non nunc eu, blandit sollicitudin neque. Nunc imperdiet, diam et tristique luctus, ipsum ex condimentum nunc, sit amet aliquam justo velit sed libero. Duis vel suscipit ligula. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed tincidunt neque vel massa ultricies, id dictum leo consequat. Curabitur lobortis ultricies tellus, eget mattis nisl aliquam sit amet. + +Proin at suscipit justo. Vivamus ut vestibulum nisl. Pellentesque enim odio, pharetra non magna sed, efficitur auctor magna. Praesent tincidunt ante quis ante hendrerit viverra. Pellentesque vel ipsum id magna vulputate efficitur. Sed nec neque accumsan, pulvinar sapien quis, euismod mauris. Donec condimentum laoreet sapien quis gravida. Quisque sed mattis purus. Vestibulum placerat vel neque maximus scelerisque. + +Vestibulum mattis quam quis efficitur elementum. Duis dictum dolor ac scelerisque commodo. Fusce sollicitudin nisi sit amet dictum placerat. Suspendisse euismod pharetra eleifend. In eros nisl, porttitor sed mauris at, consectetur aliquet mauris. Donec euismod viverra neque sed fermentum. Phasellus libero magna, accumsan ut ultricies vitae, dignissim eget metus. Donec tellus turpis, interdum eget maximus nec, hendrerit eget massa. Curabitur auctor ligula in iaculis auctor. In ultrices quam suscipit cursus finibus. Aenean id mi at dolor interdum iaculis vitae ut lorem. Nullam sed nibh fringilla, lacinia odio nec, placerat erat. In dui libero, viverra ac viverra ac, pellentesque sit amet turpis. + +Nulla in enim ex. Sed feugiat est et consectetur venenatis. Cras varius facilisis dui vel convallis. Vestibulum et elit eget tellus feugiat pellentesque. In ut ante eu purus aliquet posuere. Nulla nec ornare sem, sed luctus lorem. Nam varius iaculis odio, eget faucibus nisl ullamcorper in. Sed eget cursus felis, nec efficitur nisi. + +Vivamus commodo et sem quis pulvinar. Pellentesque libero ante, venenatis vitae ligula sit amet, ornare sollicitudin nulla. Mauris eget tellus hendrerit, pulvinar metus quis, tempor nisi. Proin magna ex, laoreet sed tortor quis, varius fermentum enim. Integer eu dolor dictum, vulputate tortor et, aliquet ligula. Vestibulum vitae justo id mauris luctus sollicitudin. Suspendisse eget auctor neque, sodales egestas lorem. Vestibulum lacinia egestas metus vitae euismod. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus ex tellus, volutpat nec pulvinar sit amet, condimentum vitae dui. Curabitur vel felis sodales, lacinia nunc iaculis, ullamcorper augue. Pellentesque consequat dolor quis eros efficitur malesuada. Nulla ut malesuada lectus. + +Morbi et tristique ante. Aliquam erat volutpat. Vivamus vitae dui nec turpis pellentesque fermentum. Quisque eget velit massa. Pellentesque tristique aliquam nisl, eu sollicitudin justo venenatis sed. Duis eleifend sem eros, ut aliquam libero porttitor id. Sed non nunc consequat, rhoncus diam eu, commodo erat. Praesent fermentum in lectus id blandit. Donec quis ipsum at justo volutpat finibus. Nulla blandit justo nulla, at mollis lacus consequat eget. Aenean sollicitudin quis eros ut ullamcorper. + +Pellentesque venenatis nulla ut mi aliquet feugiat. Cras semper vel magna nec pharetra. Integer mattis felis et sapien commodo imperdiet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis quis luctus felis. Vestibulum justo nibh, aliquam non lectus vitae, molestie placerat justo. Donec lorem nibh, gravida sit amet hendrerit ac, maximus id ipsum. Nunc ac libero sodales risus eleifend sagittis. Phasellus est massa, lobortis elementum ex sed, scelerisque consectetur neque. Nunc faucibus neque id lorem malesuada, eget convallis ex mattis. + +Sed turpis tortor, fermentum non turpis id, posuere varius nibh. Donec iaculis lorem dui. Etiam eros ante, sodales eget venenatis at, consectetur eget risus. Curabitur non aliquam ante, a pretium justo. Maecenas tempor nisl tortor, vitae dictum nisi ultrices eu. Duis eget dui ultrices, porttitor lacus sed, lobortis purus. Quisque mattis elit nec neque sagittis, sed commodo leo blandit. Mauris sodales interdum eleifend. Vestibulum condimentum consectetur augue, id luctus diam convallis et. + +Nunc suscipit risus in justo accumsan, a placerat magna tincidunt. Proin a nisl ipsum. Sed libero dui, tristique in augue quis, auctor tristique risus. Sed porttitor ex augue, eu porta augue molestie a. Duis rhoncus purus libero, eu tempus turpis condimentum at. Sed mollis nisi id lectus placerat tincidunt. Maecenas non scelerisque elit, quis rutrum orci. Donec in tellus pharetra urna ornare lobortis. Phasellus id risus at nisi varius rutrum eu ut turpis. + +Duis dictum justo quis nisl porta, eget tincidunt magna suscipit. Sed velit massa, ullamcorper eu sodales ac, pretium a massa. Duis et rutrum tortor. Nulla accumsan hendrerit sapien, cursus volutpat eros egestas eget. Donec sollicitudin at ante quis sollicitudin. Aenean blandit feugiat diam, id feugiat eros faucibus eget. Donec viverra dolor vel justo scelerisque dignissim. Nulla semper sem nunc, rhoncus semper tellus ultricies sed. Duis in ornare diam. Donec vehicula feugiat varius. Maecenas ut suscipit est. Vivamus sem sem, finibus at dolor sit amet, euismod dapibus ligula. Vestibulum fringilla odio dapibus, congue massa eget, congue sem. Donec feugiat magna eget tortor lacinia scelerisque non et ipsum. + +Suspendisse potenti. Nunc convallis sollicitudin ex eget venenatis. Sed iaculis nibh ex, vel ornare ligula congue dignissim. Quisque sollicitudin dolor ac dui vestibulum, sit amet molestie nisi aliquet. Donec at risus felis. Aenean sollicitudin metus a feugiat porta. Aenean a tortor ut dolor cursus sagittis. Vivamus consectetur porttitor nunc in facilisis. Proin sit amet mi vel lectus consectetur ultrices. + +Sed cursus lectus vitae nunc tristique, nec commodo turpis dapibus. Pellentesque luctus ex id facilisis ornare. Morbi quis placerat dolor. Donec in lectus in arcu mattis porttitor ac sit amet metus. Cras congue mauris non risus sodales, vitae feugiat ipsum bibendum. Nulla venenatis urna sed libero elementum, a cursus lorem commodo. Mauris faucibus lobortis eros nec commodo. + +Nullam suscipit ligula ullamcorper lorem commodo blandit. Nulla porta nibh quis pulvinar placerat. Vivamus eu arcu justo. Vestibulum imperdiet est ut fermentum porttitor. Pellentesque consectetur libero in sapien efficitur scelerisque. Curabitur ac erat sit amet odio aliquet dignissim. Pellentesque mi sem, rhoncus et luctus at, porttitor rutrum lectus. Vestibulum sollicitudin sollicitudin suscipit. Aenean efficitur dolor non ultrices imperdiet. Donec vel sem ex. + +Sed convallis mauris aliquam rutrum cursus. Ut tempor porttitor sodales. Etiam eu risus ac augue gravida egestas et eu dolor. Proin id magna ex. Suspendisse quis lectus quis lorem ultricies tempus. Donec porttitor velit vitae tincidunt faucibus. Aliquam vitae semper nisi. Morbi ultrices, leo non pretium dapibus, dui libero pellentesque ex, vel placerat enim ante vitae dui. Nunc varius, sem sit amet sagittis lobortis, lectus odio scelerisque mauris, ut vestibulum orci magna quis neque. Sed id congue justo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris congue nisi est, malesuada mollis elit tincidunt sed. Curabitur sed ex sit amet felis tristique elementum vitae vel nibh. + +Etiam mollis pretium lobortis. Mauris augue lacus, efficitur at lacus sed, mollis tincidunt lectus. Aliquam erat volutpat. Donec at euismod elit, et mattis felis. Sed id lobortis urna. Morbi imperdiet vestibulum leo, sed maximus leo blandit eu. Aliquam semper lorem neque, nec euismod turpis mattis mollis. Quisque lobortis urna ultrices odio pretium, ac venenatis orci faucibus. Suspendisse bibendum odio ligula, sed lobortis massa pharetra nec. Donec turpis justo, iaculis at dictum ac, finibus eu libero. Maecenas quis porttitor mi, sit amet aliquet neque. + +Vivamus auctor vulputate ante, at egestas lorem. Donec eu risus in nulla mollis ultricies at et urna. Duis accumsan porta egestas. Ut vel euismod augue. Fusce convallis nulla ante, nec fringilla velit aliquet at. Nam malesuada dapibus ligula, a aliquam nibh scelerisque ac. Praesent malesuada neque et pellentesque interdum. Curabitur volutpat at turpis vitae tristique. Vivamus porttitor semper congue. Quisque suscipit lacus mi, rhoncus ultrices tortor auctor quis. Maecenas neque neque, molestie ac facilisis eget, luctus ac lorem. In ut odio ut lacus suscipit pulvinar vitae sed elit. Nulla imperdiet, sem quis euismod sagittis, dui erat luctus dolor, faucibus faucibus erat sem eget nunc. Nam accumsan placerat malesuada. Maecenas convallis finibus pulvinar. + +Cras at placerat tortor. Morbi facilisis auctor felis sit amet molestie. Donec sodales sed lorem vitae suscipit. Etiam fermentum pharetra ipsum, nec luctus orci gravida eu. Pellentesque gravida, est non condimentum tempus, mauris ligula molestie est, in congue dolor nisl vel sapien. Duis congue tempor augue, id rutrum eros porta dapibus. Etiam rutrum eget est eget vestibulum. Aenean mollis arcu vel consequat varius. Praesent at condimentum felis. Duis nec interdum nisl. Donec commodo lorem sed sapien scelerisque malesuada non eu urna. In blandit non ipsum at porta. Nam lobortis leo vitae dui auctor, non feugiat quam bibendum. Donec auctor lectus sagittis laoreet maximus. Maecenas rhoncus laoreet porttitor. Vestibulum porttitor augue ut lectus hendrerit, eget posuere mi gravida. + +Sed mattis ex in erat pulvinar, eu imperdiet magna dapibus. Etiam nisi nibh, tempus non tellus sit amet, mattis tempor odio. Quisque nec lorem feugiat, lobortis odio et, commodo nunc. Maecenas semper purus nisi, nec vehicula nibh eleifend vitae. Nulla fermentum a lectus at maximus. Phasellus finibus metus non euismod ultrices. Etiam a pulvinar ante. Quisque convallis nec metus sit amet facilisis. Praesent laoreet massa et sollicitudin laoreet. Vestibulum in mauris aliquet, convallis mi ut, elementum purus. Nulla purus nulla, sodales at hendrerit quis, tempus sed lectus. + +Nam ut laoreet neque, ut maximus nibh. Maecenas quis justo pellentesque, sollicitudin elit at, venenatis velit. Aenean nunc velit, vehicula scelerisque odio at, consectetur laoreet purus. Duis dui purus, malesuada quis ipsum sit amet, tempor interdum libero. Curabitur porta scelerisque sapien, vitae cursus diam condimentum eu. Phasellus sed orci quam. Nullam vitae dui quis purus tincidunt vestibulum. Curabitur quis nulla porta, cursus arcu non, auctor enim. Etiam sollicitudin ex id sem vehicula mollis. Morbi viverra laoreet tincidunt. Praesent ut semper dui. Nam sit amet pretium neque. Mauris vitae luctus diam, in lacinia purus. Maecenas ut placerat justo, ut porta felis. Integer eu mauris ante. + +Aenean porttitor tellus diam, tempor consequat metus efficitur id. Suspendisse ut felis at erat tempor dictum at nec sapien. Sed vestibulum interdum felis, ac mattis mauris porta in. Nunc et condimentum massa. Sed cursus dictum justo et luctus. Integer convallis enim nisl, a rutrum lectus ultricies in. Donec dapibus lacus at nulla dapibus, id sollicitudin velit hendrerit. Fusce a magna at orci mollis rutrum ac a dolor. Aliquam erat volutpat. Morbi varius porta nunc, sit amet sodales ex hendrerit commodo. Donec tincidunt tortor sapien, vitae egestas sapien vehicula eget. + +Suspendisse potenti. Donec pulvinar felis nec leo malesuada interdum. Integer posuere placerat maximus. Donec nibh ipsum, tincidunt vitae luctus vitae, bibendum at leo. Sed cursus nisl ut ex faucibus aliquet sed nec eros. Curabitur molestie posuere felis. Integer faucibus velit eget consequat iaculis. Mauris sed vulputate odio. Phasellus maximus, elit a pharetra egestas, lorem magna semper tellus, vestibulum semper diam felis at sapien. Suspendisse facilisis, nisl sit amet euismod vehicula, libero nulla vehicula dolor, quis fermentum nibh elit sit amet diam. + +Morbi lorem enim, euismod eu varius ut, scelerisque quis odio. Nam tempus vitae eros id molestie. Nunc pretium in nulla eget accumsan. Quisque mattis est ut semper aliquet. Maecenas eget diam elementum, fermentum ipsum a, euismod sapien. Duis quam ligula, cursus et velit nec, ullamcorper tincidunt magna. Donec vulputate nisl est, et ullamcorper urna tempor sit amet. + +Proin lacinia dui non turpis congue pretium. Morbi posuere metus vel purus imperdiet interdum. Morbi venenatis vel eros non ultricies. Nulla vel semper elit. Ut quis purus tincidunt, auctor justo ut, faucibus turpis. Proin quis mattis erat, at faucibus ligula. Mauris in mauris enim. Donec facilisis enim at est feugiat hendrerit. Nam vel nisi lorem. Fusce ultricies convallis diam, in feugiat tortor luctus quis. Donec tempor, leo vitae volutpat aliquam, magna elit feugiat leo, quis placerat sapien felis eget arcu. Donec ornare fermentum eleifend. Integer a est orci. + +Proin rhoncus egestas leo. Nulla ultricies porta elit quis ornare. Nunc fermentum interdum vehicula. In in ligula lorem. Donec nec arcu sit amet orci lobortis iaculis. Mauris at mollis erat, sit amet mollis tortor. Mauris laoreet justo ullamcorper porttitor auctor. Aenean sit amet aliquam lectus, id fermentum eros. Praesent urna sem, vehicula ac fermentum id, dapibus ut purus. Vestibulum vitae tempus nunc. Donec at nunc ornare metus volutpat porta at eget magna. Donec varius aliquet metus, eu lobortis risus aliquam sed. Ut dapibus fermentum velit, ac tincidunt libero faucibus at. + +In in purus auctor, feugiat massa quis, facilisis nisi. Donec dolor purus, gravida eget dolor ac, porttitor imperdiet urna. Donec faucibus placerat erat, a sagittis ante finibus ac. Sed venenatis dignissim elit, in iaculis felis posuere faucibus. Praesent sed viverra dolor. Mauris sed nulla consectetur nunc laoreet molestie in ut metus. Proin ac ex sit amet magna vulputate hendrerit ac condimentum urna. Proin ligula metus, gravida et sollicitudin facilisis, iaculis ut odio. Cras tincidunt urna et augue varius, ut facilisis urna consequat. Aenean vehicula finibus quam. Ut iaculis eu diam ac mollis. Nam mi lorem, tristique eget varius at, sodales at urna. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin vitae dictum erat, et auctor ipsum. Nullam nunc nunc, sollicitudin quis magna a, vestibulum fermentum mauris. Praesent at erat dolor. Proin laoreet tristique nulla vel efficitur. Nam sed ultrices nibh, id rutrum nunc. Curabitur eleifend a erat sit amet sollicitudin. Nullam metus quam, laoreet vitae dapibus id, placerat sed leo. Aliquam erat volutpat. Donec turpis nisl, cursus eu ex sit amet, lacinia pellentesque nisl. Sed id ipsum massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec interdum scelerisque lorem eu mattis. + +Vivamus ac tristique massa, nec facilisis nisl. Nam ipsum neque, tincidunt vel urna in, cursus imperdiet enim. Nam pellentesque egestas tempus. Morbi facilisis imperdiet libero vitae fringilla. Nam lacinia ligula at sapien facilisis malesuada. Nullam accumsan pulvinar sem, et cursus libero porta sit amet. Curabitur vulputate erat elit, ut pulvinar erat maximus vel. + +Cras aliquet metus ut purus sagittis, vel venenatis ante consectetur. Pellentesque nulla lacus, viverra viverra mattis non, placerat vitae nibh. Donec enim turpis, accumsan sit amet tincidunt eu, imperdiet non metus. Morbi ipsum eros, tincidunt vel est ac, tristique porttitor nibh. Praesent ut ullamcorper mauris. Sed laoreet sit amet diam congue venenatis. Integer porta purus nec orci sagittis posuere. + +Donec vehicula mauris eget lacus mollis venenatis et sed nibh. Nam sodales ligula ipsum, scelerisque lacinia ligula sagittis in. Nam sit amet ipsum at erat malesuada congue. Aenean ut sollicitudin sapien. Etiam at tempor odio. Mauris vitae purus ut magna suscipit consequat. Vivamus quis sapien neque. Nulla vulputate sem sit amet massa pellentesque, eleifend tristique ligula egestas. Suspendisse tincidunt gravida mi, in pulvinar lectus egestas non. Aenean imperdiet ex sit amet nunc sollicitudin porta. Integer justo odio, ultricies at interdum in, rhoncus vitae sem. Sed porttitor arcu quis purus aliquet hendrerit. Praesent tempor tortor at dolor dictum pulvinar. Nulla aliquet nunc non ligula scelerisque accumsan. Donec nulla justo, congue vitae massa in, faucibus hendrerit magna. Donec non egestas purus. + +`), + tail: VSBuffer.fromString(`Vivamus iaculis, lacus efficitur faucibus porta, dui nulla facilisis ligula, ut sodales odio nunc id sapien. Cras viverra auctor ipsum, dapibus mattis neque dictum sed. Sed convallis fermentum molestie. Nulla facilisi turpis duis.`) + }; +} + diff --git a/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts index 9f00df45232..7c9894cf985 100644 --- a/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts @@ -8,6 +8,7 @@ import { workbenchInstantiationService, TestServiceAccessor, TestTextFileEditorM import { toResource } from 'vs/base/test/common/utils'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; +import { FileOperation } from 'vs/platform/files/common/files'; suite('Files - TextFileService', () => { @@ -100,7 +101,7 @@ suite('Files - TextFileService', () => { assert.ok(!accessor.textFileService.isDirty(model.resource)); }); - test('create', async function () { + test('create does not overwrite existing model', async function () { model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); (accessor.textFileService.files).add(model.resource, model); @@ -111,14 +112,15 @@ suite('Files - TextFileService', () => { let eventCounter = 0; const disposable1 = accessor.workingCopyFileService.addFileOperationParticipant({ - participate: async target => { - assert.equal(target.toString(), model.resource.toString()); + participate: async files => { + assert.equal(files[0].target, model.resource.toString()); eventCounter++; } }); - const disposable2 = accessor.textFileService.onDidCreateTextFile(e => { - assert.equal(e.resource.toString(), model.resource.toString()); + const disposable2 = accessor.workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { + assert.equal(e.operation, FileOperation.CREATE); + assert.equal(e.files[0].target.toString(), model.resource.toString()); eventCounter++; }); diff --git a/src/vs/workbench/services/textfile/test/electron-browser/textFileService.io.test.ts b/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts similarity index 84% rename from src/vs/workbench/services/textfile/test/electron-browser/textFileService.io.test.ts rename to src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts index 67e5bcc9e29..0c11bcc90cb 100644 --- a/src/vs/workbench/services/textfile/test/electron-browser/textFileService.io.test.ts +++ b/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts @@ -4,74 +4,50 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; +import { ITextFileService, snapshotToString, TextFileOperationError, TextFileOperationResult, stringToSnapshot } from 'vs/workbench/services/textfile/common/textfiles'; import { URI } from 'vs/base/common/uri'; -import { ITextFileService, snapshotToString, TextFileOperationResult, TextFileOperationError } from 'vs/workbench/services/textfile/common/textfiles'; -import { IFileService } from 'vs/platform/files/common/files'; -import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; -import { Schemas } from 'vs/base/common/network'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { rimraf, RimRafMode, copy, readFile, exists } from 'vs/base/node/pfs'; -import { DisposableStore } from 'vs/base/common/lifecycle'; -import { FileService } from 'vs/platform/files/common/fileService'; -import { NullLogService } from 'vs/platform/log/common/log'; -import { getRandomTestPath } from 'vs/base/test/node/testUtils'; -import { tmpdir } from 'os'; -import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; -import { generateUuid } from 'vs/base/common/uuid'; import { join, basename } from 'vs/base/common/path'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; -import { UTF16be, UTF16le, UTF8_with_bom, UTF8 } from 'vs/base/node/encoding'; -import { DefaultEndOfLine, ITextSnapshot } from 'vs/editor/common/model'; +import { UTF16le, UTF8_with_bom, UTF16be, UTF8 } from 'vs/workbench/services/textfile/common/encoding'; +import { VSBuffer } from 'vs/base/common/buffer'; import { createTextModel } from 'vs/editor/test/common/editorTestUtils'; +import { ITextSnapshot, DefaultEndOfLine } from 'vs/editor/common/model'; import { isWindows } from 'vs/base/common/platform'; -import { readFileSync, statSync } from 'fs'; -import { detectEncodingByBOM } from 'vs/base/test/node/encoding/encoding.test'; -import { workbenchInstantiationService, TestNativeTextFileServiceWithEncodingOverrides } from 'vs/workbench/test/electron-browser/workbenchTestServices'; -suite('Files - TextFileService i/o', function () { - const parentDir = getRandomTestPath(tmpdir(), 'vsctests', 'textfileservice'); +export interface Params { + setup(): Promise<{ + service: ITextFileService, + testDir: string + }> + teardown(): Promise - const disposables = new DisposableStore(); + exists(fsPath: string): Promise; + stat(fsPath: string): Promise<{ size: number }>; + readFile(fsPath: string): Promise; + readFile(fsPath: string, encoding: string): Promise; + readFile(fsPath: string, encoding?: string): Promise; + detectEncodingByBOM(fsPath: string): Promise; +} +/** + * Allows us to reuse test suite across different environments. + * + * It introduces a bit of complexity with setup and teardown, however + * it helps us to ensure that tests are added for all environments at once, + * hence helps us catch bugs better. + */ +export default function createSuite(params: Params) { let service: ITextFileService; - let testDir: string; - - // Given issues such as https://github.com/microsoft/vscode/issues/78602 - // and https://github.com/microsoft/vscode/issues/92334 we see random test - // failures when accessing the native file system. To diagnose further, we - // retry node.js file access tests up to 3 times to rule out any random disk - // issue and increase the timeout. - this.retries(3); - this.timeout(1000 * 10); + let testDir = ''; + const { exists, stat, readFile, detectEncodingByBOM } = params; setup(async () => { - const instantiationService = workbenchInstantiationService(); - - const logService = new NullLogService(); - const fileService = new FileService(logService); - - const fileProvider = new DiskFileSystemProvider(logService); - disposables.add(fileService.registerProvider(Schemas.file, fileProvider)); - disposables.add(fileProvider); - - const collection = new ServiceCollection(); - collection.set(IFileService, fileService); - - service = instantiationService.createChild(collection).createInstance(TestNativeTextFileServiceWithEncodingOverrides); - - const id = generateUuid(); - testDir = join(parentDir, id); - const sourceDir = getPathFromAmdModule(require, './fixtures'); - - await copy(sourceDir, testDir); + const result = await params.setup(); + service = result.service; + testDir = result.testDir; }); teardown(async () => { - (service.files).dispose(); - - disposables.clear(); - - await rimraf(parentDir, RimRafMode.MOVE); + await params.teardown(); }); test('create - no encoding - content empty', async () => { @@ -82,7 +58,7 @@ suite('Files - TextFileService i/o', function () { assert.equal(await exists(resource.fsPath), true); }); - test('create - no encoding - content provided', async () => { + test('create - no encoding - content provided (string)', async () => { const resource = URI.file(join(testDir, 'small_new.txt')); await service.create(resource, 'Hello World'); @@ -91,6 +67,15 @@ suite('Files - TextFileService i/o', function () { assert.equal((await readFile(resource.fsPath)).toString(), 'Hello World'); }); + test('create - no encoding - content provided (snapshot)', async () => { + const resource = URI.file(join(testDir, 'small_new.txt')); + + await service.create(resource, stringToSnapshot('Hello World')); + + assert.equal(await exists(resource.fsPath), true); + assert.equal((await readFile(resource.fsPath)).toString(), 'Hello World'); + }); + test('create - UTF 16 LE - no content', async () => { const resource = URI.file(join(testDir, 'small_new.utf16le')); @@ -215,7 +200,7 @@ suite('Files - TextFileService i/o', function () { }); test('write - use encoding (shiftjis)', async () => { - await testEncodingKeepsData(URI.file(join(testDir, 'some_shiftjs.txt')), 'shiftjis', '中文abc'); + await testEncodingKeepsData(URI.file(join(testDir, 'some_shiftjis.txt')), 'shiftjis', '中文abc'); }); test('write - use encoding (gbk)', async () => { @@ -387,8 +372,12 @@ suite('Files - TextFileService i/o', function () { const result = await service.readStream(resource); assert.equal(result.name, basename(resource.fsPath)); - assert.equal(result.size, statSync(resource.fsPath).size); - assert.equal(snapshotToString(result.value.create(DefaultEndOfLine.LF).createSnapshot(false)), snapshotToString(createTextModel(readFileSync(resource.fsPath).toString()).createSnapshot(false))); + assert.equal(result.size, (await stat(resource.fsPath)).size); + + const content = (await readFile(resource.fsPath)).toString(); + assert.equal( + snapshotToString(result.value.create(DefaultEndOfLine.LF).createSnapshot(false)), + snapshotToString(createTextModel(content).createSnapshot(false))); } test('read - small text', async () => { @@ -407,8 +396,8 @@ suite('Files - TextFileService i/o', function () { const result = await service.read(resource); assert.equal(result.name, basename(resource.fsPath)); - assert.equal(result.size, statSync(resource.fsPath).size); - assert.equal(result.value, readFileSync(resource.fsPath).toString()); + assert.equal(result.size, (await stat(resource.fsPath)).size); + assert.equal(result.value, (await readFile(resource.fsPath)).toString()); } test('readStream - encoding picked up (CP1252)', async () => { @@ -492,7 +481,7 @@ suite('Files - TextFileService i/o', function () { await testLargeEncoding('gbk', '中国abc'); }); - test('readStream - large ShiftJS', async () => { + test('readStream - large ShiftJIS', async () => { await testLargeEncoding('shiftjis', '中文abc'); }); @@ -574,4 +563,4 @@ suite('Files - TextFileService i/o', function () { const result = await service.read(URI.file(join(testDir, 'small.txt')), { acceptTextOnly: true }); assert.equal(result.name, 'small.txt'); }); -}); +} diff --git a/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_shiftjs.txt b/src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_shiftjis.txt similarity index 100% rename from src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_shiftjs.txt rename to src/vs/workbench/services/textfile/test/electron-browser/fixtures/some_shiftjis.txt diff --git a/src/vs/workbench/services/textfile/test/electron-browser/nativeTextFileService.io.test.ts b/src/vs/workbench/services/textfile/test/electron-browser/nativeTextFileService.io.test.ts new file mode 100644 index 00000000000..722fb0cc3bf --- /dev/null +++ b/src/vs/workbench/services/textfile/test/electron-browser/nativeTextFileService.io.test.ts @@ -0,0 +1,84 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { IFileService } from 'vs/platform/files/common/files'; +import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; +import { Schemas } from 'vs/base/common/network'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { rimraf, RimRafMode, copy, readFile, exists, stat } from 'vs/base/node/pfs'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { FileService } from 'vs/platform/files/common/fileService'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { getRandomTestPath } from 'vs/base/test/node/testUtils'; +import { tmpdir } from 'os'; +import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; +import { generateUuid } from 'vs/base/common/uuid'; +import { join } from 'vs/base/common/path'; +import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { detectEncodingByBOM } from 'vs/workbench/services/textfile/test/node/encoding/encoding.test'; +import { workbenchInstantiationService, TestNativeTextFileServiceWithEncodingOverrides } from 'vs/workbench/test/electron-browser/workbenchTestServices'; +import createSuite from 'vs/workbench/services/textfile/test/common/textFileService.io.test'; +import { IWorkingCopyFileService, WorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; +import { TestWorkingCopyService } from 'vs/workbench/test/common/workbenchTestServices'; +import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; + +suite('Files - NativeTextFileService i/o', function () { + const parentDir = getRandomTestPath(tmpdir(), 'vsctests', 'textfileservice'); + + const disposables = new DisposableStore(); + + let service: ITextFileService; + let testDir: string; + + // Given issues such as https://github.com/microsoft/vscode/issues/78602 + // and https://github.com/microsoft/vscode/issues/92334 we see random test + // failures when accessing the native file system. To diagnose further, we + // retry node.js file access tests up to 3 times to rule out any random disk + // issue and increase the timeout. + this.retries(3); + this.timeout(1000 * 10); + + createSuite({ + setup: async () => { + const instantiationService = workbenchInstantiationService(); + + const logService = new NullLogService(); + const fileService = new FileService(logService); + + const fileProvider = new DiskFileSystemProvider(logService); + disposables.add(fileService.registerProvider(Schemas.file, fileProvider)); + disposables.add(fileProvider); + + const collection = new ServiceCollection(); + collection.set(IFileService, fileService); + + collection.set(IWorkingCopyFileService, new WorkingCopyFileService(fileService, new TestWorkingCopyService(), instantiationService, new UriIdentityService(fileService))); + + service = instantiationService.createChild(collection).createInstance(TestNativeTextFileServiceWithEncodingOverrides); + + const id = generateUuid(); + testDir = join(parentDir, id); + const sourceDir = getPathFromAmdModule(require, './fixtures'); + + await copy(sourceDir, testDir); + + return { service, testDir }; + }, + + teardown: async () => { + (service.files).dispose(); + + disposables.clear(); + + await rimraf(parentDir, RimRafMode.MOVE); + }, + + exists, + stat, + readFile, + detectEncodingByBOM + }); +}); diff --git a/src/vs/base/test/node/encoding/encoding.test.ts b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts similarity index 63% rename from src/vs/base/test/node/encoding/encoding.test.ts rename to src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts index 024f7084d72..f43ea2f2161 100644 --- a/src/vs/base/test/node/encoding/encoding.test.ts +++ b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts @@ -5,11 +5,12 @@ import * as assert from 'assert'; import * as fs from 'fs'; -import * as encoding from 'vs/base/node/encoding'; +import * as encoding from 'vs/workbench/services/textfile/common/encoding'; import * as terminalEncoding from 'vs/base/node/terminalEncoding'; -import { Readable } from 'stream'; -import * as iconv from 'iconv-lite'; +import * as streams from 'vs/base/common/stream'; +import * as iconv from 'iconv-lite-umd'; import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { newWriteableBufferStream, VSBuffer, VSBufferReadableStream, streamToBufferReadableStream } from 'vs/base/common/buffer'; export async function detectEncodingByBOM(file: string): Promise { try { @@ -22,7 +23,7 @@ export async function detectEncodingByBOM(file: string): Promise { process.env['VSCODE_CLI_ENCODING'] = 'utf16le'; const enc = await terminalEncoding.resolveTerminalEncoding(); - assert.ok(encoding.encodingExists(enc)); + assert.ok(await encoding.encodingExists(enc)); assert.equal(enc, 'utf16le'); }); @@ -231,32 +232,33 @@ suite('Encoding', () => { }); } - async function readAllAsString(stream: NodeJS.ReadableStream) { - return new Promise((resolve, reject) => { - let all = ''; - stream.on('data', chunk => { - all += chunk; - assert.equal(typeof chunk, 'string'); + function newTestReadableStream(buffers: Buffer[]): VSBufferReadableStream { + const stream = newWriteableBufferStream(); + buffers + .map(VSBuffer.wrap) + .forEach(buffer => { + setTimeout(() => { + stream.write(buffer); + }); }); - stream.on('end', () => { - resolve(all); - }); - stream.on('error', reject); + setTimeout(() => { + stream.end(); }); + return stream; + } + + async function readAllAsString(stream: streams.ReadableStream) { + return streams.consumeStream(stream, strings => strings.join('')); } test('toDecodeStream - some stream', async function () { + const source = newTestReadableStream([ + Buffer.from([65, 66, 67]), + Buffer.from([65, 66, 67]), + Buffer.from([65, 66, 67]), + ]); - let source = new Readable({ - read(size) { - this.push(Buffer.from([65, 66, 67])); - this.push(Buffer.from([65, 66, 67])); - this.push(Buffer.from([65, 66, 67])); - this.push(null); - } - }); - - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -266,17 +268,13 @@ suite('Encoding', () => { }); test('toDecodeStream - some stream, expect too much data', async function () { + const source = newTestReadableStream([ + Buffer.from([65, 66, 67]), + Buffer.from([65, 66, 67]), + Buffer.from([65, 66, 67]), + ]); - let source = new Readable({ - read(size) { - this.push(Buffer.from([65, 66, 67])); - this.push(Buffer.from([65, 66, 67])); - this.push(Buffer.from([65, 66, 67])); - this.push(null); - } - }); - - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -286,14 +284,10 @@ suite('Encoding', () => { }); test('toDecodeStream - some stream, no data', async function () { + const source = newWriteableBufferStream(); + source.end(); - let source = new Readable({ - read(size) { - this.push(null); // empty - } - }); - - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 512, guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 512, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -304,29 +298,105 @@ suite('Encoding', () => { test('toDecodeStream - encoding, utf16be', async function () { + const path = getPathFromAmdModule(require, './fixtures/some_utf16be.css'); + const source = streamToBufferReadableStream(fs.createReadStream(path)); - let path = getPathFromAmdModule(require, './fixtures/some_utf16be.css'); - let source = fs.createReadStream(path); - - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.equal(detected.encoding, 'utf16be'); assert.equal(detected.seemsBinary, false); - let expected = await readAndDecodeFromDisk(path, detected.encoding); - let actual = await readAllAsString(stream); + const expected = await readAndDecodeFromDisk(path, detected.encoding); + const actual = await readAllAsString(stream); assert.equal(actual, expected); }); test('toDecodeStream - empty file', async function () { + const path = getPathFromAmdModule(require, './fixtures/empty.txt'); + const source = streamToBufferReadableStream(fs.createReadStream(path)); + const { detected, stream } = await encoding.toDecodeStream(source, { guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); - let path = getPathFromAmdModule(require, './fixtures/empty.txt'); - let source = fs.createReadStream(path); - let { detected, stream } = await encoding.toDecodeStream(source, { guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); - - let expected = await readAndDecodeFromDisk(path, detected.encoding); - let actual = await readAllAsString(stream); + const expected = await readAndDecodeFromDisk(path, detected.encoding); + const actual = await readAllAsString(stream); assert.equal(actual, expected); }); + + test('toDecodeStream - decodes buffer entirely', async function () { + const emojis = Buffer.from('🖥️💻💾'); + const incompleteEmojis = emojis.slice(0, emojis.length - 1); + + const buffers: Buffer[] = []; + for (let i = 0; i < incompleteEmojis.length; i++) { + buffers.push(incompleteEmojis.slice(i, i + 1)); + } + + const source = newTestReadableStream(buffers); + const { stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + + const expected = incompleteEmojis.toString(encoding.UTF8); + const actual = await readAllAsString(stream); + + assert.equal(actual, expected); + }); + + test('toEncodeReadable - encoding, utf16be', async function () { + const path = getPathFromAmdModule(require, './fixtures/some_utf16be.css'); + const source = await readAndDecodeFromDisk(path, encoding.UTF16be); + + const expected = VSBuffer.wrap( + iconv.encode(source, encoding.toNodeEncoding(encoding.UTF16be)) + ).toString(); + + const actual = streams.consumeReadable( + await encoding.toEncodeReadable(streams.toReadable(source), encoding.UTF16be), + VSBuffer.concat + ).toString(); + + assert.equal(actual, expected); + }); + + test('toEncodeReadable - empty readable to utf8', async function () { + const source: streams.Readable = { + read() { + return null; + } + }; + + const actual = streams.consumeReadable( + await encoding.toEncodeReadable(source, encoding.UTF8), + VSBuffer.concat + ).toString(); + + assert.equal(actual, ''); + }); + + [{ + utfEncoding: encoding.UTF8, + relatedBom: encoding.UTF8_BOM + }, { + utfEncoding: encoding.UTF8_with_bom, + relatedBom: encoding.UTF8_BOM + }, { + utfEncoding: encoding.UTF16be, + relatedBom: encoding.UTF16be_BOM, + }, { + utfEncoding: encoding.UTF16le, + relatedBom: encoding.UTF16le_BOM + }].forEach(({ utfEncoding, relatedBom }) => { + test(`toEncodeReadable - empty readable to ${utfEncoding} with BOM`, async function () { + const source: streams.Readable = { + read() { + return null; + } + }; + + const encodedReadable = encoding.toEncodeReadable(source, utfEncoding, { addBOM: true }); + + const expected = VSBuffer.wrap(Buffer.from(relatedBom)).toString(); + const actual = streams.consumeReadable(await encodedReadable, VSBuffer.concat).toString(); + + assert.equal(actual, expected); + }); + }); }); diff --git a/src/vs/base/test/node/encoding/fixtures/empty.txt b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/empty.txt similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/empty.txt rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/empty.txt diff --git a/src/vs/base/test/node/encoding/fixtures/some.cp1252.txt b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.cp1252.txt similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some.cp1252.txt rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.cp1252.txt diff --git a/src/vs/base/test/node/encoding/fixtures/some.css.qwoff b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.css.qwoff similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some.css.qwoff rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.css.qwoff diff --git a/src/vs/base/test/node/encoding/fixtures/some.json.png b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.json.png similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some.json.png rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.json.png diff --git a/src/vs/base/test/node/encoding/fixtures/some.pdf b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.pdf similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some.pdf rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.pdf diff --git a/src/vs/base/test/node/encoding/fixtures/some.png.txt b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.png.txt similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some.png.txt rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.png.txt diff --git a/src/vs/base/test/node/encoding/fixtures/some.qwoff.txt b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.qwoff.txt similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some.qwoff.txt rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.qwoff.txt diff --git a/src/vs/base/test/node/encoding/fixtures/some.shiftjis.txt b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.shiftjis.txt similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some.shiftjis.txt rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.shiftjis.txt diff --git a/src/vs/base/test/node/encoding/fixtures/some.xml.png b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.xml.png similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some.xml.png rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.xml.png diff --git a/src/vs/base/test/node/encoding/fixtures/some_ansi.css b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_ansi.css similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some_ansi.css rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_ansi.css diff --git a/src/vs/base/test/node/encoding/fixtures/some_file.css b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_file.css similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some_file.css rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_file.css diff --git a/src/vs/base/test/node/encoding/fixtures/some_utf16be.css b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_utf16be.css similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some_utf16be.css rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_utf16be.css diff --git a/src/vs/base/test/node/encoding/fixtures/some_utf16le.css b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_utf16le.css similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some_utf16le.css rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_utf16le.css diff --git a/src/vs/base/test/node/encoding/fixtures/some_utf8.css b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_utf8.css similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/some_utf8.css rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/some_utf8.css diff --git a/src/vs/base/test/node/encoding/fixtures/utf16_be_nobom.txt b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/utf16_be_nobom.txt similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/utf16_be_nobom.txt rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/utf16_be_nobom.txt diff --git a/src/vs/base/test/node/encoding/fixtures/utf16_le_nobom.txt b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/utf16_le_nobom.txt similarity index 100% rename from src/vs/base/test/node/encoding/fixtures/utf16_le_nobom.txt rename to src/vs/workbench/services/textfile/test/node/encoding/fixtures/utf16_le_nobom.txt diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index 7c66d3748cd..993ca56f1ed 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -33,7 +33,11 @@ class ResourceModelCollection extends ReferenceCollection { + createReferencedObject(key: string): Promise { + return this.doCreateReferencedObject(key); + } + + private async doCreateReferencedObject(key: string, skipActivateProvider?: boolean): Promise { // Untrack as being disposed this.modelsToDispose.delete(key); @@ -70,7 +74,7 @@ class ResourceModelCollection extends ReferenceCollection { - if (themeId === this.currentColorTheme.id && !this.currentColorTheme.isLoaded && this.currentColorTheme.hasEqualData(themeData)) { - this.currentColorTheme.clearCaches(); - // the loaded theme is identical to the perisisted theme. Don't need to send an event. - this.currentColorTheme = themeData; - themeData.setCustomizations(this.settings); - return Promise.resolve(themeData); - } themeData.setCustomizations(this.settings); return this.applyTheme(themeData, settingsTarget); }, error => { diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts index 7ecff1fba99..0e61e602a2a 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts @@ -13,6 +13,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IFileService } from 'vs/platform/files/common/files'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; +import { extUri } from 'vs/base/common/resources'; /** * An editor input to be used for untitled text buffers. @@ -122,13 +123,12 @@ export class UntitledTextEditorInput extends AbstractTextResourceEditorInput imp } matches(otherInput: unknown): boolean { - if (super.matches(otherInput) === true) { + if (otherInput === this) { return true; } - // Otherwise compare by properties if (otherInput instanceof UntitledTextEditorInput) { - return otherInput.resource.toString() === this.resource.toString(); + return extUri.isEqual(otherInput.resource, this.resource); } return false; diff --git a/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts b/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts index cb159bc240b..578c545aa3c 100644 --- a/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts +++ b/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts @@ -3,10 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, IUserDataSyncEnablementService, IAuthenticationProvider, getUserDataSyncStore, isAuthenticationProvider, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, IAuthenticationProvider, getUserDataSyncStore, isAuthenticationProvider, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IUserDataSyncWorkbenchService, IUserDataSyncAccount, AccountStatus, CONTEXT_SYNC_ENABLEMENT, CONTEXT_SYNC_STATE, CONTEXT_ACCOUNT_STATE, SHOW_SYNCED_DATA_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync'; +import { IUserDataSyncWorkbenchService, IUserDataSyncAccount, AccountStatus, CONTEXT_SYNC_ENABLEMENT, CONTEXT_SYNC_STATE, CONTEXT_ACCOUNT_STATE, SHOW_SYNCED_DATA_COMMAND_ID, SHOW_SYNC_LOG_COMMAND_ID, getSyncAreaLabel } from 'vs/workbench/services/userDataSync/common/userDataSync'; import { AuthenticationSession, AuthenticationSessionsChangeEvent } from 'vs/editor/common/modes'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; @@ -28,6 +28,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { Action } from 'vs/base/common/actions'; +import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; type UserAccountClassification = { id: { classification: 'EndUserPseudonymizedInformation', purpose: 'BusinessInsight' }; @@ -82,7 +83,6 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat @IUserDataSyncAccountService private readonly userDataSyncAccountService: IUserDataSyncAccountService, @IQuickInputService private readonly quickInputService: IQuickInputService, @IStorageService private readonly storageService: IStorageService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, @ITelemetryService private readonly telemetryService: ITelemetryService, @ILogService private readonly logService: ILogService, @@ -91,6 +91,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat @IExtensionService extensionService: IExtensionService, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @INotificationService private readonly notificationService: INotificationService, + @IProgressService private readonly progressService: IProgressService, @IDialogService private readonly dialogService: IDialogService, @ICommandService private readonly commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, @@ -105,8 +106,8 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat this.syncStatusContext.set(this.userDataSyncService.status); this._register(userDataSyncService.onDidChangeStatus(status => this.syncStatusContext.set(status))); - this.syncEnablementContext.set(userDataSyncEnablementService.isEnabled()); - this._register(userDataSyncEnablementService.onDidChangeEnablement(enabled => this.syncEnablementContext.set(enabled))); + this.syncEnablementContext.set(userDataAutoSyncService.isEnabled()); + this._register(userDataAutoSyncService.onDidChangeEnablement(enabled => this.syncEnablementContext.set(enabled))); extensionService.whenInstalledExtensionsRegistered().then(() => { if (this.authenticationProviders.every(({ id }) => authenticationService.isAuthenticationProviderRegistered(id))) { @@ -220,27 +221,35 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat throw new Error(localize('no account', "No account available")); } - await this.handleFirstTimeSync(); - this.userDataAutoSyncService.enable(); - this.notificationService.info(localize('sync turned on', "Preferences sync is turned on")); + const preferencesSyncTitle = localize('preferences sync', "Preferences Sync"); + const title = `${preferencesSyncTitle} [(${localize('details', "details")})](command:${SHOW_SYNC_LOG_COMMAND_ID})`; + await this.progressService.withProgress({ + location: ProgressLocation.Notification, + title, + delay: 500, + }, async (progress) => { + progress.report({ message: localize('turning on', "Turning on...") }); + const pullFirst = await this.isSyncingWithAnotherMachine(); + const disposable = this.userDataSyncService.onSynchronizeResource(resource => + progress.report({ message: localize('syncing resource', "Syncing {0}...", getSyncAreaLabel(resource)) })); + try { + await this.userDataAutoSyncService.turnOn(pullFirst); + } finally { + disposable.dispose(); + } + }); + + this.notificationService.info(localize('sync turned on', "{0} is turned on", title)); } - async turnoff(everywhere: boolean): Promise { - this.userDataAutoSyncService.disable(); - - if (everywhere) { - this.telemetryService.publicLog2('sync/turnOffEveryWhere'); - await this.userDataSyncService.reset(); - } else { - await this.userDataSyncService.resetLocal(); - } + turnoff(everywhere: boolean): Promise { + return this.userDataAutoSyncService.turnOff(everywhere); } - private async handleFirstTimeSync(): Promise { - const isFirstTimeSyncingWithAnotherMachine = await this.userDataSyncService.isFirstTimeSyncingWithAnotherMachine(); - if (!isFirstTimeSyncingWithAnotherMachine) { - await this.userDataSyncService.sync(); - return; + private async isSyncingWithAnotherMachine(): Promise { + const isSyncingWithAnotherMachine = await this.userDataSyncService.isFirstTimeSyncingWithAnotherMachine(); + if (!isSyncingWithAnotherMachine) { + return false; } const result = await this.dialogService.show( @@ -264,16 +273,15 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat throw canceled(); case 1: this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'merge' }); - await this.userDataSyncService.sync(); - break; + return false; case 2: this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'replace-local' }); - await this.userDataSyncService.pull(); - break; + return true; case 3: this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'cancelled' }); throw canceled(); } + return false; } private isSupportedAuthenticationProviderId(authenticationProviderId: string): boolean { @@ -380,7 +388,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat private async switch(sessionId: string, accountName: string, accountId: string): Promise { const currentAccount = this.current; - if (this.userDataSyncEnablementService.isEnabled() && (currentAccount && currentAccount.accountName !== accountName)) { + if (this.userDataAutoSyncService.isEnabled() && (currentAccount && currentAccount.accountName !== accountName)) { // accounts are switched while sync is enabled. } this.currentSessionId = sessionId; diff --git a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService.ts b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService.ts index 8b4a79d54ff..d9320052d1d 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService.ts @@ -26,8 +26,8 @@ class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMac return this.channel.call('getMachines'); } - addCurrentMachine(name: string): Promise { - return this.channel.call('addCurrentMachine', [name]); + addCurrentMachine(): Promise { + return this.channel.call('addCurrentMachine'); } removeCurrentMachine(): Promise { @@ -38,8 +38,8 @@ class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMac return this.channel.call('renameMachine', [machineId, name]); } - disableMachine(machineId: string): Promise { - return this.channel.call('disableMachine', [machineId]); + setEnablement(machineId: string, enabled: boolean): Promise { + return this.channel.call('setEnablement', [machineId, enabled]); } } diff --git a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts index 805fe71574d..7f1084593fe 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, SyncResource, IUserDataSyncService, UserDataSyncError, SyncResourceConflicts, ISyncResourceHandle } from 'vs/platform/userDataSync/common/userDataSync'; +import { SyncStatus, SyncResource, IUserDataSyncService, UserDataSyncError, SyncResourceConflicts, ISyncResourceHandle, ISyncTask } from 'vs/platform/userDataSync/common/userDataSync'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { Disposable } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; @@ -38,6 +38,8 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ private _onSyncErrors: Emitter<[SyncResource, UserDataSyncError][]> = this._register(new Emitter<[SyncResource, UserDataSyncError][]>()); readonly onSyncErrors: Event<[SyncResource, UserDataSyncError][]> = this._onSyncErrors.event; + get onSynchronizeResource(): Event { return this.channel.listen('onSynchronizeResource'); } + constructor( @ISharedProcessService sharedProcessService: ISharedProcessService ) { @@ -73,6 +75,10 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return this.channel.call('sync'); } + createSyncTask(): Promise { + throw new Error('not supported'); + } + stop(): Promise { return this.channel.call('stop'); } @@ -89,6 +95,10 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return this.channel.call('resetLocal'); } + hasPreviouslySynced(): Promise { + return this.channel.call('hasPreviouslySynced'); + } + isFirstTimeSyncingWithAnotherMachine(): Promise { return this.channel.call('isFirstTimeSyncingWithAnotherMachine'); } diff --git a/src/vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant.ts b/src/vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant.ts index 4b0928035ee..7d60ea29d7f 100644 --- a/src/vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant.ts +++ b/src/vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant.ts @@ -33,7 +33,7 @@ export class WorkingCopyFileOperationParticipant extends Disposable { return toDisposable(() => remove()); } - async participate(target: URI, source: URI | undefined, operation: FileOperation): Promise { + async participate(files: { source?: URI, target: URI }[], operation: FileOperation): Promise { const timeout = this.configurationService.getValue('files.participants.timeout'); if (timeout <= 0) { return; // disabled @@ -53,7 +53,7 @@ export class WorkingCopyFileOperationParticipant extends Disposable { } try { - const promise = participant.participate(target, source, operation, progress, timeout, cts.token); + const promise = participant.participate(files, operation, progress, timeout, cts.token); await raceTimeout(promise, timeout, () => cts.dispose(true /* cancel */)); } catch (err) { this.logService.warn(err); diff --git a/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts b/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts index 6f5586492b7..6c5dc194083 100644 --- a/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts +++ b/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts @@ -15,9 +15,23 @@ import { IWorkingCopyService, IWorkingCopy } from 'vs/workbench/services/working import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress'; import { WorkingCopyFileOperationParticipant } from 'vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant'; +import { VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; export const IWorkingCopyFileService = createDecorator('workingCopyFileService'); +interface SourceTargetPair { + + /** + * The source resource that is defined for move operations. + */ + readonly source?: URI; + + /** + * The target resource the event is about. + */ + readonly target: URI +} + export interface WorkingCopyFileEvent extends IWaitUntil { /** @@ -32,25 +46,19 @@ export interface WorkingCopyFileEvent extends IWaitUntil { readonly operation: FileOperation; /** - * The resource the event is about. + * The array of source/target pair of files involved in given operation. */ - readonly target: URI; - - /** - * A property that is defined for move operations. - */ - readonly source?: URI; + readonly files: SourceTargetPair[] } export interface IWorkingCopyFileOperationParticipant { /** - * Participate in a file operation of a working copy. Allows to - * change the working copy before it is being saved to disk. + * Participate in a file operation of working copies. Allows to + * change the working copies before they are being saved to disk. */ participate( - target: URI, - source: URI | undefined, + files: SourceTargetPair[], operation: FileOperation, progress: IProgress, timeout: number, @@ -111,43 +119,49 @@ export interface IWorkingCopyFileService { */ addFileOperationParticipant(participant: IWorkingCopyFileOperationParticipant): IDisposable; - /** - * Execute all known file operation participants. - */ - runFileOperationParticipants(target: URI, source: URI | undefined, operation: FileOperation): Promise + //#endregion //#region File operations /** - * Will move working copies matching the provided resource and children - * to the target resource using the associated file service for that resource. + * Will create a resource with the provided optional contents, optionally overwriting any target. * * Working copy owners can listen to the `onWillRunWorkingCopyFileOperation` and * `onDidRunWorkingCopyFileOperation` events to participate. */ - move(source: URI, target: URI, overwrite?: boolean): Promise; + create(resource: URI, contents?: VSBuffer | VSBufferReadable | VSBufferReadableStream, options?: { overwrite?: boolean }): Promise; /** - * Will copy working copies matching the provided resource and children - * to the target using the associated file service for that resource. + * Will move working copies matching the provided resources and corresponding children + * to the target resources using the associated file service for those resources. * * Working copy owners can listen to the `onWillRunWorkingCopyFileOperation` and * `onDidRunWorkingCopyFileOperation` events to participate. */ - copy(source: URI, target: URI, overwrite?: boolean): Promise; + move(files: Required[], options?: { overwrite?: boolean }): Promise; /** - * Will delete working copies matching the provided resource and children - * using the associated file service for that resource. + * Will copy working copies matching the provided resources and corresponding children + * to the target resources using the associated file service for those resources. * * Working copy owners can listen to the `onWillRunWorkingCopyFileOperation` and * `onDidRunWorkingCopyFileOperation` events to participate. */ - delete(resource: URI, options?: { useTrash?: boolean, recursive?: boolean }): Promise; + copy(files: Required[], options?: { overwrite?: boolean }): Promise; + + /** + * Will delete working copies matching the provided resources and children + * using the associated file service for those resources. + * + * Working copy owners can listen to the `onWillRunWorkingCopyFileOperation` and + * `onDidRunWorkingCopyFileOperation` events to participate. + */ + delete(resources: URI[], options?: { useTrash?: boolean, recursive?: boolean }): Promise; //#endregion + //#region Path related /** @@ -209,55 +223,28 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi }); } - async move(source: URI, target: URI, overwrite?: boolean): Promise { - return this.moveOrCopy(source, target, true, overwrite); - } - async copy(source: URI, target: URI, overwrite?: boolean): Promise { - return this.moveOrCopy(source, target, false, overwrite); - } + //#region File operations - private async moveOrCopy(source: URI, target: URI, move: boolean, overwrite?: boolean): Promise { + async create(resource: URI, contents?: VSBuffer | VSBufferReadable | VSBufferReadableStream, options?: { overwrite?: boolean }): Promise { - // validate move/copy operation before starting - const validateMoveOrCopy = move ? this.fileService.canMove(source, target, overwrite) : this.fileService.canCopy(source, target, overwrite); - if (validateMoveOrCopy instanceof Error) { - throw validateMoveOrCopy; + // validate create operation before starting + const validateCreate = await this.fileService.canCreateFile(resource, options); + if (validateCreate instanceof Error) { + throw validateCreate; } // file operation participant - await this.runFileOperationParticipants(target, source, move ? FileOperation.MOVE : FileOperation.COPY); + await this.runFileOperationParticipants([{ target: resource }], FileOperation.CREATE); - // Before doing the heave operations, check first if source and target - // are either identical or are considered to be identical for the file - // system. In that case we want the model to stay as is and only do the - // raw file operation. - if (this.uriIdentityService.extUri.isEqual(source, target)) { - if (move) { - return this.fileService.move(source, target, overwrite); - } else { - return this.fileService.copy(source, target, overwrite); - } - } - - // before event - const event = { correlationId: this.correlationIds++, operation: move ? FileOperation.MOVE : FileOperation.COPY, target, source }; + // before events + const event = { correlationId: this.correlationIds++, operation: FileOperation.CREATE, files: [{ target: resource }] }; await this._onWillRunWorkingCopyFileOperation.fireAsync(event, CancellationToken.None); - // handle dirty working copies depending on the operation: - // - move: revert both source and target (if any) - // - copy: revert target (if any) - const dirtyWorkingCopies = (move ? [...this.getDirty(source), ...this.getDirty(target)] : this.getDirty(target)); - await Promise.all(dirtyWorkingCopies.map(dirtyWorkingCopy => dirtyWorkingCopy.revert({ soft: true }))); - - // now we can rename the source to target via file operation + // now actually create on disk let stat: IFileStatWithMetadata; try { - if (move) { - stat = await this.fileService.move(source, target, overwrite); - } else { - stat = await this.fileService.copy(source, target, overwrite); - } + stat = await this.fileService.createFile(resource, contents, { overwrite: options?.overwrite }); } catch (error) { // error event @@ -272,30 +259,97 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi return stat; } - async delete(resource: URI, options?: { useTrash?: boolean, recursive?: boolean }): Promise { + async move(files: Required[], options?: { overwrite?: boolean }): Promise { + return this.doMoveOrCopy(files, true, options); + } - // validate delete operation before starting - const validateDelete = this.fileService.canDelete(resource, options); - if (validateDelete instanceof Error) { - throw validateDelete; + async copy(files: Required[], options?: { overwrite?: boolean }): Promise { + return this.doMoveOrCopy(files, false, options); + } + + private async doMoveOrCopy(files: Required[], move: boolean, options?: { overwrite?: boolean }): Promise { + const overwrite = options?.overwrite; + const stats: IFileStatWithMetadata[] = []; + + // validate move/copy operation before starting + for (const { source, target } of files) { + const validateMoveOrCopy = await (move ? this.fileService.canMove(source, target, overwrite) : this.fileService.canCopy(source, target, overwrite)); + if (validateMoveOrCopy instanceof Error) { + throw validateMoveOrCopy; + } } // file operation participant - await this.runFileOperationParticipants(resource, undefined, FileOperation.DELETE); + await this.runFileOperationParticipants(files, move ? FileOperation.MOVE : FileOperation.COPY); - // before events - const event = { correlationId: this.correlationIds++, operation: FileOperation.DELETE, target: resource }; + // before event + const event = { correlationId: this.correlationIds++, operation: move ? FileOperation.MOVE : FileOperation.COPY, files }; await this._onWillRunWorkingCopyFileOperation.fireAsync(event, CancellationToken.None); - // Check for any existing dirty working copies for the resource + try { + for (const { source, target } of files) { + + // if source and target are not equal, handle dirty working copies + // depending on the operation: + // - move: revert both source and target (if any) + // - copy: revert target (if any) + if (!this.uriIdentityService.extUri.isEqual(source, target)) { + const dirtyWorkingCopies = (move ? [...this.getDirty(source), ...this.getDirty(target)] : this.getDirty(target)); + await Promise.all(dirtyWorkingCopies.map(dirtyWorkingCopy => dirtyWorkingCopy.revert({ soft: true }))); + } + + // now we can rename the source to target via file operation + if (move) { + stats.push(await this.fileService.move(source, target, overwrite)); + } else { + stats.push(await this.fileService.copy(source, target, overwrite)); + } + } + } catch (error) { + + // error event + await this._onDidFailWorkingCopyFileOperation.fireAsync(event, CancellationToken.None); + + throw error; + } + + // after event + await this._onDidRunWorkingCopyFileOperation.fireAsync(event, CancellationToken.None); + + return stats; + } + + async delete(resources: URI[], options?: { useTrash?: boolean, recursive?: boolean }): Promise { + + // validate delete operation before starting + for (const resource of resources) { + const validateDelete = await this.fileService.canDelete(resource, options); + if (validateDelete instanceof Error) { + throw validateDelete; + } + } + + // file operation participant + const files = resources.map(target => ({ target })); + await this.runFileOperationParticipants(files, FileOperation.DELETE); + + // before events + const event = { correlationId: this.correlationIds++, operation: FileOperation.DELETE, files }; + await this._onWillRunWorkingCopyFileOperation.fireAsync(event, CancellationToken.None); + + // check for any existing dirty working copies for the resource // and do a soft revert before deleting to be able to close // any opened editor with these working copies - const dirtyWorkingCopies = this.getDirty(resource); - await Promise.all(dirtyWorkingCopies.map(dirtyWorkingCopy => dirtyWorkingCopy.revert({ soft: true }))); + for (const resource of resources) { + const dirtyWorkingCopies = this.getDirty(resource); + await Promise.all(dirtyWorkingCopies.map(dirtyWorkingCopy => dirtyWorkingCopy.revert({ soft: true }))); + } - // Now actually delete from disk + // now actually delete from disk try { - await this.fileService.del(resource, options); + for (const resource of resources) { + await this.fileService.del(resource, options); + } } catch (error) { // error event @@ -308,6 +362,8 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi await this._onDidRunWorkingCopyFileOperation.fireAsync(event, CancellationToken.None); } + //#endregion + //#region File operation participants @@ -317,8 +373,8 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi return this.fileOperationParticipants.addFileOperationParticipant(participant); } - runFileOperationParticipants(target: URI, source: URI | undefined, operation: FileOperation): Promise { - return this.fileOperationParticipants.participate(target, source, operation); + private runFileOperationParticipants(files: SourceTargetPair[], operation: FileOperation): Promise { + return this.fileOperationParticipants.participate(files, operation); } //#endregion diff --git a/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts b/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts index db3f0a8e4fb..a9178e8c36b 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts @@ -12,11 +12,11 @@ import { workbenchInstantiationService, TestServiceAccessor, TestTextFileEditorM import { URI } from 'vs/base/common/uri'; import { FileOperation } from 'vs/platform/files/common/files'; import { TestWorkingCopy } from 'vs/workbench/services/workingCopy/test/common/workingCopyService.test'; +import { VSBuffer } from 'vs/base/common/buffer'; suite('WorkingCopyFileService', () => { let instantiationService: IInstantiationService; - let model: TextFileEditorModel; let accessor: TestServiceAccessor; setup(() => { @@ -25,144 +25,120 @@ suite('WorkingCopyFileService', () => { }); teardown(() => { - model?.dispose(); (accessor.textFileService.files).dispose(); }); + test('create - dirty file', async function () { + await testCreate(toResource.call(this, '/path/file.txt'), VSBuffer.fromString('Hello World')); + }); + test('delete - dirty file', async function () { - model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + await testDelete([toResource.call(this, '/path/file.txt')]); + }); - await model.load(); - model!.textEditorModel!.setValue('foo'); - assert.ok(accessor.workingCopyService.isDirty(model.resource)); - - let eventCounter = 0; - let correlationId: number | undefined = undefined; - - const participant = accessor.workingCopyFileService.addFileOperationParticipant({ - participate: async (target, source, operation) => { - assert.equal(target.toString(), model.resource.toString()); - assert.equal(operation, FileOperation.DELETE); - eventCounter++; - } - }); - - const listener1 = accessor.workingCopyFileService.onWillRunWorkingCopyFileOperation(e => { - assert.equal(e.target.toString(), model.resource.toString()); - assert.equal(e.operation, FileOperation.DELETE); - correlationId = e.correlationId; - eventCounter++; - }); - - const listener2 = accessor.workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { - assert.equal(e.target.toString(), model.resource.toString()); - assert.equal(e.operation, FileOperation.DELETE); - assert.equal(e.correlationId, correlationId); - eventCounter++; - }); - - await accessor.workingCopyFileService.delete(model.resource); - assert.ok(!accessor.workingCopyService.isDirty(model.resource)); - - assert.equal(eventCounter, 3); - - participant.dispose(); - listener1.dispose(); - listener2.dispose(); + test('delete multiple - dirty files', async function () { + await testDelete([ + toResource.call(this, '/path/file1.txt'), + toResource.call(this, '/path/file2.txt'), + toResource.call(this, '/path/file3.txt'), + toResource.call(this, '/path/file4.txt')]); }); test('move - dirty file', async function () { - await testMoveOrCopy(toResource.call(this, '/path/file.txt'), toResource.call(this, '/path/file_target.txt'), true); + await testMoveOrCopy([{ source: toResource.call(this, '/path/file.txt'), target: toResource.call(this, '/path/file_target.txt') }], true); + }); + + test('move - source identical to target', async function () { + let sourceModel: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); + (accessor.textFileService.files).add(sourceModel.resource, sourceModel); + + const eventCounter = await testEventsMoveOrCopy([{ source: sourceModel.resource, target: sourceModel.resource }], true); + + sourceModel.dispose(); + assert.equal(eventCounter, 3); + }); + + test('move - one source == target and another source != target', async function () { + let sourceModel1: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file1.txt'), 'utf8', undefined); + let sourceModel2: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file2.txt'), 'utf8', undefined); + let targetModel2: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file_target2.txt'), 'utf8', undefined); + (accessor.textFileService.files).add(sourceModel1.resource, sourceModel1); + (accessor.textFileService.files).add(sourceModel2.resource, sourceModel2); + (accessor.textFileService.files).add(targetModel2.resource, targetModel2); + + const eventCounter = await testEventsMoveOrCopy([ + { source: sourceModel1.resource, target: sourceModel1.resource }, + { source: sourceModel2.resource, target: targetModel2.resource } + ], true); + + sourceModel1.dispose(); + sourceModel2.dispose(); + targetModel2.dispose(); + assert.equal(eventCounter, 3); + }); + + test('move multiple - dirty file', async function () { + await testMoveOrCopy([ + { source: toResource.call(this, '/path/file1.txt'), target: toResource.call(this, '/path/file1_target.txt') }, + { source: toResource.call(this, '/path/file2.txt'), target: toResource.call(this, '/path/file2_target.txt') }], + true); }); test('move - dirty file (target exists and is dirty)', async function () { - await testMoveOrCopy(toResource.call(this, '/path/file.txt'), toResource.call(this, '/path/file_target.txt'), true, true); + await testMoveOrCopy([{ source: toResource.call(this, '/path/file.txt'), target: toResource.call(this, '/path/file_target.txt') }], true, true); }); test('copy - dirty file', async function () { - await testMoveOrCopy(toResource.call(this, '/path/file.txt'), toResource.call(this, '/path/file_target.txt'), false); + await testMoveOrCopy([{ source: toResource.call(this, '/path/file.txt'), target: toResource.call(this, '/path/file_target.txt') }], false); + }); + + test('copy - source identical to target', async function () { + let sourceModel: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); + (accessor.textFileService.files).add(sourceModel.resource, sourceModel); + + const eventCounter = await testEventsMoveOrCopy([{ source: sourceModel.resource, target: sourceModel.resource }]); + + sourceModel.dispose(); + assert.equal(eventCounter, 3); + }); + + test('copy - one source == target and another source != target', async function () { + let sourceModel1: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file1.txt'), 'utf8', undefined); + let sourceModel2: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file2.txt'), 'utf8', undefined); + let targetModel2: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file_target2.txt'), 'utf8', undefined); + (accessor.textFileService.files).add(sourceModel1.resource, sourceModel1); + (accessor.textFileService.files).add(sourceModel2.resource, sourceModel2); + (accessor.textFileService.files).add(targetModel2.resource, targetModel2); + + const eventCounter = await testEventsMoveOrCopy([ + { source: sourceModel1.resource, target: sourceModel1.resource }, + { source: sourceModel2.resource, target: targetModel2.resource } + ]); + + sourceModel1.dispose(); + sourceModel2.dispose(); + targetModel2.dispose(); + assert.equal(eventCounter, 3); + }); + + test('copy multiple - dirty file', async function () { + await testMoveOrCopy([ + { source: toResource.call(this, '/path/file1.txt'), target: toResource.call(this, '/path/file_target1.txt') }, + { source: toResource.call(this, '/path/file2.txt'), target: toResource.call(this, '/path/file_target2.txt') }, + { source: toResource.call(this, '/path/file3.txt'), target: toResource.call(this, '/path/file_target3.txt') }], + false); }); test('copy - dirty file (target exists and is dirty)', async function () { - await testMoveOrCopy(toResource.call(this, '/path/file.txt'), toResource.call(this, '/path/file_target.txt'), false, true); + await testMoveOrCopy([{ source: toResource.call(this, '/path/file.txt'), target: toResource.call(this, '/path/file_target.txt') }], false, true); }); - async function testMoveOrCopy(source: URI, target: URI, move: boolean, targetDirty?: boolean): Promise { - let sourceModel: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, source, 'utf8', undefined); - let targetModel: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, target, 'utf8', undefined); - (accessor.textFileService.files).add(sourceModel.resource, sourceModel); - (accessor.textFileService.files).add(targetModel.resource, targetModel); - - await sourceModel.load(); - sourceModel.textEditorModel!.setValue('foo'); - assert.ok(accessor.textFileService.isDirty(sourceModel.resource)); - - if (targetDirty) { - await targetModel.load(); - targetModel.textEditorModel!.setValue('bar'); - assert.ok(accessor.textFileService.isDirty(targetModel.resource)); - } - - let eventCounter = 0; - let correlationId: number | undefined = undefined; - - const participant = accessor.workingCopyFileService.addFileOperationParticipant({ - participate: async (target, source, operation) => { - assert.equal(target.toString(), targetModel.resource.toString()); - assert.equal(source?.toString(), sourceModel.resource.toString()); - assert.equal(operation, move ? FileOperation.MOVE : FileOperation.COPY); - eventCounter++; - } - }); - - const listener1 = accessor.workingCopyFileService.onWillRunWorkingCopyFileOperation(e => { - assert.equal(e.target.toString(), targetModel.resource.toString()); - assert.equal(e.source?.toString(), sourceModel.resource.toString()); - assert.equal(e.operation, move ? FileOperation.MOVE : FileOperation.COPY); - eventCounter++; - correlationId = e.correlationId; - }); - - const listener2 = accessor.workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { - assert.equal(e.target.toString(), targetModel.resource.toString()); - assert.equal(e.source?.toString(), sourceModel.resource.toString()); - assert.equal(e.operation, move ? FileOperation.MOVE : FileOperation.COPY); - eventCounter++; - assert.equal(e.correlationId, correlationId); - }); - - if (move) { - await accessor.workingCopyFileService.move(sourceModel.resource, targetModel.resource, true); - } else { - await accessor.workingCopyFileService.copy(sourceModel.resource, targetModel.resource, true); - } - - assert.equal(targetModel.textEditorModel!.getValue(), 'foo'); - - if (move) { - assert.ok(!accessor.textFileService.isDirty(sourceModel.resource)); - } else { - assert.ok(accessor.textFileService.isDirty(sourceModel.resource)); - } - assert.ok(accessor.textFileService.isDirty(targetModel.resource)); - - assert.equal(eventCounter, 3); - - sourceModel.dispose(); - targetModel.dispose(); - - participant.dispose(); - listener1.dispose(); - listener2.dispose(); - } - test('getDirty', async function () { const model1 = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file-1.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model1.resource, model1); const model2 = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file-2.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model2.resource, model2); let dirty = accessor.workingCopyFileService.getDirty(model1.resource); assert.equal(dirty.length, 0); @@ -190,7 +166,7 @@ suite('WorkingCopyFileService', () => { test('registerWorkingCopyProvider', async function () { const model1 = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file-1.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model1.resource, model1); await model1.load(); model1.textEditorModel!.setValue('foo'); @@ -212,4 +188,241 @@ suite('WorkingCopyFileService', () => { model1.dispose(); }); + + async function testEventsMoveOrCopy(files: { source: URI, target: URI }[], move?: boolean): Promise { + let eventCounter = 0; + + const participant = accessor.workingCopyFileService.addFileOperationParticipant({ + participate: async files => { + eventCounter++; + } + }); + + const listener1 = accessor.workingCopyFileService.onWillRunWorkingCopyFileOperation(e => { + eventCounter++; + }); + + const listener2 = accessor.workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { + eventCounter++; + }); + + if (move) { + await accessor.workingCopyFileService.move(files, { overwrite: true }); + } else { + await accessor.workingCopyFileService.copy(files, { overwrite: true }); + } + + participant.dispose(); + listener1.dispose(); + listener2.dispose(); + return eventCounter; + } + + async function testMoveOrCopy(files: { source: URI, target: URI }[], move: boolean, targetDirty?: boolean): Promise { + + let eventCounter = 0; + const models = await Promise.all(files.map(async ({ source, target }, i) => { + let sourceModel: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, source, 'utf8', undefined); + let targetModel: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, target, 'utf8', undefined); + (accessor.textFileService.files).add(sourceModel.resource, sourceModel); + (accessor.textFileService.files).add(targetModel.resource, targetModel); + + await sourceModel.load(); + sourceModel.textEditorModel!.setValue('foo' + i); + assert.ok(accessor.textFileService.isDirty(sourceModel.resource)); + if (targetDirty) { + await targetModel.load(); + targetModel.textEditorModel!.setValue('bar' + i); + assert.ok(accessor.textFileService.isDirty(targetModel.resource)); + } + + return { sourceModel, targetModel }; + })); + + const participant = accessor.workingCopyFileService.addFileOperationParticipant({ + participate: async (files, operation) => { + for (let i = 0; i < files.length; i++) { + const { target, source } = files[i]; + const { targetModel, sourceModel } = models[i]; + + assert.equal(target.toString(), targetModel.resource.toString()); + assert.equal(source?.toString(), sourceModel.resource.toString()); + } + + eventCounter++; + + assert.equal(operation, move ? FileOperation.MOVE : FileOperation.COPY); + } + }); + + let correlationId: number; + + const listener1 = accessor.workingCopyFileService.onWillRunWorkingCopyFileOperation(e => { + for (let i = 0; i < e.files.length; i++) { + const { target, source } = files[i]; + const { targetModel, sourceModel } = models[i]; + + assert.equal(target.toString(), targetModel.resource.toString()); + assert.equal(source?.toString(), sourceModel.resource.toString()); + } + + eventCounter++; + + correlationId = e.correlationId; + assert.equal(e.operation, move ? FileOperation.MOVE : FileOperation.COPY); + }); + + const listener2 = accessor.workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { + for (let i = 0; i < e.files.length; i++) { + const { target, source } = files[i]; + const { targetModel, sourceModel } = models[i]; + assert.equal(target.toString(), targetModel.resource.toString()); + assert.equal(source?.toString(), sourceModel.resource.toString()); + } + + eventCounter++; + + assert.equal(e.operation, move ? FileOperation.MOVE : FileOperation.COPY); + assert.equal(e.correlationId, correlationId); + }); + + if (move) { + await accessor.workingCopyFileService.move(models.map(model => ({ source: model.sourceModel.resource, target: model.targetModel.resource })), { overwrite: true }); + } else { + await accessor.workingCopyFileService.copy(models.map(model => ({ source: model.sourceModel.resource, target: model.targetModel.resource })), { overwrite: true }); + } + + for (let i = 0; i < models.length; i++) { + const { sourceModel, targetModel } = models[i]; + + assert.equal(targetModel.textEditorModel!.getValue(), 'foo' + i); + + if (move) { + assert.ok(!accessor.textFileService.isDirty(sourceModel.resource)); + } else { + assert.ok(accessor.textFileService.isDirty(sourceModel.resource)); + } + assert.ok(accessor.textFileService.isDirty(targetModel.resource)); + + sourceModel.dispose(); + targetModel.dispose(); + } + assert.equal(eventCounter, 3); + + participant.dispose(); + listener1.dispose(); + listener2.dispose(); + } + + async function testDelete(resources: URI[]) { + + const models = await Promise.all(resources.map(async resource => { + const model = instantiationService.createInstance(TextFileEditorModel, resource, 'utf8', undefined); + (accessor.textFileService.files).add(model.resource, model); + + await model.load(); + model!.textEditorModel!.setValue('foo'); + assert.ok(accessor.workingCopyService.isDirty(model.resource)); + return model; + })); + + let eventCounter = 0; + let correlationId: number | undefined = undefined; + + const participant = accessor.workingCopyFileService.addFileOperationParticipant({ + participate: async (files, operation) => { + for (let i = 0; i < models.length; i++) { + const model = models[i]; + const file = files[i]; + assert.equal(file.target.toString(), model.resource.toString()); + } + assert.equal(operation, FileOperation.DELETE); + eventCounter++; + } + }); + + const listener1 = accessor.workingCopyFileService.onWillRunWorkingCopyFileOperation(e => { + for (let i = 0; i < models.length; i++) { + const model = models[i]; + const file = e.files[i]; + assert.equal(file.target.toString(), model.resource.toString()); + } + assert.equal(e.operation, FileOperation.DELETE); + correlationId = e.correlationId; + eventCounter++; + }); + + const listener2 = accessor.workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { + for (let i = 0; i < models.length; i++) { + const model = models[i]; + const file = e.files[i]; + assert.equal(file.target.toString(), model.resource.toString()); + } + assert.equal(e.operation, FileOperation.DELETE); + assert.equal(e.correlationId, correlationId); + eventCounter++; + }); + + await accessor.workingCopyFileService.delete(models.map(m => m.resource)); + for (const model of models) { + assert.ok(!accessor.workingCopyService.isDirty(model.resource)); + model.dispose(); + } + + assert.equal(eventCounter, 3); + + participant.dispose(); + listener1.dispose(); + listener2.dispose(); + } + + async function testCreate(resource: URI, contents: VSBuffer) { + const model = instantiationService.createInstance(TextFileEditorModel, resource, 'utf8', undefined); + (accessor.textFileService.files).add(model.resource, model); + + await model.load(); + model!.textEditorModel!.setValue('foo'); + assert.ok(accessor.workingCopyService.isDirty(model.resource)); + + let eventCounter = 0; + let correlationId: number | undefined = undefined; + + const participant = accessor.workingCopyFileService.addFileOperationParticipant({ + participate: async (files, operation) => { + assert.equal(files.length, 1); + const file = files[0]; + assert.equal(file.target.toString(), model.resource.toString()); + assert.equal(operation, FileOperation.CREATE); + eventCounter++; + } + }); + + const listener1 = accessor.workingCopyFileService.onWillRunWorkingCopyFileOperation(e => { + assert.equal(e.files.length, 1); + const file = e.files[0]; + assert.equal(file.target.toString(), model.resource.toString()); + assert.equal(e.operation, FileOperation.CREATE); + correlationId = e.correlationId; + eventCounter++; + }); + + const listener2 = accessor.workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { + assert.equal(e.files.length, 1); + const file = e.files[0]; + assert.equal(file.target.toString(), model.resource.toString()); + assert.equal(e.operation, FileOperation.CREATE); + assert.equal(e.correlationId, correlationId); + eventCounter++; + }); + + await accessor.workingCopyFileService.create(resource, contents); + assert.ok(!accessor.workingCopyService.isDirty(model.resource)); + model.dispose(); + + assert.equal(eventCounter, 3); + + participant.dispose(); + listener1.dispose(); + listener2.dispose(); + } }); diff --git a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts index e3b11e4032d..067eae83070 100644 --- a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts @@ -200,7 +200,11 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi const remoteAuthority = this.environmentService.configuration.remoteAuthority; const untitledWorkspace = await this.workspacesService.createUntitledWorkspace(folders, remoteAuthority); if (path) { - await this.saveWorkspaceAs(untitledWorkspace, path); + try { + await this.saveWorkspaceAs(untitledWorkspace, path); + } finally { + await this.workspacesService.deleteUntitledWorkspace(untitledWorkspace); // https://github.com/microsoft/vscode/issues/100276 + } } else { path = untitledWorkspace.configPath; } diff --git a/src/vs/workbench/test/browser/api/extHostDecorations.test.ts b/src/vs/workbench/test/browser/api/extHostDecorations.test.ts new file mode 100644 index 00000000000..073006e636d --- /dev/null +++ b/src/vs/workbench/test/browser/api/extHostDecorations.test.ts @@ -0,0 +1,85 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { timeout } from 'vs/base/common/async'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { Event } from 'vs/base/common/event'; +import { URI } from 'vs/base/common/uri'; +import { mock } from 'vs/base/test/common/mock'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { MainThreadDecorationsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostDecorations } from 'vs/workbench/api/common/extHostDecorations'; +import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; +import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; + +suite('ExtHostDecorations', function () { + + let mainThreadShape: MainThreadDecorationsShape; + let extHostDecorations: ExtHostDecorations; + let providers = new Set(); + + setup(function () { + + providers.clear(); + + mainThreadShape = new class extends mock() { + $registerDecorationProvider(handle: number) { + providers.add(handle); + } + }; + + extHostDecorations = new ExtHostDecorations( + new class extends mock() { + getProxy(): any { + return mainThreadShape; + } + }, + new NullLogService() + ); + }); + + test('SCM Decorations missing #100524', async function () { + + let calledA = false; + let calledB = false; + + // never returns + extHostDecorations.registerDecorationProvider({ + onDidChangeDecorations: Event.None, + provideDecoration() { + calledA = true; + return new Promise(() => { }); + } + }, nullExtensionDescription.identifier); + + // always returns + extHostDecorations.registerDecorationProvider({ + onDidChangeDecorations: Event.None, + provideDecoration() { + calledB = true; + return new Promise(resolve => resolve({ letter: 'H', title: 'Hello' })); + } + }, nullExtensionDescription.identifier); + + + const requests = [...providers.values()].map((handle, idx) => { + return extHostDecorations.$provideDecorations(handle, [{ id: idx, uri: URI.parse('test:///file') }], CancellationToken.None); + }); + + assert.equal(calledA, true); + assert.equal(calledB, true); + + assert.equal(requests.length, 2); + const [first, second] = requests; + + const firstResult = await Promise.race([first, timeout(30).then(() => false)]); + assert.equal(typeof firstResult, 'boolean'); // never finishes... + + const secondResult = await Promise.race([second, timeout(30).then(() => false)]); + assert.equal(typeof secondResult, 'object'); + }); + +}); diff --git a/src/vs/workbench/test/browser/api/extHostDocumentData.test.perf-data.ts b/src/vs/workbench/test/browser/api/extHostDocumentData.test.perf-data.ts new file mode 100644 index 00000000000..833bca4b2e5 --- /dev/null +++ b/src/vs/workbench/test/browser/api/extHostDocumentData.test.perf-data.ts @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const _$_$_expensive = '{"seq":0,"type":"response","command":"completionInfo","request_seq":956,"success":true,"body":{"isGlobalCompletion":true,"isMemberCompletion":false,"isNewIdentifierLocation":false,"entries":[{"name":"__dirname","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"__filename","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"_getInstrumentationKey","kind":"method","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"_util","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"$","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"abort","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"AbortController","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbortSignal","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbstractCaseAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractCodeEditorService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/abstractCodeEditorService"},{"name":"AbstractCommandsQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/commandsQuickAccess"},{"name":"AbstractConfigureRecommendedExtensionsAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"AbstractContextKeyService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"AbstractDebugAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"AbstractDebugAdapter","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/abstractDebugAdapter"},{"name":"AbstractDeleteAllToBoundaryAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractEditorCommandsQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/commandsQuickAccess"},{"name":"AbstractEditorNavigationQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/editorNavigationQuickAccess"},{"name":"AbstractExpressionsRenderer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"AbstractExtensionService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService"},{"name":"AbstractExtHostExtensionService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"AbstractExtHostOutputChannel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"AbstractFileDialogService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/abstractFileDialogService"},{"name":"AbstractFileOutputChannelModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"AbstractFileSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractGotoLineQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/gotoLineQuickAccess"},{"name":"AbstractGotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/gotoSymbolQuickAccess"},{"name":"AbstractJsonFileSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractKeybindingService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/abstractKeybindingService"},{"name":"AbstractLifecycleService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycleService"},{"name":"AbstractLineHighlightOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"AbstractLogService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"AbstractPathService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/common/pathService"},{"name":"AbstractProblemCollector","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"AbstractProcess","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"AbstractRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbstractRemoteAgentService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/abstractRemoteAgentService"},{"name":"AbstractScrollableElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"AbstractScrollbar","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/abstractScrollbar"},{"name":"AbstractSearchAndReplaceAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"AbstractSettingRenderer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"AbstractSettingsModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"AbstractShowReleaseNotesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"AbstractSortLinesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractTaskService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/abstractTaskService"},{"name":"AbstractTelemetryOptOut","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut"},{"name":"AbstractTextFileService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/browser/textFileService"},{"name":"AbstractTextMateService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/browser/abstractTextMateService"},{"name":"AbstractTextResourceEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textResourceEditor"},{"name":"AbstractTree","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"AbstractTunnelService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/tunnelService"},{"name":"AbstractUpdateService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/abstractUpdateService"},{"name":"AbstractURLService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlService"},{"name":"AbstractVariableResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/variableResolver"},{"name":"AbstractWorkspaceEditingService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService"},{"name":"Accelerator","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"acceptLocalChangesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"access","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"AccessibilityHelpNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"AccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"AccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"AccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibilityService"},{"name":"AccessibilitySupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"AccessibilitySupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"accessSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"AccountsActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ACL_IDENTITY","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"ACLED_DIRECTORIES","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"Action","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"Action2","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ActionBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"actions","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vscode-nsfw"},{"name":"ActionsOrientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActivatedExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ActivationTimes","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ACTIVE_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"activeContrastBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ActiveEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupEmptyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupIndexContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupLastContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorIsReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveGroupEditorsByMostRecentlyUsedQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"ActivePanelContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"ActiveViewletContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"ActiveWindowManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/activeWindowTracker"},{"name":"ACTIVITY_BAR_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_ACTIVE_FOCUS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BADGE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BADGE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ActivitybarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarPart"},{"name":"ActivityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/browser/activityService"},{"name":"ActivityUpdater","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"ADD_CONFIGURATION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"ADD_ROOT_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"ADD_ROOT_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"addArg","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"addClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addClasses","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addContextToEditorMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchHelpers"},{"name":"AddCursorsAtSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"addDisposableGenericMouseDownListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableGenericMouseMoveListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableGenericMouseUpListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableNonBubblingMouseOutListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableNonBubblingPointerOutListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableThrottledListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addEventListener","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"AddFunctionBreakpointAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"addListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"addListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ADDRCONFIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"ADDRGETNETWORKPARAMS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"AddRootFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"AddSelectionToNextFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"AddSelectionToPreviousFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"addSetting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"addStandardDisposableGenericMouseDownListner","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addStandardDisposableGenericMouseUpListner","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addStandardDisposableListener","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addTerminalEnvironmentKeys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"addToValueTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"AddToWorkspaceFolderRecommendationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"AddToWorkspaceRecommendationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"addTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"AddWatchExpressionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"adoptToGalleryExtensionId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"after","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"afterEach","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Agent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"Agent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"Aggregation","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"alert","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"alert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"alertFormattingEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"ALL_SYNC_RESOURCES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"allCharCodes","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"AllEditorsByAppearanceQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"AllEditorsByMostRecentlyUsedQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"AllKeysConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"allowedNodeEnvironmentFlags","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"allowSetForegroundWindow","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-foreground-love/index"},{"name":"allSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ALPN_ENABLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"AnalyserNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnchorAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"anchorGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"AnchorPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"animate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Animation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationEffect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationPlaybackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationTimeline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ansiColorIdentifiers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"ansiColorMap","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"any","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"anyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"AnythingQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/anythingQuickAccess"},{"name":"ApiCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ApiCommandArgument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ApiCommandResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"app","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"append","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"appendEditorTitleContextMenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions.contribution"},{"name":"appendFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"appendFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"appendKeyBindingLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"appendStylizedStringToContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"appendStylizedStringToContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"appendToCommandPalette","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions.contribution"},{"name":"AppInsightsAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/appInsightsAppender"},{"name":"applicationCache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ApplicationCache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"applicationSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"applyCodeAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"applyConfigurationValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"applyDeprecatedVariableMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolverUtils"},{"name":"applyDragImage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"applyEdit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"applyEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"ApplyEditsResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"ApplyToKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"appVersion","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"arch","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"arch","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"areFunctions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"areKeyboardLayoutsEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"areSame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"areSameExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"areWebviewInputOptionsEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"argv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"argv0","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"AriaLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ArrayBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"arrayInsert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"ArrayNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/navigator"},{"name":"ARROW_IMG_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarArrow"},{"name":"as","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"asArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"AsbtractOutputChannelModelService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"asCSSUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"asDomUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"asJson","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"asPromise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"assert","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"assertAllDefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"AssertDocumentLineMappingDirection","kind":"enum","kindModifiers":"","sortText":"0"},{"name":"assertEqualQueries","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"assertEqualSearchPathResults","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"AssertionError","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"assertIsDefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"assertMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveKeyboardEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveUserBinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"asserts","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"assertSyncedModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/editableTextModelTestUtils"},{"name":"assertType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"assign","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"asText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"asWebviewUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/webview"},{"name":"async","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"AsyncDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"AsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/asyncDataTree"},{"name":"AsyncEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"AsyncResource","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"atob","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Atomics","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"attachBadgeStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachBreadcrumbsStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachButtonStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachCheckboxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachDialogStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachFindReplaceInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachLinkStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachListStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachMenuStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachProgressBarStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachQuickInputStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachSelectBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachStylerCallback","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachSuggestEnabledInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput"},{"name":"Attr","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Audio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioBufferSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioDestinationNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioListener","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioParam","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioParamMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioProcessingEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioScheduledSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioWorklet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioWorkletNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"authentication","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"AuthenticationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/browser/authenticationService"},{"name":"AuthenticationTokenService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount"},{"name":"AuthenticationTokenService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/electron-browser/authenticationTokenService"},{"name":"AuthenticationTokenServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccountIpc"},{"name":"AuthenticatorAssertionResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthenticatorAttestationResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthenticatorResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthStatus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"AutoCheckUpdatesConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"AutoFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"AutoIndentOnPaste","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"AutoIndentOnPasteCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"automaticKeyboardNavigationSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"AutoSaveAfterShortDelayContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"AutoSaveConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"AutoSaveMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"AutoUpdateConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"autoUpdater","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"AvailabilityData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/AvailabilityData"},{"name":"AvailabilityData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"AverageBufferSize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"await","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"BackLayerWebView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView"},{"name":"BackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"BackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/node/backupFileService"},{"name":"BackupFilesModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"BackupMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backupMainService"},{"name":"BackupRestorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/common/backupRestorer"},{"name":"BACKUPS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/common/environment"},{"name":"BackupTracker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/common/backupTracker"},{"name":"BADFAMILY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADFLAGS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"badgeBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"badgeForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BADHINTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADNAME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADQUERY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADRESP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADSTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BareFontInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/fontInfo"},{"name":"BarProp","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Barrier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Base","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Base"},{"name":"Base","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"BaseActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"BaseAudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BaseBinaryResourceEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/binaryEditor"},{"name":"BaseBreakpoint","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"BaseCellViewModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel"},{"name":"BaseCloseAllAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseConfigurationResolverService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/browser/configurationResolverService"},{"name":"BaseCreateEditorGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseDropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"BaseEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/baseEditor"},{"name":"BaseEditorQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"BaseErrorTelemetry","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/errorTelemetry"},{"name":"BaseExtHostTerminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"BaseExtHostTerminalService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"BaseFocusGroupAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseMoveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"basename","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"basename","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"basename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"basenameOrAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"BaseNavigateEditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseQuickAccessEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseQuickAccessNavigateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/quickAccessActions"},{"name":"BaseResizeViewAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"BaseResolvedKeybinding","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/baseResolvedKeybinding"},{"name":"BaseSaveAllAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"BaseSplitEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseSwitchWindow","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"BaseTextEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textEditor"},{"name":"BaseTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/textEditorModel"},{"name":"baseTypeToTelemetryType","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"BaseWebview","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/baseWebviewElement"},{"name":"BaseWindowDriver","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/browser/baseDriver"},{"name":"BaseZoomAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"BasicInplaceReplace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/inplaceReplaceSupport"},{"name":"BatchedCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"before","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"beforeEach","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"BeforeUnloadEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BenchmarkSuite","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/benchmark/benchmarkUtils"},{"name":"BetterMergeId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"BhxBrowser","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"bigint","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"BigInt","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BigInt64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BigIntStats","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"BigUint64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BINARY_DIFF_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"BINARY_FILE_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"BinaryEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/binaryEditorModel"},{"name":"BinaryFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor"},{"name":"BinaryResourceDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/binaryDiffEditor"},{"name":"binarySearch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"BiquadFilterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Blob","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BlockCommentCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/blockCommentCommand"},{"name":"blur","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"boolean","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Boolean","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BooleanEventEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"BOTTOM_CELL_TOOLBAR_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"BoundModelReferenceCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocuments"},{"name":"BracesHidingRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"BracketElectricCharacterSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/electricCharacter"},{"name":"BracketMatchingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/bracketMatching/bracketMatching"},{"name":"BracketSelectionRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/bracketSelections"},{"name":"BracketsUtils","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"breadcrumbsActiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"breadcrumbsBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsConfig","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"BreadcrumbsControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsControl"},{"name":"BreadcrumbsFilePicker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"breadcrumbsFocusForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"breadcrumbsForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsItem","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"BreadcrumbsOutlinePicker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"BreadcrumbsPicker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"breadcrumbsPickerBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"BreadcrumbsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"break","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"breakBetweenGraphemeBreakType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Breakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Breakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Breakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"BREAKPOINT_EDITOR_CONTRIBUTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"BreakpointEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution"},{"name":"BREAKPOINTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"breakpointsExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"BreakpointsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"BreakpointWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointWidget"},{"name":"BreakpointWidgetContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"BroadcastChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"brotliCompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliCompressSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliDecompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliDecompressSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"BrowserBackupTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/browser/backupTracker"},{"name":"BrowserClipboardService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/clipboard/browser/clipboardService"},{"name":"BrowserCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/browser/credentialsService"},{"name":"BrowserEnvironmentConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/browser/environmentService"},{"name":"BrowserFeatures","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/canIUse"},{"name":"BrowserHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/browser/browserHostService"},{"name":"BrowserIntegrityServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/browser/integrityService"},{"name":"BrowserKeyboardMapperFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keymapService"},{"name":"BrowserKeyboardMapperFactoryBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keymapService"},{"name":"BrowserLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/lifecycle/browser/lifecycleService"},{"name":"BrowserPathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/browser/pathService"},{"name":"BrowserRequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/request/browser/requestService"},{"name":"BrowserResizeObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/sizeObserver"},{"name":"BrowserSocketFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/browserSocketFactory"},{"name":"BrowserStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/browser/storageService"},{"name":"BrowserTelemetryOptOut","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut"},{"name":"BrowserTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/browser/browserTextFileService"},{"name":"BrowserUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/update/browser/updateService"},{"name":"BrowserURLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/url/browser/urlService"},{"name":"BrowserView","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWindow","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWindowProxy","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWorkbenchEnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/browser/environmentService"},{"name":"BrowserWorkspaceEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspaceEditingService"},{"name":"BrowserWorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspacesService"},{"name":"btoa","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"buffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"Buffer","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"Buffer","kind":"alias","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"BufferedEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"BufferLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/bufferLog"},{"name":"BufferredOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"bufferToReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"bufferToStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"buildHelpMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"buildRegexParseError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"buildReplaceStringWithCasePreserved","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/search"},{"name":"buildTelemetryMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetry"},{"name":"buildVersionMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"BUILTIN_MANIFEST_CACHE_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"BuiltInBasicsExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"BuiltInExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"builtinModules","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"BuiltInThemesExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"BulkCategory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkEditAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditNaviLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane"},{"name":"BulkEditPreviewProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkEditService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/bulkEdit/browser/bulkEditService"},{"name":"BulkEditSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkFileOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkFileOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkFileOperationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkTextEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"Button","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/button/button"},{"name":"buttonBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"buttonBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"buttonForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ButtonGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/button/button"},{"name":"buttonHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"buttonHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"ByteLengthQueuingStrategy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cache"},{"name":"Cache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/cache"},{"name":"cached","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"cachedDataVersionTag","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"CachedExtensionScanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner"},{"name":"CachedKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keyboardMapper"},{"name":"CachedListVirtualDelegate","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"cachedStringRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/shiftCommand"},{"name":"caches","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CacheStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"calcANSI8bitColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"calcANSI8bitColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"calculateLF","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"calculateSize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"Call","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"callbackify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"CallHierarchyDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyIncomingCall","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyIncomingCall","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyIncomingCall","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyItem","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyOutgoingCall","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyOutgoingCall","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyOutgoingCall","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyTreePeekWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek"},{"name":"CallRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"CALLSTACK_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CallStackEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackEditorContribution"},{"name":"CallStackView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"CancelActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"cancelAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"CancelCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"canceled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"CancellationToken","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cancellation"},{"name":"CancellationTokenSource","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cancellation"},{"name":"CancellationTokenSource","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"CANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"CancelSearchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"canExecuteOnUI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canExecuteOnWeb","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canExecuteOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canNormalize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"CanvasGradient","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CanvasPattern","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CanvasRenderingContext2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"captureEvents","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"CaretPosition","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"case","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CaseSensitiveCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"catch","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CategoryElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"CategoryElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"CDATASection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CELL_MARGIN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"CELL_RUN_GUTTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"CELL_TOOLBAR_SEPERATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"CellEditState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellEditType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellFocusMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CellMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellMenus"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CellRevealPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellRunState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellUri","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CenteredViewLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/centered/centeredViewLayout"},{"name":"Certificate","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"CHANGE_BUFFER_DELAY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"ChangeEncodingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeEOLAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeIndentationSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ChangeModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeSortAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Channel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Channel"},{"name":"ChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ChannelMergerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ChannelServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ChannelSplitterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CharacterClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/characterClassifier"},{"name":"CharacterData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CharacterMapping","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"CharacterMappingConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"CharacterPairSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/characterPair"},{"name":"CharacterSet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/characterClassifier"},{"name":"CharCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/charCode"},{"name":"CharWidthRequest","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"CharWidthRequestType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"chdir","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Checkbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"CheckboxActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"CheckedStates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"CheckForUpdatesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"CheckForVSCodeUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"CheckForVSCodeUpdateActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/common/update"},{"name":"checkProposedApiEnabled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"checkServerIdentity","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"checksum","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/crypto"},{"name":"chmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chmod","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"chmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Choice","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"ChoiceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"ChokidarWatcherService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/chokidarWatcherService"},{"name":"ChordKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"chown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chrome","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ChunkStream","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Cipher","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"clamp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"class","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CLASSIFIER_MODIFIER_SEPARATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"ClassName","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"clean","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"cleanMnemonic","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"cleanRemoteAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"CleanSearchEditorStateCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"cleanUndefinedQueryValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"clear","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"CLEAR_ALL_NOTIFICATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"CLEAR_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"clearAllFontInfos","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"ClearAllNotificationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"ClearCommandHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"ClearEditorHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClearExtensionsInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"clearHistoryCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"clearImmediate","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearImmediate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"clearInterval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearInterval","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"clearLine","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"clearNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"ClearNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"ClearRecentFilesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClearReplAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/repl"},{"name":"clearScreenDown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"ClearSearchHistoryCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ClearSearchResultsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ClearTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"clearTextMimes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"clearTimeout","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearTimeout","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"ClickLinkGesture","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkKeyboardEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.cp"},{"name":"CLIENT_RENEG_LIMIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"CLIENT_RENEG_WINDOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"ClientCoordinates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"clientInformation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRectList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"ClientRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"clipboard","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Clipboard","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClipboardBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"ClipboardEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CLIServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostCLIServer"},{"name":"clock","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"cloneAndChange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"CLOSE_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITOR_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_AND_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_TO_THE_RIGHT_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_SAVED_EDITORS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CloseAllEditorGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseAllEditorsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseCurrentWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"closed","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CloseDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"CloseEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEditorInAllGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEditorsInOtherGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CloseExtensionDetailsOnViewChangeKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"CloseGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CloseLeftEditorsInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseOneEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClosePanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"CloseReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CloseReplaceWidgetActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CloseSidebarAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"closeSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"CloseWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"cmp","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"coalesce","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"coalesceInPlace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"CodeAction","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionAutoApply","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"CodeActionCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"CodeActionCommandArgs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"codeActionCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"CodeActionDocumentationContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationContribution"},{"name":"CodeActionExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint"},{"name":"CodeActionKeybindingResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionMenu"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionMenu"},{"name":"CodeActionModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"CodeActionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeActionsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsContribution"},{"name":"codeActionsExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint"},{"name":"CodeActionsState","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"CodeActionTrigger","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionTriggerType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeActionUi","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionUi"},{"name":"CodeApplication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/app"},{"name":"CodeCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell"},{"name":"CodeCellRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"CodeCellViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel"},{"name":"CodeDataTransfers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CodeEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/codeEditorService"},{"name":"CodeEditorServiceImpl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"CodeEditorStateFlag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"CodeEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"CodeInset","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeLens","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeLens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeLensCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codeLensCache"},{"name":"CodeLensContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensController"},{"name":"CodeLensHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensWidget"},{"name":"CodeLensModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelens"},{"name":"CodeLensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeLensWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensWidget"},{"name":"CodeWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/window"},{"name":"CodiconActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"CodiconLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/codiconLabel/codiconLabel"},{"name":"codiconStartMarker","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"coerce","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"COLLAPSE_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"CollapseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"CollapseAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/treeDefaults"},{"name":"CollapseDeepestExpandedLevelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CollapseExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CollapseNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"collectLaunchConfigs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"collectWorkspaceStats","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"Color","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Color","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"Color","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Color","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ColorDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorDetector"},{"name":"ColorExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorExtensionPoint"},{"name":"ColorFormat","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorId","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ColorInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"colorize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"colorizeElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"colorizeModelLine","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"Colorizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/colorizer"},{"name":"ColorMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ColorPickerBody","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPickerHeader","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPickerModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerModel"},{"name":"ColorPickerWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPresentation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorPresentation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorPresentation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ColorProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ColorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeData"},{"name":"ColorThemeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorThemeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"colorThemeSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"ColorZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"ColumnSelection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorColumnSelection"},{"name":"combinedAppender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"combinedDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"CombinedInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"CombinedSpliceable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/splice"},{"name":"Command","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"CommandLine","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"CommandOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"commands","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"commands","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"CommandsConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"CommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/commands/common/commandService"},{"name":"commandsExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/menusExtensionPoint"},{"name":"CommandsHistory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/commandsQuickAccess"},{"name":"CommandsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"CommandsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"CommandString","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CommandString","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"CommandTrackerAddon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon"},{"name":"Comment","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CommentBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"CommentContextKeys","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentContextKeys"},{"name":"CommentController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"COMMENTEDITOR_DECORATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentThreadWidget"},{"name":"CommentFormActions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentFormActions"},{"name":"CommentGlyphWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentGlyphWidget"},{"name":"CommentMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentMenus"},{"name":"CommentMode","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CommentMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CommentMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CommentMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/commentMode"},{"name":"CommentNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"CommentNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentNode"},{"name":"CommentNodeRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"comments","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"COMMENTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"COMMENTS_VIEW_TITLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsAsyncDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentService"},{"name":"CommentsList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"CommentsModelVirualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsPanel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsView"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CommitCharacterController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestCommitCharacters"},{"name":"CommonEditorConfiguration","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"CommonFindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"commonlyUsedData","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"commonPrefixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"commonPrefixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"commonSuffixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"CommonTask","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"Comparator","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compare","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"COMPARE_RESOURCE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COMPARE_SELECTED_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COMPARE_WITH_SAVED_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"compareAnything","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareBuild","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compareByPrefix","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareFileExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareFileNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareIdentifiers","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compareIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compareItemsByFuzzyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"compareMarkersByUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"comparePaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareSubstring","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compareSubstringIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"CompareWithClipboardAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CompatChangeAll","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"compile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCompile"},{"name":"compileFunction","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"CompletionContext","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"CompletionItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItem","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemInsertTextRule","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemInsertTextRule","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItemKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItemTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"completionKindFromString","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"completionKindToCssClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionList","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/completionModel"},{"name":"CompletionOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"CompletionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionTriggerKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"Component","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/component"},{"name":"ComposedTreeDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"Composite","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositeBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBar"},{"name":"CompositeDescriptor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBar"},{"name":"CompositeDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CompositeDragAndDropObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CompositeOverflowActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositeOverflowActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositePart","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositePart"},{"name":"CompositeProgressIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"CompositeRegistry","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeScope","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"CompositeSnippetVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"CompositionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"compress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"compressConsecutiveTextChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textChange"},{"name":"CompressedNavigationController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"CompressedObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"CompressibleAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/asyncDataTree"},{"name":"CompressibleObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTree"},{"name":"CompressibleObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"computeCodePoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ComputedEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"computeLinks","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"computeRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"computeScreenAwareSize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"computeStyles","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"config","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"config","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"Config","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"Config","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"Configuration","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"CONFIGURATION_SYNC_STORE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"ConfigurationCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configurationCache"},{"name":"ConfigurationCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/node/configurationCache"},{"name":"ConfigurationChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"ConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationEditingError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationEditingErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ConfigurationManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugConfigurationManager"},{"name":"ConfigurationModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/browser/configurationResolverService"},{"name":"ConfigurationResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService"},{"name":"ConfigurationScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationService"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ConfigurationTargetToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"configurationTelemetry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"ConfigureAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"ConfigureLanguageBasedSettingsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesActions"},{"name":"ConfigureLocaleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/localizationsActions"},{"name":"ConfigureNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"configureOpenerTrustedDomainsHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"ConfigureRecommendedExtensionsCommandsContributor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfigureRuntimeArgumentsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ConfigureTaskAction","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/abstractTaskService"},{"name":"ConfigureWorkspaceFolderRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfigureWorkspaceRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfiguringTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"confirm","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ConfirmResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"CONFLICT_RESOLUTION_CONTEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"CONFLICT_RESOLUTION_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"ConflictDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/bulkEdit/browser/conflicts"},{"name":"connect","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"connect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"connect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"connect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"connect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"connected","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ConnectionGainEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ConnectionLostEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ConnectionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectPrimaryMenuToInlineActionBar","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"connectProxyResolver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/proxyResolver"},{"name":"connectRemoteAgentExtensionHost","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectRemoteAgentManagement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectRemoteAgentTunnel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"CONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"console","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Console","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ConsoleLogInAutomationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/browser/log"},{"name":"ConsoleLogInMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ConsoleLogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ConsoleLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"consolidate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"const","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"constants","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"constants","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"constants","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"constants","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/constants"},{"name":"Constants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"Constants","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"Constants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"ConstantSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"consumeReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeReadableWithLimit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeStreamWithLimit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"contains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"containsDragType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"containsEmoji","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsFullWidthCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsRTL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsUppercaseCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ContentHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverWidgets"},{"name":"contentTracing","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ContentViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ContentWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"ContentWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"context","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Context","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/provideSignatureHelp"},{"name":"Context","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"Context","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"Context","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"CONTEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/toolbar/toolbar"},{"name":"CONTEXT_ACCESSIBILITY_MODE_ENABLED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"CONTEXT_ACTIVE_LOG_OUTPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_AUTH_TOKEN_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"CONTEXT_BREAKPOINT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINT_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINTS_EXIST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINTS_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_CALLSTACK_ITEM_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_CUSTOM_EDITORS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CONTEXT_DEBUG_CONFIGURATION_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_UX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_UX_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_EXPRESSION_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_EXTENSION_HOST_PROFILE_RECORDED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"CONTEXT_FIND_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FIND_WIDGET_NOT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CONTEXT_FOCUSED_SESSION_IS_ATTACH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_BREAKPOINT_WIDGET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_DEBUG_MODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_DEBUG_REPL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_OUTPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_JUMP_TO_CURSOR_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_KEYBINDING_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_KEYBINDINGS_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_KEYBINDINGS_SEARCH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_LOADED_SCRIPTS_ITEM_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_LOADED_SCRIPTS_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_MENU_CHANNEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/common/contextmenu"},{"name":"CONTEXT_MENU_CLOSE_CHANNEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/common/contextmenu"},{"name":"CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"CONTEXT_OUTPUT_SCROLL_LOCK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_PROFILE_SESSION_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"CONTEXT_RENAME_INPUT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/renameInputField"},{"name":"CONTEXT_REPLACE_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_RESTART_FRAME_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_SETTINGS_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_SETTINGS_JSON_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_SETTINGS_SEARCH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_STEP_BACK_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_SYNC_ENABLEMENT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"CONTEXT_SYNC_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"CONTEXT_TOC_ROW_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_UPDATE_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"CONTEXT_VARIABLES_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_WATCH_EXPRESSIONS_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"ContextAwareMenuEntryActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"contextBridge","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ContextKeyAndExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyDefinedExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyEqualsExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyExpr","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyExprType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyFalseExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotEqualsExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotRegexExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyOrExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyRegexExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"ContextKeyTrueExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextMenuController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/contextmenu/contextmenu"},{"name":"ContextMenuHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextMenuHandler"},{"name":"ContextMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextMenuService"},{"name":"ContextMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService"},{"name":"ContextScopedFindInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextScopedHistoryInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextScopedReplaceInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextSubMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/contextmenu"},{"name":"ContextTagKeys","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ContextTagKeys"},{"name":"ContextTagKeys","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ContextView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"ContextViewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextViewService"},{"name":"continue","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CONTINUE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"CONTINUE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"Contracts","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"contrastBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ContributableViewsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"ContributedCustomEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors"},{"name":"ContributedTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"convertBufferRangeToViewport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"convertLinkRangeToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"convertSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeCompatibility"},{"name":"convertSimple2RegExpPattern","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"convertToDAPaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"convertToVSCPaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"ConvolverNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cookies","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"CoordinatesConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"copy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"COPY_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"COPY_PATH_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COPY_RELATIVE_PATH_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COPY_STACK_TRACE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"copyAllCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyAllCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"copyFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"COPYFILE_EXCL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"COPYFILE_FICLONE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"COPYFILE_FICLONE_FORCE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"copyFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"copyFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"CopyLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/copyLinesCommand"},{"name":"copyMatchCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyMatchCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CopyNotificationMessageAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"CopyOptions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaInput"},{"name":"copyPathCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyPathCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CopyTerminalSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"CopyValueAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"CopyWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"CoreEditingCommands","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CoreEditorCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CoreNavigationCommands","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CorrelationContextManager","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/AutoCollection/CorrelationContextManager"},{"name":"count","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"CountBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/countBadge/countBadge"},{"name":"countEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"Counter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"CountQueuingStrategy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"countReset","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"cpus","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"cpuUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"crash","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"crashReporter","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"crashReporterIdStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"create","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"domain"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorSimpleWorker"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkComputer"},{"name":"create","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateWorker"},{"name":"createActionViewItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createAndBindHistoryNavigationWidgetScopedContextKeyService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"createAndFillInActionBarActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createAndFillInContextMenuActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createApiFactoryAndRegisterActors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.api.impl"},{"name":"createBreadcrumbsPicker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"createBreakpointDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution"},{"name":"createBrotliCompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createBrotliDecompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createCancelablePromise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"createCellViewModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel"},{"name":"createChannelReceiver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc"},{"name":"createChannelSender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc"},{"name":"createCipher","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createCipheriv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createConnection","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"createContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"createCSSRule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createCustomTask","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"createDecipher","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDecipheriv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDecorationsForStackFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackEditorContribution"},{"name":"createDecorator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"createDecorator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"createDeflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createDeflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createDiffEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createDiffieHellman","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDiffNavigator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createECDH","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createEditorFromSearchResult","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"createEditorPagePosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"createElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"createError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"createErrorWithActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorsWithActions"},{"name":"createExtHostContextProxyIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"createFakeScopedLineTokens","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/modesTestUtils"},{"name":"createFastDomNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/fastDomNode"},{"name":"createFileEditorInput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"createFileIconThemableTreeContainerScope","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"createFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"createFindMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"createGunzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createGzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createHash","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createHmac","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createHook","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"createImageBitmap","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"createInflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createInflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createInterface","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"createKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"createLineMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"createLineStarts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createLineStartsFast","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createMainContextProxyIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"createMatchers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/textMateScopeMatcher"},{"name":"createMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"createMemoizer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"createMessageOfType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"createMetaElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createMockBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"createMockSession","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/browser/callStack.test"},{"name":"createMockText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"createModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createMonacoBaseAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneBase"},{"name":"createMonacoEditorAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createMonacoLanguagesAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"createMouseMoveEventMerger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseHandler"},{"name":"CreateNewLocalTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote"},{"name":"CreateNewTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"createPrivateKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createProxyObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"createPublicKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createQueuedSender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"createReadStream","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"createReadStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/io"},{"name":"createRegExp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"createRequire","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"createRequireFromPath","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"createResourceExcludeMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"createRotatingLogger","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"createRotatingLogger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/spdlogService"},{"name":"createRotatingLoggerAsync","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"createScanner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"createScopedLineTokens","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"createSecretKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createSecureContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSecurePair","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSecureServer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"createSerializedGrid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"createServer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSign","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createSimpleKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"createSingleEditOp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/commands/shiftCommand.test"},{"name":"createSingleEditOp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test"},{"name":"createSlowExtensionAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions"},{"name":"createSocket","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dgram"},{"name":"createStringBuilder","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"createStubInstance","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"createStyleSheet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createSuggestItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/test/completionModel.test"},{"name":"createSyncDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/descriptors"},{"name":"createTerminalEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"createTestCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"createTextBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactory","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactoryFromSnapshot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactoryFromStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/editorTestUtils"},{"name":"createTextSearchResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"createTOCIterator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"createTokenizationSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchLexer"},{"name":"createTracing","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"trace_events"},{"name":"createUintArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createUnzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createUpdateURL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/abstractUpdateService"},{"name":"createValidator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesValidation"},{"name":"createVerify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createWaitMarkerFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/waitMarkerFile"},{"name":"createWebWorker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/webWorker"},{"name":"createWebWorker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createWriteStream","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Credential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CredentialsContainer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Critical","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"crypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Crypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CryptoKey","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CryptoKeyPair","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSS","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"CSSConditionRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"cssEscape","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"CSSFontFaceRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSGroupingRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSImportRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSKeyframeRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSKeyframesRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSMediaRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSNamespaceRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSPageRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSRuleList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleDeclaration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleSheet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSSupportsRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ctxCommentEditorFocused","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/simpleCommentEditor"},{"name":"ctxHasSymbols","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/symbolNavigation"},{"name":"ctxReferenceSearchVisible","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesController"},{"name":"CurrentLineHighlightOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"CurrentLineMarginHighlightOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"currentSchemaVersion","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"currentSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"Cursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"CursorAtBoundary","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CursorChangeReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorEvents"},{"name":"CursorChangeReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CursorCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCollection"},{"name":"CursorColumns","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorModelState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"CursorMove","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveCommands"},{"name":"CursorMoveCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveCommands"},{"name":"CursorPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveOperations"},{"name":"CursorRedo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorStateChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"cursorStyleToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"cursorTo","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"CursorUndo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorUndoRedoController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorWordAccessibilityLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordPartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CustomEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditors"},{"name":"CustomEditorInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CustomEditorInfoCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CustomEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInput"},{"name":"CustomEditorInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory"},{"name":"CustomEditorModelManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditorModelManager"},{"name":"CustomEditorPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"customEditorsAssociationsSettingId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"CustomEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditors"},{"name":"customEditorsExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/extensionPoint"},{"name":"CustomElementRegistry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"customElements","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CustomEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CustomExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CustomExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CustomExecution2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CustomExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"CUSTOMIZED_TASK_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CustomMenubarControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/menubarControl"},{"name":"CustomTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CustomTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customTextEditorModel"},{"name":"CustomTreeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"cutFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CutWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"cwd","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"cwd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DARK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"darken","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DarwinUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.darwin"},{"name":"data","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/filters.perf.data"},{"name":"Data","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Data"},{"name":"Data","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"Database","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"DataBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DataBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"DataCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataPoint","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPoint"},{"name":"DataPoint","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"DataPointType","kind":"enum","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"DataPointType","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"DataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"DataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"DataTransfer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransferItem","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransferItemList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransfers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/dataTree"},{"name":"DataUri","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"DataView","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Date","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"debounce","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"debug","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"debug","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Debug","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"DEBUG_HELPER_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DebugAdapterExecutable","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterExecutable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugAdapterInlineImplementation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterInlineImplementation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugAdapterServer","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugConsoleMode","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugConsoleMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugContentProvider"},{"name":"debugExceptionWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"debugExceptionWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"DebugExtensionHostAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"debugger","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Debugger","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Debugger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugger"},{"name":"debuggersExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"DebugHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugHover"},{"name":"debugIconContinueForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconDisconnectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconPauseForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconRestartForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStartForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepBackForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepIntoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepOutForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepOverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStopForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debuglog","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"DebugModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"debugPort","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DebugProgressContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugProgress"},{"name":"DebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugService"},{"name":"DebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugSession"},{"name":"DebugStatusContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugStatus"},{"name":"DebugTaskRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugTaskRunner"},{"name":"DebugToolBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugToolBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugToolBarBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"DebugViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugViewlet"},{"name":"Decipher","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"DeclarationProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"declare","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"decode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"decode","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"decode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"decodeSemanticTokensDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/semanticTokensDto"},{"name":"decodeStream","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"decodeURI","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"decodeURIComponent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"decodeUTF16LE","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"decodeUTF8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"decompress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"Decoration","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Decoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DecorationRangeBehavior","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DecorationRangeBehavior","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DecorationRangeBehavior","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DecorationRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DecorationSegment","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"DecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/decorations/decorations"},{"name":"DecorationsOverviewRuler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler"},{"name":"DecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/decorations/browser/decorationsService"},{"name":"DecorationToRender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"DecreaseSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"DecreaseViewSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"DedupOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"deepClone","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"deepEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"deepFreeze","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"deepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"default","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"DEFAULT_COMMANDS_TO_SKIP_SHELL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_CUSTOM_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"DEFAULT_ECDH_CURVE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"DEFAULT_EDITOR_MAX_DIMENSIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_EDITOR_MIN_DIMENSIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_EDITOR_PART_OPTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_ENCODING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"DEFAULT_LABELS_CONTAINER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"DEFAULT_LETTER_SPACING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_LINE_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_LOG_LEVEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"DEFAULT_PRODUCT_ICON_THEME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/productIconThemeData"},{"name":"DEFAULT_PRODUCT_ICON_THEME_SETTING_VALUE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"DEFAULT_SETTINGS_EDITOR_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"DEFAULT_SETTINGS_EDITOR_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"DEFAULT_TERMINAL_OSX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"DEFAULT_VALUE","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"DEFAULT_WORD_REGEXP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"defaultApp","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"defaultBreadcrumbsStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"defaultCipherList","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"defaultClient","kind":"let","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"DefaultConfigurationExportHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper"},{"name":"DefaultConfigurationModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"defaultCoreCipherList","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"defaultCustomEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors"},{"name":"DefaultDeserializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"defaultDialogStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"DefaultElementMapper","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"DefaultEndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"DefaultEndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"defaultGenerator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/idGenerator"},{"name":"defaultInsertColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"defaultKeybindingsContents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultKeybindingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultKeyboardNavigationDelegate","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"defaultListStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"defaultMaxListeners","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"defaultMenuStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"DefaultPaneDndController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"DefaultPreferencesEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"DefaultPreferencesEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"defaultQuickAccessContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"defaultQuickAccessContextKeyValue","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"DefaultQuickAccessFilterValue","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"DefaultRawSettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultRecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"defaultRemoveColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DefaultRoleName","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"defaultSearchConfig","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"DefaultSerializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"DefaultSettings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultSettingsEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"DefaultSettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultSettingsHeaderWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"DefaultSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"defaultSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"defaultStatus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DefaultStyleController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"defaultStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBox"},{"name":"DefaultURITransformer","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"defaultWebSocketFactory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/browserSocketFactory"},{"name":"defaultWindowState","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/window"},{"name":"DefaultWorkerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/worker/defaultWorkerFactory"},{"name":"DeferredPermissionRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeferredPromise","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"define","kind":"const","kindModifiers":"declare","sortText":"4"},{"name":"DefineKeybindingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"DefineKeybindingOverlayWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"DefineKeybindingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"defineTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"DefinitionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToCommands"},{"name":"DefinitionLink","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DefinitionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"deflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateRawSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"DelayedDragHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DelayedPagedModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"Delayer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"DelayNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Delegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"Delegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList"},{"name":"DelegatedLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"DelegatingEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorService"},{"name":"delete","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"DeleteAllLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteAllRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"deleteFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DeleteLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorDeleteOperations"},{"name":"deletePassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"deletePassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"DeleteWordCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordEndLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordEndRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordPartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"DeleteWordPartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"DeleteWordRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordStartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordStartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"delimiter","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"delimiter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"delta","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"DeltaExtensionsResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDescriptionRegistry"},{"name":"departFocus","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"DependsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"deprecate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"Deprecated_RemoteAuthorityContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"describe","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"descriptionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"deserialize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"deserializeEnvironmentVariableCollection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableShared"},{"name":"deserializePipePositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"Deserializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"deserializeSearchError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"desktopCapturer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"DesktopDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"DesktopHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/electron-browser/desktopHostService"},{"name":"DESTRUCTION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"detect","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"detectAvailableShells","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"detectEncodingByBOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/encoding/encoding.test"},{"name":"detectEncodingByBOMFromBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"detectEncodingFromBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"DetectIndentation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"detectModeId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"DeviceAcceleration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceLightEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceMotionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceOrientationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"devicePixelRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceRotationRate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DH_CHECK_P_NOT_PRIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_CHECK_P_NOT_SAFE_PRIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_NOT_SUITABLE_GENERATOR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_UNABLE_TO_CHECK_GENERATOR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"Diagnostic","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Diagnostic","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Diagnostic","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDiagnostics"},{"name":"DiagnosticRelatedInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticRelatedInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticRelatedInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticsChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsIpc"},{"name":"DiagnosticSeverity","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticSeverity","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"DiagnosticsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsIpc"},{"name":"DiagnosticTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"dialog","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Dialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dialog/dialog"},{"name":"DialogChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-browser/dialogIpc"},{"name":"DialogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-main/dialogs"},{"name":"DialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/dialogService"},{"name":"DialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/dialogService"},{"name":"didBindWorkbenchListAutomaticKeyboardNavigation","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"DidChangeContentEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"DidChangeDecorationsEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"didUseCachedData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/timer/electron-browser/timerService"},{"name":"diff","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"diff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"DiffAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"diffBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffChange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diffChange"},{"name":"DiffComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/diff/diffComputer"},{"name":"DiffEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/diffEditorInput"},{"name":"DiffEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/diffEditorModel"},{"name":"DiffEditorState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"DiffEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffEditorWidget"},{"name":"DiffieHellman","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"diffInserted","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"diffInsertedOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffNavigator"},{"name":"diffRemoved","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"diffRemovedOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffReview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffReview"},{"name":"Dimension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"dir","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Dir","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"Dirent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"dirExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"dirname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"dirname","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"dirname","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"DirtyDiffController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyDiffModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyDiffWorkbenchController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"DirtyFilesIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/dirtyFilesIndicator"},{"name":"DirtyWorkingCopiesContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"dirxml","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"DisableAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"DisableAllWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DISABLED_EXTENSIONS_STORAGE_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"DisabledExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"DisableDropDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableForWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableGloballyAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"disconnect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"disconnect","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DISCONNECT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"DISCONNECT_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"DiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/diskFileSystemProvider"},{"name":"DiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/electron-browser/diskFileSystemProvider"},{"name":"DiskSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchService"},{"name":"DispatchConfig","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/dispatchConfig"},{"name":"dispatchEvent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Disposable","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Disposable","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"Disposable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Disposable","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"DisposableStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"disposableTimeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"dispose","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"dispose","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"disposed","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"distinct","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"distinct","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"distinctES6","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"distinctParents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"do","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"doBenchmark","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/benchmark/benchmarkUtils"},{"name":"Dock","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"document","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Document","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"documentationExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint"},{"name":"DocumentationExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint"},{"name":"DocumentFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentFragment","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DocumentHighlight","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentHighlight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentHighlight","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"DocumentHighlightProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentLink","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentLink","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentLink","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentRangeFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentRangeSemanticTokensAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"DocumentRangeSemanticTokensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentSemanticTokensAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"DocumentSemanticTokensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentSymbol","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentSymbol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentSymbol","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentSymbolProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentTimeline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DocumentType","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"doesNotReject","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"doesNotThrow","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"domain","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Domain","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"domain"},{"name":"Domain","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Domain"},{"name":"Domain","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"domainSupportsProperties","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Constants"},{"name":"domainToASCII","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"domainToUnicode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"domContentLoaded","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"DOMError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"domEvent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/event"},{"name":"DOMException","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMImplementation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMLineBreaksComputerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/domLineBreaksComputer"},{"name":"DOMMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMMatrixReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMParser","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMPointReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMQuad","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DomReadingContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"DOMRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMRectList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMRectReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DomScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"DOMSettableTokenList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMStringList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMStringMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMTokenList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"doNotTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"dosDateTimeToDate","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"DOWNLOAD_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DOWNLOAD_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DownloadItem","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"DownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadService"},{"name":"DownloadServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadIpc"},{"name":"DownloadServiceChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadIpc"},{"name":"DragAndDropCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/dnd/dragAndDropCommand"},{"name":"DragAndDropController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/dnd/dnd"},{"name":"DragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DragAndDropObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DragEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DraggedCompositeIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedEditorGroupIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedEditorIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedViewIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DragMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"Driver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-main/driver"},{"name":"DriverChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"DriverChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"Dropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropdownMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropdownMenuActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropDownMenuActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Duplex","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"DuplicateSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DuplicateWorkspaceInNewWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"DynamicsCompressorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DynamicStandaloneServices","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneServices"},{"name":"DynamicViewOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/dynamicViewOverlay"},{"name":"DynamicWebviewEditorOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay"},{"name":"DynamicWorkspaceRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/dynamicWorkspaceRecommendations"},{"name":"E2BIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EACCES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EADDRINUSE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EADDRNOTAVAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EAFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EAGAIN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EALREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBADF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBADMSG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBUSY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECANCELED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECDH","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"ECHILD","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNABORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EDEADLK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EDESTADDRREQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"edit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"EditableConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"EditOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/editOperation"},{"name":"EditOperationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"EditOperationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"editor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"EDITOR_BOTTOM_PADDING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_CONTRIBUTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"EDITOR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_FONT_DEFAULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EDITOR_GROUP_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_EMPTY_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_FOCUSED_EMPTY_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_TABS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_TABS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_MODEL_DEFAULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EDITOR_PANE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_TITLE_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"EDITOR_TOOLBAR_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_TOP_MARGIN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_TOP_PADDING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"EditorActivation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"editorActiveIndentGuides","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorActiveLineNumber","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorActiveLinkForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorAreaVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorAssociationsConfigurationNode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"EditorAutoIndentStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorAutoIndentStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EditorAutoSave","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorAutoSave"},{"name":"editorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorBracketMatchBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorBracketMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorBreadcrumbsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsModel"},{"name":"editorCodeLensForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"EditorCommandsContextActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsContribution"},{"name":"editorConfigurationBaseNode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"EditorContextKeys","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorContextKeys"},{"name":"EditorControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorControl"},{"name":"editorCursorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorCursorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/editor"},{"name":"EditorDropTarget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorDropTarget"},{"name":"editorErrorBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorExtensionsRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"editorFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindRangeHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorFontLigatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"editorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/editorGroup"},{"name":"EditorGroupActiveEditorDirtyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorGroupEditorsCountContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorGroupToViewColumn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/editor"},{"name":"EditorGroupView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorGroupView"},{"name":"editorGutter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorGutterAddedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorGutterDeletedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorGutterModifiedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorHintBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHintForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverStatusBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorInactiveSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorIndentGuides","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorInfoBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorInput","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorKeybindingCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/keybindingCancellation"},{"name":"EditorLayoutInfoComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorLayoutSingleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutThreeColumnsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutThreeRowsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoByTwoGridAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoColumnsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoColumnsBottomAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoRowsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoRowsRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"editorLightBulbAutoFixForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorLightBulbForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorLineHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorLineHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorLineNumbers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorMarkerNavigationBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationInfo","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMatchesToTextSearchResults","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchHelpers"},{"name":"EditorMemento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/baseEditor"},{"name":"EditorModeContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"EditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorModesRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"EditorMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorMouseEventFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorOpenContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"EditorOption","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorOption","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EditorOptions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorOptionsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"editorOverviewRulerBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorPagePosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorPart"},{"name":"EditorPinnedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorPointerEventFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorProgressIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"editorRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorRangeHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorRuler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorScopedQuickInputServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"EditorScroll_","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"EditorScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar"},{"name":"editorSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorService"},{"name":"EditorSimpleWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorSimpleWorker"},{"name":"EditorsObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorsObserver"},{"name":"EditorsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"EditorStateCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"EditorStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"editorSuggestWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetSelectedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"EditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorSymbolHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorSymbolHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewContext"},{"name":"EditorType","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"editorUnnecessaryCodeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorUnnecessaryCodeOpacity","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorWalkThroughAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough"},{"name":"EditorWalkThroughInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough"},{"name":"editorWarningBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorWhitespace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/linesLayout"},{"name":"editorWhitespaces","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetResizeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorWorkerClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorWorkerHost","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorWorkerServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorZoom","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorZoom"},{"name":"EditPreferenceWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"EditStack","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"EDOM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EEXIST","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EFAULT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EFBIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EHOSTUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EIDRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EILSEQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINPROGRESS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINVAL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EISCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EISDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"electron","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Electron","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"ElectronAcceleratorLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"ElectronMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/electron-main/electronMainService"},{"name":"ElectronService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/electron/electron-browser/electronService"},{"name":"ElectronURLListener","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/electron-main/electronUrlListener"},{"name":"ElectronWebviewBasedWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewElement"},{"name":"ElectronWebviewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewService"},{"name":"Element","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ElementsDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"ElementSizeObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/elementSizeObserver"},{"name":"ELOOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"else","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"EmbeddedCodeEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/embeddedCodeEditorWidget"},{"name":"EmbeddedDiffEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/embeddedCodeEditorWidget"},{"name":"embeddedEditorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"EMFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"emit","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"emit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"emitKeypressEvents","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"Emitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"Emitter","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"Emitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"emitWarning","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"EMLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EmmetEditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/emmet/browser/emmetActions"},{"name":"empty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"EmptyExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"EmptyPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"EmptyPaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"emptyProgressRunner","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"EmptyView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/emptyView"},{"name":"EMSGSIZE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EnableAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"EnableAllWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ENABLED_EXTENSIONS_STORAGE_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"enableDebug","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"EnabledExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"EnableDropDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableForWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableGloballyAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Enablement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"EnablementState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"enablePromiseAPIs","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ENAMETOOLONG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"encode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"encode","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"encode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"EncodedTokenizationSupport2Adapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"encodeSemanticTokensDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/semanticTokensDto"},{"name":"encodeStream","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"encodeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"encodeURI","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"encodeURIComponent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"encodeUTF8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"encodingExists","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"encodingExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"EncodingMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EncodingOracle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService"},{"name":"endianness","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"EndOfLine","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EndOfLine","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"EndOfLinePreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"EndOfLinePreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EndOfLineSequence","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"EndOfLineSequence","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"endsWith","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ENETDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENETRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENETUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"Engine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"ENGINE_METHOD_ALL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_CIPHERS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DIGESTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_ECDH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_ECDSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_NONE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_PKEY_ASN1_METHS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_PKEY_METHS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_RAND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_RSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_STORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOBUFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENODATA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENODEV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOENT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOEXEC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOLCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOMEM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOMSG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOPROTOOPT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSPC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSYS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTEMPTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTSUP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ensureFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ensureValidWordDefinition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"Entry","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"enum","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"env","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"env","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"env","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ENV_azurePrefix","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_http_proxy","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_https_proxy","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_iKey","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_profileQueryEndpoint","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"Envelope","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Envelope"},{"name":"Envelope","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"EnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"EnvironmentVariableCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariable"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EnvironmentVariableService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableService"},{"name":"ENXIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EOF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"EOL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"EOPNOTSUPP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EOVERFLOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPERM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTONOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTOTYPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"eq","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"equal","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"equals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"equals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"equalsIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ERANGE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EROFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"error","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Error","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Error","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"ErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ErrorEvent","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/errorTelemetry"},{"name":"errorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"errorHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ErrorHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ErrorScope","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ErrorTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/browser/errorTelemetry"},{"name":"ErrorTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/errorTelemetry"},{"name":"escape","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"escape","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"escape","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"escapeCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"escapeNonWindowsPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"escapeRegExpCharacters","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ESPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ESRCH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"etag","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ETAG_DISABLED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ETIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ETIMEDOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ETXTBSY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"eval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"EvalError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EvaluatableExpression","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EvaluatableExpression","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EvaluatableExpression","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"EvaluatableExpressionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"event","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Event","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Event","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"Event","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"EventBufferer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"EventData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/EventData"},{"name":"EventData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"EventEmitter","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EventEmitter","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"events"},{"name":"EventHelper","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"EventMultiplexer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"eventNames","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"eventNames","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"EventSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EventTarget","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EventType","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"EventType","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/touch"},{"name":"EWOULDBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"exception","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ExceptionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ExceptionData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionData"},{"name":"ExceptionData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ExceptionDetails","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionDetails"},{"name":"ExceptionDetails","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ExceptionWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"ExcludePatternInputWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget"},{"name":"ExcludeSettingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"EXDEV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ExeBasedRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations"},{"name":"exec","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"exec","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/sudo-prompt/index"},{"name":"execArgv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"execFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"execFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"execPath","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"execSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"ExecutableDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"ExecuteCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"ExecuteCommandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ExecuteCommandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"executionAsyncId","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"ExecutionEngine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"ExecutionEngine","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"exists","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"exists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"existsSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"exit","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-watchdog/index"},{"name":"exit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"exitCode","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"EXPAND_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ExpandAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ExpandNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"expectation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"ExperimentActionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"experimental","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/colorRegistry.releaseTest"},{"name":"ExperimentalPrompts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/browser/experimentalPrompt"},{"name":"ExperimentalRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/experimentalRecommendations"},{"name":"ExperimentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"ExperimentState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"ExplorerCompressedFirstFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressedFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressedLastFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressionDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerDecorationsProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerDecorationsProvider"},{"name":"ExplorerDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerFocusCondition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerFolderContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"ExplorerModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"ExplorerResourceCut","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceMoveableToTrash","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceNotReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerRootContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"explorerRootErrorEmitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerService"},{"name":"ExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerView"},{"name":"ExplorerViewletViewsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"ExplorerViewletVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"export","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"exportEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"exports","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Expression","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ExpressionContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"EXT_HOST_CREATION_DELAY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"extends","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"EXTENSION_BADGE_REMOTE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EXTENSION_BADGE_REMOTE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EXTENSION_IDENTIFIER_PATTERN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"EXTENSION_IDENTIFIER_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"EXTENSION_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"ExtensionAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionActivationProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress"},{"name":"ExtensionActivationTimes","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ExtensionActivationTimesBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"extensionButtonProminentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"extensionButtonProminentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"extensionButtonProminentHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionContainers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionData","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"ExtensionData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionDependencyChecker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker"},{"name":"ExtensionDescriptionRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDescriptionRegistry"},{"name":"ExtensionDropDownAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionEditor"},{"name":"ExtensionEditorDropDownAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionEnablementService"},{"name":"ExtensionGalleryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService"},{"name":"ExtensionHostDebugBroadcastChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebugIpc"},{"name":"ExtensionHostDebugChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebugIpc"},{"name":"ExtensionHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService"},{"name":"ExtensionHostLogFileName","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ExtensionHostMain","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostMain"},{"name":"ExtensionHostPersistentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ExtensionHostProcessManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProcessManager"},{"name":"ExtensionHostProcessWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionHost"},{"name":"ExtensionHostProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler"},{"name":"ExtensionHostProfileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService"},{"name":"ExtensionIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"ExtensionIdentifierWithVersion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"ExtensionKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ExtensionKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ExtensionManagementChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionManagementChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionManagementError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementService"},{"name":"ExtensionManagementServerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService"},{"name":"ExtensionManagementServerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/node/extensionManagementService"},{"name":"ExtensionMemento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostMemento"},{"name":"ExtensionMessageCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionPackCountWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"ExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionPointContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/extensionHost.contribution"},{"name":"ExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper.contribution"},{"name":"ExtensionPointUserDelta","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionRecommendationReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"ExtensionRecommendations","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendations"},{"name":"ExtensionRecommendationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService"},{"name":"ExtensionRegistryReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ExtensionRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionResourceLoaderService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService"},{"name":"extensionResultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"extensionResultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/api/extHostSearch.test"},{"name":"extensions","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/jsonschemas/common/jsonContributionRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"Extensions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/contributions"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"Extensions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/output"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/actions"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/editor"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"EXTENSIONS_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionsActivator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ExtensionsAutoProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler"},{"name":"ExtensionScanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionPoints"},{"name":"ExtensionScannerInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionPoints"},{"name":"ExtensionsChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ExtensionsConfigurationInitialContent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionsConfigurationSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionsConfigurationSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionScriptApis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionService"},{"name":"ExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionService"},{"name":"ExtensionsGridView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionsInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsInput"},{"name":"ExtensionsLabel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ExtensionsLifecycle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionLifecycle"},{"name":"ExtensionsListView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"ExtensionsManifestCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionsManifestCache"},{"name":"ExtensionsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionsRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/extensionsSync"},{"name":"ExtensionState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionStoragePaths","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostStoragePaths"},{"name":"ExtensionsTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionsViewletViewsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"ExtensionsViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"ExtensionsWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService"},{"name":"ExtensionTipsChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionTipsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionTipsService"},{"name":"ExtensionToolTipAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"ExtensionWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"external","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"External","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ExternalElementsDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"ExternalThemeTrieElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ExternalUriResolverContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/externalUriResolver"},{"name":"ExtHostApiCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ExtHostApiDeprecationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"ExtHostAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostAuthentication"},{"name":"ExtHostCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostClipboard"},{"name":"ExtHostCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"ExtHostComments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostComments"},{"name":"ExtHostCommentThread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostComments"},{"name":"ExtHostConfigProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"ExtHostConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"ExtHostContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"extHostCustomer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostCustomersRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostDebugConsole","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostDebugService"},{"name":"ExtHostDebugServiceBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDecorations"},{"name":"ExtHostDiagnostics","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDiagnostics"},{"name":"ExtHostDialogs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDialogs"},{"name":"ExtHostDocumentContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentContentProviders"},{"name":"ExtHostDocumentData","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"ExtHostDocumentLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"ExtHostDocuments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocuments"},{"name":"ExtHostDocumentsAndEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentsAndEditors"},{"name":"ExtHostDocumentSaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentSaveParticipant"},{"name":"ExtHostDownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostDownloadService"},{"name":"ExtHostEditorInsets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCodeInsets"},{"name":"ExtHostEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditors"},{"name":"ExtHostExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostExtensionService"},{"name":"ExtHostExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/worker/extHostExtensionService"},{"name":"ExtHostFileSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostFileSystem"},{"name":"ExtHostFileSystemEventService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostFileSystemEventService"},{"name":"ExtHostLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLabelService"},{"name":"ExtHostLanguageFeatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"ExtHostLanguages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguages"},{"name":"extHostLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"ExtHostLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostLogService"},{"name":"ExtHostLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/worker/extHostLogService"},{"name":"ExtHostMessageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostMessageService"},{"name":"extHostNamedCustomer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostNotebookController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookDocument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookOutputRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostOutputChannelBackedByFile","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostOutputService"},{"name":"ExtHostOutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"ExtHostOutputService2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostOutputService"},{"name":"ExtHostProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostProgress"},{"name":"ExtHostPseudoterminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"ExtHostPushOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"ExtHostQuickOpen","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostQuickOpen"},{"name":"ExtHostRpcService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRpcService"},{"name":"ExtHostSCM","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSCM"},{"name":"ExtHostSCMInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSCM"},{"name":"ExtHostSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"ExtHostStatusBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStatusBar"},{"name":"ExtHostStatusBarEntry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStatusBar"},{"name":"ExtHostStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStorage"},{"name":"ExtHostTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTask"},{"name":"ExtHostTaskBase","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ExtHostTerminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"ExtHostTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTerminalService"},{"name":"ExtHostTextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"ExtHostTextEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"ExtHostTheming","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTheming"},{"name":"ExtHostTimeline","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTimeline"},{"name":"ExtHostTreeViews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTreeViews"},{"name":"ExtHostTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"ExtHostTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTunnelService"},{"name":"ExtHostUrls","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUrls"},{"name":"ExtHostVariableResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWebviewEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWebviews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWindow"},{"name":"ExtHostWorkspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWorkspace"},{"name":"extname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"extname","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"extname","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"extract","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"ExtractError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"extractLocalHostUriMetaDataForPortMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/tunnel"},{"name":"extractRangeFromFilter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"extractResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"extractSearchQueryFromLines","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"extractSearchQueryFromModel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"F_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"fail","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"FailedExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"fakeServer","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"fakeServerWithClock","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"FakeXMLHttpRequest","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"FALLBACK_MAX_MEMORY_SIZE_MB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/files"},{"name":"false","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"FastDomNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/fastDomNode"},{"name":"fchmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fdatasync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fdatasyncSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"features","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"FeedbackDropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/feedback/browser/feedback"},{"name":"FeedbackStatusbarConribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem"},{"name":"fetch","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"FetchFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider"},{"name":"File","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"FILE_EDITOR_INPUT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FileBasedRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations"},{"name":"FileChangesEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FileChangeType","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"FileCopiedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/fileDialogService"},{"name":"FileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/fileDialogService"},{"name":"FileDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/editors/fileEditorInput"},{"name":"FileElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsModel"},{"name":"FileElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"FileElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"fileExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"FileFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileIconThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/fileIconThemeData"},{"name":"FileKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FileLocationKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"FileLoggerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/fileLogService"},{"name":"FileLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/fileLogService"},{"name":"FileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"FileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FileMatchOrFolderMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchOrFolderMatchWithResourceFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchOrMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"FileOperation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FilePreview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"FileQueryCacheState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/cacheState"},{"name":"FileReader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FileReferences","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"FileReferencesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"FileResourceMarkersRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"FILES_ASSOCIATIONS_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FILES_EXCLUDE_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FilesConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"FileSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/fileSearchManager"},{"name":"FileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/fileService"},{"name":"FilesExplorerFocusCondition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FilesExplorerFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FilesFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"FileSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FilesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/stateService"},{"name":"FileStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/browser/storageService"},{"name":"FileSystemError","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileSystemError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FileSystemProviderCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileSystemProviderCapabilities","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"FileSystemProviderError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileSystemProviderErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileThemeIcon","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"FileType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"fileURLToPath","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"FileUserDataProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userData/common/fileUserDataProvider"},{"name":"FileWalker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/win32/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nodejs/watcherService"},{"name":"fillResourceDataTransfers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"Filter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"FilteredMatchesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"FilterOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersFilterOptions"},{"name":"filtersAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"filterValidationDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"FilterViewPaneContainer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewsViewlet"},{"name":"finalHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"finally","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"FinalNewLineParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"find","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"FIND_IDS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"findBestWindowOrFolderForFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"FindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"findCredentials","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"findCredentials","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"FindDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findDecorations"},{"name":"findExecutable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalEnvironment"},{"name":"findExpressionInStackFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugHover"},{"name":"findFirstInSorted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"findFreePort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"findFreePortFaster","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"FindInFilesActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FindInFilesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FindInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInput"},{"name":"FindMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"findMatchingThemeRule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMHelper"},{"name":"FindModelBoundToEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"findNodeAtLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"findNodeAtOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"FindOptionOverride","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findState"},{"name":"FindOptionsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findOptionsWidget"},{"name":"FindOrReplaceInFilesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"findParentWithClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"findPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"findPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"FindReplaceState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findState"},{"name":"findRules","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"FindStartFocusAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"findValidPasteFileTarget","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"FindWidgetViewZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"findWindowOnExtensionDevelopmentPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"findWindowOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"findWindowOnWorkspaceOrFolderUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"finished","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"fips","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"FIRST_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"firstIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"FirstMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"firstNonWhitespaceIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"firstOrDefault","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"firstSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"FixAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"fixAllCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"fixCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"fixDriveC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"fixInsert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"fixNewline","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"fixPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"fixRegexNewline","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"flatten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Float32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Float64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FloatingClickWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorWidgets"},{"name":"focus","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"FOCUS_FIRST_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_LAST_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_NEXT_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_PREVIOUS_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_REPL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"FocusAboveGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusActiveEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FocusActiveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusBelowGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"focusBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"focusedCellIndicator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"FocusedViewContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"FocusEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FocusFilesExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FocusFirstGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusLastGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusLeftGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusNavigationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FocusNextGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusNextInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusNextSearchResultAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusPreviousGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusPreviousInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusPreviousSearchResultAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusQueryEditorWidgetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"FocusQueryEditorWidgetCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"FocusRightGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusSearchFromResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"focusSearchListCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusSearchListCommandID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FocusSessionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"FocusSessionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActionViewItems"},{"name":"foldBackgroundBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/folding"},{"name":"FOLDER_CONFIG_FOLDER_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"FolderConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"FolderFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FolderMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FolderMatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"FolderMatchWithResource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FolderSettingsActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"FolderSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"folderSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"foldersToIncludeGlobs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"foldersToRgExcludeGlobs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"FolderThemeIcon","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"FoldingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/folding"},{"name":"FoldingDecorationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingDecorations"},{"name":"FoldingModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"FoldingRange","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FoldingRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FoldingRange","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"FoldingRangeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FoldingRangeKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"FoldingRangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FoldingRangeKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"FoldingRangeProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"FoldingRegion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"FoldingRegions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"FollowerLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"FontInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/fontInfo"},{"name":"FontStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"fontStylePattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"for","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"forEach","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"foreground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ForeignElementType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"fork","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"fork","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"format","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"format","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"format","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"format","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"formatDocumentRangeWithProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentRangeWithSelectedProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentWithProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentWithSelectedProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"formatPII","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"FormatString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"FormattingConflicts","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"FormattingEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/formattingEdit"},{"name":"FormattingMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatWithOptions","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"FormData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FORMERR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"forwardedPortsViewEnabled","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"frameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"frames","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FrankensteinMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/abstractMode"},{"name":"freemem","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"fromBuffer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromFd","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromMap","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"fromNow","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/date"},{"name":"fromRandomAccessReader","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromRangeOrRangeWithMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"fstat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fstatSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"FSWatcher","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/chokidar/types/index"},{"name":"fsync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fsyncSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ftruncate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ftruncateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"function","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Function","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"futimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"futimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fuzzyContains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"fuzzyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"FuzzyScore","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"fuzzyScoreGraceful","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"fuzzyScoreGracefulAggressive","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"GainNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Gamepad","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadButton","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadHapticActuator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadPose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"generateIndent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentUtils"},{"name":"generateKeyPair","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"generateKeyPairSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"generateRandomChunkWithLF","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateRandomEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateRandomPipeName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"generateRandomReplaces","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateSequentialInserts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateTokensCSSForColorMap","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"generateUuid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uuid"},{"name":"Gesture","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/touch"},{"name":"get","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"get","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"getAbsoluteGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"getActiveEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"getActiveNotebookEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"getActiveTextEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"getActiveWebviewEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"getAllMethodNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"getAllPropertyNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"getAppDataPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/paths"},{"name":"getBaseLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"getBasenameTerms","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getBlinkMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getBreakpointMessageAndClassName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"getCharContainingOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getCharIndex","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"getCiphers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getCiphers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"getClientArea","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getCodeActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"getCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"getCodeForKeyCode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/keyboardEvent"},{"name":"getCodeLensData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelens"},{"name":"getColorPresentations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/color"},{"name":"getColorRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"getColors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/color"},{"name":"getComparisonKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"getComputedStyle","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getComputedStyle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getConfigurationKeys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getConfigurationValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getContentHeight","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getContentWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getContext","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerView"},{"name":"getContext","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"getContextForContributedActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"getContextMenuActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"getCorrelationContext","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"getCPUUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getCreationTime","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getCurrentActivationRecord","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"getCurrentKeyboardLayout","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"getCurves","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getCwd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDeclarationsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getDefaultIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getDefaultSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getDefaultShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDefaultShellArgs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDefaultUserDataPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/paths"},{"name":"getDefaultValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"getDefaultValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getDefinitionsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getDelayedChannel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"getDiffieHellman","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getDisallowedIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getDispatchConfig","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/dispatchConfig"},{"name":"getDocumentFormattingEditsUntilResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getDocumentRangeFormattingEditsUntilResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getDocumentSymbols","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/documentSymbols"},{"name":"getDomainsOfRemotes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getDomNodePagePosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getDuration","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEditOperation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCommand"},{"name":"getEditorPartOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"getegid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getElementsByTagName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getEmptyExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getEnabledCategories","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"trace_events"},{"name":"getEncodedLanguageId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"getEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEntry","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"getErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"geteuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getExactExpressionStartAndEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getExcludes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"getExpandedBodySize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"getExtensionHostDebugSession","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getExtensionKind","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"getExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"getExtraColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils"},{"name":"getFileNamesMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"getFirstFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"getGalleryExtensionId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getGalleryExtensionTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getgid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getGraphemeBreakType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getgroups","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getHashedRemotesFromConfig","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getHashes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getHeapCodeStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapSnapshot","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapSpaceStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapStatistics","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getHover","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/getHover"},{"name":"getIconClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputUtils"},{"name":"getIconClasses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"getIconRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"getIdAndVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"getIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"getImplementationsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getInstalledExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"getInvalidTypeError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesValidation"},{"name":"getIOCounters","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getIssueReporterStyles","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueService"},{"name":"getKeyboardLayoutId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"getKeyMap","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"getLangEnvVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getLanguages","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"getLargestChildWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getLastActiveWindow","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"getLeadingWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getLineEndOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"getLineStartOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"getLinks","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"getLocalExtensionTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getLogLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"getMac","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/macAddress"},{"name":"getMachineId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/id"},{"name":"getMachineInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"getMainProcessParentEnv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalEnvironment"},{"name":"getMaliciousExtensionsSet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getManifest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementUtil"},{"name":"getMapForWordSeparators","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"getMatchedCSSRules","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getMaxListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"getMaxListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getMediaMime","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"getMenuBarVisibility","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"getMigratedSettingValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getModelMarkers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getMultiSelectedEditorContexts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"getMultiSelectedResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getNextCodePoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getNextTickChannel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"getNLines","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getNLSConfiguration","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/languagePacks"},{"name":"getNodeColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"getNodeIsInOverviewRuler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"getNodePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNodeType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNodeValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNonWhitespacePrefix","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsService"},{"name":"getOccurrencesAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordHighlighter/wordHighlighter"},{"name":"getOnTypeFormattingEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getOnTypeRenameRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"getOpenEditorsViewMultiSelection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getOrDefault","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"getOrMakeSearchEditorInput","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput"},{"name":"getOrSet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"getOuterEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"getOutOfWorkspaceEditorResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"getOutputSimpleEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform"},{"name":"getPackedSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getParseErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonErrorMessages"},{"name":"getPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"getPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"getPathFromAmdModule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/amd"},{"name":"getPathLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"getPathTerms","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getPixelRatio","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getPlatformTextDecoder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"getPriority","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"getProcessCpuUsage","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProcessList","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProcessMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getProcessTree","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProxyAgent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/node/proxy"},{"name":"getQuickNavigateHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"getRandomElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"getRandomEOLSequence","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomInt","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomTestPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/testUtils"},{"name":"getRealAndSyntheticDocumentFormattersOrdered","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getReferencesAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getReindentEditOperations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"getRelativeLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"getRemoteAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"getRemoteName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"getRemotes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getResizesObserver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/sizeObserver"},{"name":"getResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"getResourceForCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"getSCMResourceContextKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/menus"},{"name":"getScopes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"getSearchView","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"getSelection","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getSelectionKeyboardEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"getSelectionSearchString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"getServers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"getServiceMachineId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/serviceMachineId/common/serviceMachineId"},{"name":"getSettingsTargetName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"getShadowRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getShellEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/shellEnv"},{"name":"getSimpleCodeEditorWidgetOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions"},{"name":"getSimpleEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions"},{"name":"getSimpleWorkspaceLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/label/common/label"},{"name":"getSingletonServiceDescriptors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/extensions"},{"name":"getSnippetSuggestSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"getSpaceCnt","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentUtils"},{"name":"getStackFrameThreadAndSessionToFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugService"},{"name":"getStateLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"getStdinFilePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"getStoredWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"getStringIdentifierForProxy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"GetStringRegKey","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/vscode-windows-registry/index"},{"name":"getSuggestionComparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"getSyncResourceFromLocalPreview","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getSystemMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getSystemShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"getSystemVersion","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getTemplates","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskTemplates"},{"name":"getTerminalShellConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalConfiguration"},{"name":"getThemeTypeSelector","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"getTimeSinceLastZoomLevelChanged","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getTitleBarStyle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"getTokenClassificationRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"getTopLeftOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalHeight","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalScrollWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTypeDefinitionsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getUnpackedSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"getUriFromAmdModule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/amd"},{"name":"getUriFromSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"getUserDataSyncStore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getVisbileViewContextKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"getVisibleAndSorted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getVisibleState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"getWebviewContentMimeType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/mimeTypes"},{"name":"getWellFormedFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"getWindowsBuildNumber","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"getWindowsShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"getWindowsStateStoreData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsStateStorage"},{"name":"getWordAtText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"getWordDefinitionFor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"getWorkerBootstrapUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/worker/defaultWorkerFactory"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspaces"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test"},{"name":"getWorkspaceSymbols","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"getXtermLineContent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"getZoomFactor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"global","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GLOBAL_ACTIVITY_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/activity"},{"name":"GlobalActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"globalAgent","kind":"let","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"globalAgent","kind":"let","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"GlobalCompareResourcesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"GlobalEditorMouseMoveMonitor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"GlobalExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService"},{"name":"globalGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"GlobalMouseMoveMonitor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/globalMouseMoveMonitor"},{"name":"GlobalNewUntitledFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"GlobalRemoveRootFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"globals","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"globalShortcut","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"GlobalStateSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/globalStateSync"},{"name":"GlobalStorageDatabaseChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageIpc"},{"name":"GlobalStorageDatabaseChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageIpc"},{"name":"GlobalStyleSheet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"globalThis","kind":"module","kindModifiers":"","sortText":"4"},{"name":"GlobPattern","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"GlyphHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverWidgets"},{"name":"GlyphMarginOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"GOTO_NEXT_CHANGE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"GOTO_PREVIOUS_CHANGE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"GotoDefinitionAtPositionEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess"},{"name":"GoToLineNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"GotoLineQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess"},{"name":"GotoSymbolAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess"},{"name":"GotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess"},{"name":"gracefulify","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/graceful-fs/index"},{"name":"grammarsExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMGrammars"},{"name":"Graph","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/graph"},{"name":"GraphemeBreakType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Grid","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"GridView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"GridViewSizing","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"group","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"groupBy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"groupBy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"groupByExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"GroupChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"groupCollapsed","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"GroupDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"groupEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"groupIntersect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"GroupLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupOrientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupsArrangement","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"gt","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"gte","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"gtr","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"guessIndentation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/indentationGuesser"},{"name":"guessMimeTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"gunzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gunzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"handleANSIOutput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"handleANSIOutput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"Handler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"handleVetos","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"hang","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"hasChildProcesses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"hasClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"hasFileFolderCopyCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hasFileReadStreamCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"Hash","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"HashChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Hasher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"hashPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/node/backupFileService"},{"name":"hasOpenReadWriteCloseCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hasParentWithClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"hasReadWriteCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"HasSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"hasSiblingFn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"hasSiblingPromiseFn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"hasStdinWithoutTty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"hasTextDecoder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"hasToIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"hasTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"hasUncaughtExceptionCaptureCallback","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"hasWorkspaceFileExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"hc_black","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"HC_THEME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"Headers","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HelpQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/helpQuickAccess"},{"name":"HiddenAreasRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"HiddenRangeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/hiddenRangeModel"},{"name":"hide","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"HIDE_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"HIDE_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"HideNotificationsCenterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"HideWebViewEditorFindCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"HideWelcomeOverlayAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay"},{"name":"HIGH_CONTRAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"HighlightedLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/highlightedlabel/highlightedLabel"},{"name":"HighlightMatchesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"history","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"History","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HistoryInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"HistoryNavigationEnablementContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"HistoryNavigationWidgetContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"HistoryNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/history"},{"name":"HistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/browser/history"},{"name":"HitTestContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"HIVES","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCC","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCR","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCU","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKLM","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKU","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"Hmac","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"homedir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"HorizontalPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"HorizontalRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"HorizontalScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/horizontalScrollbar"},{"name":"horizontalScrollingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"HostExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"hostname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"HotExitConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"Hover","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Hover","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Hover","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"HoverOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverOperation"},{"name":"HoverProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"HoverStartMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverOperation"},{"name":"hrtime","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"HSLA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"HSVA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"HTMLAllCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAnchorElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAppletElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAreaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAudioElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBaseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBaseFontElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBodyElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLButtonElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLCanvasElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDataElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDataListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDetailsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDialogElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDirectoryElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDivElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDocument","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLEmbedElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFieldSetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFontElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFormControlsCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFormElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFrameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFrameSetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHeadElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHeadingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHtmlElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLIFrameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLInputElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLabelElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLegendElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLIElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLinkElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMapElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMarqueeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMediaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMenuElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMetaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMeterElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLModElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLObjectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptGroupElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptionsCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOutputElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLParagraphElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLParamElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLPictureElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLPreElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLProgressElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLQuoteElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLScriptElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSelectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSlotElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSourceElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSpanElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLStyleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableCaptionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableColElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableDataCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableHeaderCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableRowElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableSectionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTemplateElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTextAreaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTimeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTitleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTrackElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLUListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLUnknownElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLVideoElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Http2ServerRequest","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"Http2ServerResponse","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"HttpProxyAgent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/http-proxy-agent/index"},{"name":"IAccessibilityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"IActivityBarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activityBar/browser/activityBarService"},{"name":"IActivityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"IAuthenticationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/browser/authenticationService"},{"name":"IUserDataSyncAccountService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount"},{"name":"IBackupFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backup"},{"name":"IBackupMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backup"},{"name":"IBreadcrumbsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"IBulkEditService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/bulkEditService"},{"name":"ICACLS_PATH","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"IClipboardService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/clipboard/common/clipboardService"},{"name":"ICodeEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorService"},{"name":"ICodeLensCache","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codeLensCache"},{"name":"ICommandService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"ICommentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentService"},{"name":"IconBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"IConfigurationResolverService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolver"},{"name":"IConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"iconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"IconLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/iconLabel/iconLabel"},{"name":"iconsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"IContextKeyService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"IContextMenuService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextView"},{"name":"IContextViewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextView"},{"name":"ICredentialsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/credentials/common/credentials"},{"name":"ICredentialsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/common/credentials"},{"name":"ICustomEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/common/driver"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"ID_EDITOR_WORKER_SERVICE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerService"},{"name":"ID_INDENT_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"ID_INIT_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/intializingRangeProvider"},{"name":"ID_SYNTAX_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"IDBCursor","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBCursorWithValue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBDatabase","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBFactory","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBIndex","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBKeyRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBObjectStore","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBOpenDBRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBTransaction","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBVersionChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDebugHelperService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"IDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"IDecorationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/decorations/browser/decorations"},{"name":"IdentityCoordinatesConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"IdentityLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"IdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"IdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"IdGenerator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/idGenerator"},{"name":"IDiagnosticsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"IDialogMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-main/dialogs"},{"name":"IDialogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"IdleValue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IdObject","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"IDownloadService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/download"},{"name":"idPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"IDriver","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/common/driver"},{"name":"IEditorGroupsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"IEditorProgressService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"IEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"IEditorWorkerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerService"},{"name":"IElectronMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/electron-main/electronMainService"},{"name":"IElectronService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/node/electron"},{"name":"IEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/common/environment"},{"name":"IEnvironmentVariableService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariable"},{"name":"IExperimentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"IExplorerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"IExtensionGalleryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionHostDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebug"},{"name":"IExtensionHostProfileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"IExtensionManagementServerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IExtensionManagementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionRecommendationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IExtensionResourceLoaderService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader"},{"name":"IExtensionService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"IExtensionStoragePaths","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStoragePaths"},{"name":"IExtensionsWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"IExtensionTipsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionUrlHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionUrlHandler"},{"name":"IExternalTerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/common/externalTerminal"},{"name":"IExtHostApiDeprecationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"IExtHostCommands","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"IExtHostConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"IExtHostDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"IExtHostDecorations","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDecorations"},{"name":"IExtHostDocumentsAndEditors","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentsAndEditors"},{"name":"IExtHostExtensionService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"IExtHostInitDataService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostInitDataService"},{"name":"IExtHostOutputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"IExtHostRpcService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRpcService"},{"name":"IExtHostSearch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"IExtHostStorage","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStorage"},{"name":"IExtHostTask","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"IExtHostTerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"IExtHostTimeline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTimeline"},{"name":"IExtHostTunnelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"IExtHostWorkspace","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWorkspace"},{"name":"if","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"ifError","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"IFileDialogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"IFilesConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"IFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"IframeUtils","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/iframe"},{"name":"IFrameWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewElement"},{"name":"IGlobalExtensionEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ignoreBracketsInToken","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"ignoreErrors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IgnoreExtensionRecommendationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"IHistoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/common/history"},{"name":"IHostService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/browser/host"},{"name":"IHostUtils","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"IInstantiationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"IIntegrityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/common/integrity"},{"name":"IIRFilterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/node/issue"},{"name":"IJSONEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"IKeybindingEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingEditing"},{"name":"IKeybindingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybinding"},{"name":"IKeymapService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"ILabelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/label/common/label"},{"name":"ILaunchMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"ILayoutService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/layout/browser/layoutService"},{"name":"ILifecycleMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"ILifecycleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"IListService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"illegalArgument","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"illegalState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ILocalizationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"ILoggerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ILogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"Image","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IMAGE_PREVIEW_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ImageBitmap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ImageBitmapRenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ImageData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IMainProcessService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/mainProcessService"},{"name":"IMarkerData","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"IMarkerDecorationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/markersDecorationService"},{"name":"IMarkerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"IMarkersWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"IMenubarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"IMenuService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ImmortalReference","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"IMMUTABLE_CODE_TO_KEY_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"IMMUTABLE_KEY_CODE_TO_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"IModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelService"},{"name":"IModeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modeService"},{"name":"impactsEditorPartOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"ImplementationProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"implements","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"import","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"importEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"importScripts","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"in","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"inAppPurchase","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"inc","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"IncomingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"IncomingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"IncreaseSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"IncreaseViewSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"incrementFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"IndentAction","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"IndentAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfiguration"},{"name":"IndentAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"IndentationToSpacesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToSpacesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToTabsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToTabsCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/indentRules"},{"name":"IndentGuidesOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/indentGuides/indentGuides"},{"name":"IndentLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"IndentRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"IndentRulesSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/indentRules"},{"name":"IndentUsingSpaces","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentUsingTabs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"index","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"indexedDB","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"INDEXEDDB_LOGS_OBJECT_STORE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"INDEXEDDB_VSCODE_DB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"IndexedDBLogProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"indexOfPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"IndexTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTree"},{"name":"IndexTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"InEditorZenModeContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"Infinity","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"inflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateRawSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"info","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Information","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"inherits","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"INITIAL","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"initialize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.worker"},{"name":"InitializingRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/intializingRangeProvider"},{"name":"InlineDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"InlineDecorationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"InlineDiffMargin","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/inlineDiffMargin"},{"name":"InMemoryBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"InMemoryFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/inMemoryFilesystemProvider"},{"name":"InMemoryLogProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/common/inMemoryLogProvider"},{"name":"InMemoryStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"InMemoryStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"InMemoryTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"innerHeight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"innerWidth","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"INotebookService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"INotificationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"InPlaceReplaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/inPlaceReplace/inPlaceReplaceCommand"},{"name":"inputActiveOptionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputActiveOptionBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"InputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"InputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"InputDeviceInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"InputEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"InputFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"InputFocusedContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"inputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputPlaceholderForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputsSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolverSchema"},{"name":"inputValidationErrorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationErrorBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"InputValidationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"inputValidationWarningBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationWarningBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inQuickPickContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"InQuickPickContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"inQuickPickContextKeyValue","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"inRecentFilesPickerContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"insane","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/insane/insane"},{"name":"InSearchEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"insert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"InsertCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"InsertCodeCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"InsertCursorAbove","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"InsertCursorBelow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"InsertLineAfterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"InsertLineBeforeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"InsertMarkdownCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"inspect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"INSPECT_MAX_BYTES","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"InspectTokensNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"INSTALL_ERROR_INCOMPATIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"INSTALL_ERROR_MALICIOUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"INSTALL_ERROR_NOT_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"InstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallAnotherVersionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallCountWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"InstallExtensionQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess"},{"name":"InstallExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallInOtherServerAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallLocalExtensionsInRemoteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallOperation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"InstallRecommendedExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallSpecificVersionOfExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallVSIXAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallWorkspaceRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"instanceof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"instanceStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"InstantiationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiationService"},{"name":"Int16Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Int32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Int8Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IntegrityServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/node/integrityService"},{"name":"interface","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Interface","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"INTERNAL_CONSOLE_OPTIONS_SCHEMA","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"InternalEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorAction"},{"name":"InternalModelContentChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"IntersectionObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IntersectionObserverEntry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"intersects","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"intervalCompare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"IntervalNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"IntervalTimer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IntervalTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"Intl","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"IOpenerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"IOutputChannelModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"IOutputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"IPadShowKeyboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard"},{"name":"IPanelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/panel/common/panelService"},{"name":"IPathService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/common/pathService"},{"name":"IPCClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ipcMain","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ipcRenderer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"IPCServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"IPeekViewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"IPreferencesSearchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"IPreferencesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"IProductService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/product/common/productService"},{"name":"IProgressService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"IQuickInputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickInput"},{"name":"IRemoteAgentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentService"},{"name":"IRemoteAuthorityResolverService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"IRemoteExplorerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"IReplaceService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/replace"},{"name":"IRequestService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"IResourceIdentityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/common/resourceIdentityService"},{"name":"IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"isAbsolute","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"isAbsolute","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"isAbsolutePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isActive","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-mutex/index"},{"name":"isAncestor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isArray","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isatty","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"isBasicASCII","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isBoolean","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isBoolean","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isBuffer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IsCenteredLayoutContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isChrome","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"ISCMService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"isCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isCompositeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isCompressedFolderName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"isConfigurationOverrides","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"isContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"isDate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isDebuggerMainContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isDecorationOptionsArr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"isDeepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IsDevelopmentContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isDiffEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isDiffEditorConfigurationKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"isDirtyDiffVisible","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"isDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"ISearchHistoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchHistoryService"},{"name":"ISearchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"ISearchWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"isEdge","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isEdgeWebView","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isEditorConfigurationKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"isEditorInputWithOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isElevated","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-is-elevated/index"},{"name":"isEmojiImprecise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isEmptyMarkdownString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"isEmptyObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isEngineValid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"isEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isEqualAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isEqualOrParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isEqualOrParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isError","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isErrorWithActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorsWithActions"},{"name":"isExcludeSetting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"isFalsyOrEmpty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"isFalsyOrWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isFileMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isFilePatternMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isFileToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"isFilterResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"isFinite","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"isFirefox","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isFolderToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"isFullscreen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"IsFullscreenContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"isFullWidthCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isFunction","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isFunction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isFuzzyAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isFuzzyActionArr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isGridBranchNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"isGridBranchNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"ISharedProcessMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-main/sharedProcessMainService"},{"name":"ISharedProcessService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/sharedProcessService"},{"name":"isHighSurrogate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isHTMLElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isIAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isIExtensionIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"isIExtensionIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ISignService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/common/sign"},{"name":"isIMenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"isInDOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isInShadowDOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isIOS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isIP","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isIPad","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isIPv4","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isIPv6","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isISOKeyboard","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"isISubmenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"isKeymapExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"isLanguagePackExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"isLinux","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsLinuxContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isLittleEndian","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isLocationLink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"isLowerAsciiLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isLowSurrogate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"IsMacContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isMacintosh","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsMacNativeContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isMainFrame","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"isMainThread","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"isMarkdownString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"isMaster","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"isMenubarMenuItemAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemSubmenu","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemUriAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMessageOfType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"isMultilineRegexSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"isNamedProblemMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"isNaN","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"isNative","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"ISnippetsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippets.contribution"},{"name":"isNonEmptyArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"isNotificationViewItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"isNull","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNullOrUndefined","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNullRange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"isNumber","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNumber","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isObject","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isOpera","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"isPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isPatternInWord","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"isPrimitive","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isProgressMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isPromiseCanceledError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"isQuote","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"isRawFileWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRawUriWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isReadableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"isRecentFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRecentFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRecentWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRegExp","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isRelativePattern","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"isRemoteConsoleLog","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"isRemoteDiagnosticError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/common/diagnostics"},{"name":"isRootOrDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isRootUser","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isSafari","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isSCMRepository","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSCMResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSCMResourceGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSearchViewFocused","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"isSecureContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"isSelectionRangeChangeEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"isSelectionSingleChangeEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"isSemanticColoringEnabled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"isSerializedEditorGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/editorGroup"},{"name":"isSerializedFileMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSerializedSearchComplete","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSerializedSearchSuccess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSessionAttach","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isShadowRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isSingleFolderWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isSingleFolderWorkspaceInitializationPayload","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isStandalone","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isStatusbarInDebugMode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"isStoredWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isString","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isStringArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isSuccess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"IssueMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/electron-main/issueMainService"},{"name":"IssueReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterMain"},{"name":"IssueReporterModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterModel"},{"name":"issueReporterPage","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterPage"},{"name":"IssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/issue/electron-browser/issueService"},{"name":"IssueType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/node/issue"},{"name":"isSymbol","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IStandaloneThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/standaloneThemeService"},{"name":"IStateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/state"},{"name":"IStaticExtensionsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/staticExtensions"},{"name":"IStatusbarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/statusbar/common/statusbar"},{"name":"isTextEditorPane","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isThemeColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"isThenable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IStorageKeysSyncRegistryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/storageKeys"},{"name":"IStorageMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageMainService"},{"name":"IStorageService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"ISuggestDataDtoField","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"ISuggestMemoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"ISuggestResultDtoField","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"isUNC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isUndefined","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isUndefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isUndefinedOrNull","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isUnspecific","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"isUntitledWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isUpper","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"isUpperAsciiLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isURLDomainTrusted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsValidator"},{"name":"isUTFEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"isUUID","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uuid"},{"name":"isValidBasename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isValidExtensionVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isValidLocalization","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"isValidMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"isValidVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isValidVersionStr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isVersionValid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isWeb","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsWebContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isWebKit","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isWebkitWebView","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isWindows","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsWindowsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isWindowsDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isWorker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"isWorkspaceBackupInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backup"},{"name":"isWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"isWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isWorkspaceToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"ISymbolNavigationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/symbolNavigation"},{"name":"it","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ITaskService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskService"},{"name":"ITelemetryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"ItemActivation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"Iterable","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/iterator"},{"name":"ITerminalInstanceService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"ITerminalNativeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ITerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"ITextFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"ITextMateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"ITextModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/resolverService"},{"name":"ITextResourceConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationService"},{"name":"ITextResourcePropertiesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationService"},{"name":"IThemeMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/electron-main/themeMainService"},{"name":"IThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ITimelineService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"ITimerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/timer/electron-browser/timerService"},{"name":"ITitleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/title/common/titleService"},{"name":"ITunnelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/tunnel"},{"name":"IUndoRedoService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedo"},{"name":"IUntitledTextEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorService"},{"name":"IUpdateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"IURITransformerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUriTransformerService"},{"name":"IURLService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/url"},{"name":"IUserDataAutoSyncService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncBackupStoreService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncLogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncStoreService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncUtilService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IViewDescriptorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"IViewletService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/viewlet/browser/viewlet"},{"name":"IViewsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"IWebIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/browser/issueService"},{"name":"IWebviewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"IWebviewWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"IWindowsMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windows"},{"name":"IWorkbenchEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/common/environmentService"},{"name":"IWorkbenchExtensionEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IWorkbenchIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issue"},{"name":"IWorkbenchLayoutService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"IWorkbenchThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"IWorkingCopyFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileService"},{"name":"IWorkingCopyService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"IWorkspace","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspaceContextService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspaceEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/common/workspaceEditing"},{"name":"IWorkspaceFolder","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspacesHistoryMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService"},{"name":"IWorkspacesMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"IWorkspacesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"IWorkspaceTagsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/common/workspaceTags"},{"name":"javascriptOnEnterRules","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules"},{"name":"join","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"join","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"join","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"JoinAllGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"JoinLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"joinPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"JoinTwoGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"JSON","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"JSONEditingError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"JSONEditingErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"JSONEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditingService"},{"name":"JsonSchemaVersion","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"JsonSchemaVersion","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"JSONValidationExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/jsonValidationExtensionPoint"},{"name":"JUMP_TO_CURSOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"KEEP_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_NOT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_IS_OPEN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_TEXT_NOT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"KEYBINDING_ENTRY_TEMPLATE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/keybindingsEditorModel"},{"name":"KeybindingEditorDecorationsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"KeybindingIO","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingIO"},{"name":"KeybindingLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/keybindingLabel/keybindingLabel"},{"name":"KeybindingParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingParser"},{"name":"KeybindingResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingResolver"},{"name":"KEYBINDINGS_EDITOR_CLEAR_INPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_COPY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_DEFINE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_REMOVE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_RESET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KeybindingsEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingEditing"},{"name":"KeybindingsEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditor"},{"name":"KeybindingsEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"KeybindingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/keybindingsEditorModel"},{"name":"KeybindingSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybinding"},{"name":"KeybindingsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"KeybindingsSearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"KeybindingsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/keybindingsSync"},{"name":"KeybindingWeight","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"KeybindingWidgetRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"KEYBOARD_LAYOUT_OPEN_PICKER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KeyboardEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"KeyboardLayoutContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution"},{"name":"KeyboardLayoutPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker"},{"name":"KeyboardLayoutPickerContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker"},{"name":"KeyboardMapperFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService"},{"name":"keyboardNavigationSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"KeyboardSupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/canIUse"},{"name":"KeyChord","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"KeyCode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"KeyCodeUtils","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyedTaskIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"KeyframeEffect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"keyFromOverrideIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"KeymapExtensions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"KeymapInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"KeymapRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/keymapRecommendations"},{"name":"KeyMod","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyMod","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneBase"},{"name":"KeyMod","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"KeyObject","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"keyof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"keys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"KeytarCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/credentials/node/credentialsService"},{"name":"KeytarCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/node/credentialsService"},{"name":"KeyValueLogProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/common/keyValueLogProvider"},{"name":"kill","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"KillTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"kMaxLength","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"knownAcronyms","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"KnownSnippetVariableNames","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"knownTermMappings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"kStringMaxLength","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"Label","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"LabelContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/remote.contribution"},{"name":"LabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/label/common/labelService"},{"name":"language","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Language","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"LanguageConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageConfigurationFileHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint"},{"name":"LanguageConfigurationRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageConfigurationRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageFeatureRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageFeatureRegistry"},{"name":"LanguageId","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LanguageIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LanguagePackCachedDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner"},{"name":"languages","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"languages","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"LanguageSelector","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"languagesExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/mode/common/workbenchModeService"},{"name":"LanguagesRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/languagesRegistry"},{"name":"LanguageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"LargeFileOptimizationsWarner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/largeFileOptimizations"},{"name":"LAST_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"lastIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"lastNonWhitespaceIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"lastSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"LAUNCH_CONFIGURATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"LaunchMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"launchSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"launchSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"layout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"Layout","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/layout"},{"name":"LAYOUT_EDITOR_GROUPS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"LayoutAnchorPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"LayoutController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"LayoutData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget"},{"name":"LayoutPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"LazilyResolvedWebviewEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"Lazy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lazy"},{"name":"lazyEnv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"LazyOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"LazyPromise","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/lazyPromise"},{"name":"lchmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"LcsDiff","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"lcut","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"leftest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"leftRotate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"LEGACY_CONSOLE_MODE_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"legacy_ENV_iKey","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"length","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"let","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"lexer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Lexer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"LifecycleMainPhase","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"LifecycleMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"LifecyclePhase","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"LifecyclePhaseToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"LIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"LightBulbWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/lightBulbWidget"},{"name":"lighten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Limiter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"LineBreakData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"LineCommentCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/lineCommentCommand"},{"name":"LineContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/completionModel"},{"name":"LineContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"LineDecoder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/decoder"},{"name":"LineDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"LineDecorationsNormalizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"LineNumbersOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers"},{"name":"LinePartMetadata","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"LineProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"LineRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"LinesDecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations"},{"name":"LinesLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/linesLayout"},{"name":"LineStarts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"LineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/lineTokens"},{"name":"LineTokens2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"LineVisibleRanges","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"link","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Link","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"Link","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/browser/link"},{"name":"LINK_INTERCEPT_THRESHOLD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"LinkComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"LinkDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/links"},{"name":"LinkDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/linkDetector"},{"name":"LinkedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedList"},{"name":"LinkedMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"LinkedText","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedText"},{"name":"LinkProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LinksList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"linkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"linuxDistro","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"LinuxDistro","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"LinuxExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"LinuxUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.linux"},{"name":"List","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"listActiveSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listActiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listDeemphasizedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ListDragOverEffect","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"ListDragOverReactions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"listDropBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listenerCount","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"listenerCount","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"listenerCount","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"listeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"listeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ListeningStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ListError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"listErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetNoMatchesOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFocusBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFocusForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHoverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveFocusBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInvalidItemForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listProcesses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ps"},{"name":"ListResourceNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"ListService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"ListSettingListModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ListSettingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ListView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"listWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"loadavg","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"LOADED_SCRIPTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"LoadedScriptsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/loadedScriptsView"},{"name":"LoaderEvent","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"LoaderEventType","kind":"enum","kindModifiers":"declare","sortText":"4"},{"name":"LOADIPHLPAPI","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"loadLocalResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"loadWASM","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"LOCAL_MACHINE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"locale","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"LocalInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"LocalizationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/node/localizations"},{"name":"LocalizationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/localizations/electron-browser/localizationsService"},{"name":"LocalizationWorkbenchContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/localizations.contribution"},{"name":"localize","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/nls"},{"name":"localize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/nls.mock"},{"name":"localizeManifest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionNls"},{"name":"LocalSearchProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"LocalSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchService"},{"name":"LocalSelectionTransfer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"localStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"location","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"location","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Location","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Location","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Location","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"locationbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"log","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"log","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"log","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"log","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"log","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"LOG_MIME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LOG_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LOG_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LogAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"LogContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputServices"},{"name":"Logger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionPoints"},{"name":"LoggerChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"LoggerChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"LoggerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/loggerService"},{"name":"LogLevel","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"LogLevel","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"LogLevel","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"LogLevel","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"LogLevel","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"logOnceWebWorkerWarning","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"logRemoteEntry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/remoteConsoleUtil"},{"name":"LogsDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsDataCleaner"},{"name":"LogsDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner"},{"name":"LogServiceAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"logStorage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"LogViewer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/logViewer"},{"name":"LogViewerInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/logViewer"},{"name":"LONG_LINE_BOUNDARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"LongRunningOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"lookup","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"lookupService","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"LowerCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"LRUCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"LRUMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"lstat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lstat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"lstatSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lt","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"lte","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ltr","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ltrim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"lutimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lutimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"MacExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"machineIdKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"machineOverridableSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"machineSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"machineSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"MacLinuxFallbackKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper"},{"name":"MacLinuxKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"macLinuxKeyboardMappingEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/web.main"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cli"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/desktop.main"},{"name":"Main","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"MainContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"mainLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"mainModule","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"MainPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/mainPane"},{"name":"MainPaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/mainPane"},{"name":"MainProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/mainProcessService"},{"name":"MAINTAIN_UNDO_REDO_STACK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"MainThreadAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadAuthentication"},{"name":"MainThreadAuthenticationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadAuthentication"},{"name":"MainThreadClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadClipboard"},{"name":"MainThreadCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadCommands"},{"name":"MainThreadCommentController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadComments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadCommentThread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadConfiguration"},{"name":"MainThreadConsole","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadConsole"},{"name":"MainThreadDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDebugService"},{"name":"MainThreadDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDecorations"},{"name":"MainThreadDiagnostics","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDiagnostics"},{"name":"MainThreadDialogs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDialogs"},{"name":"MainThreadDocumentContentProviders","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocumentContentProviders"},{"name":"MainThreadDocumentRangeSemanticTokensProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadDocuments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocuments"},{"name":"MainThreadDocumentsAndEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors"},{"name":"MainThreadDocumentSemanticTokensProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadDownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDownloadService"},{"name":"MainThreadEditorInsets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadCodeInsets"},{"name":"MainThreadErrors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadErrors"},{"name":"MainThreadExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadExtensionService"},{"name":"MainThreadFileSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadFileSystem"},{"name":"MainThreadFileSystemEventService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService"},{"name":"MainThreadKeytar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadKeytar"},{"name":"MainThreadLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLabelService"},{"name":"MainThreadLanguageFeatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadLanguages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguages"},{"name":"MainThreadLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLogService"},{"name":"MainThreadMessageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadMessageService"},{"name":"MainThreadNotebookController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadNotebookDocument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadNotebooks","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadOutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadOutputService"},{"name":"MainThreadProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadProgress"},{"name":"MainThreadQuickOpen","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen"},{"name":"MainThreadSCM","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSCM"},{"name":"MainThreadSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSearch"},{"name":"MainThreadStatusBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadStatusBar"},{"name":"MainThreadStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadStorage"},{"name":"MainThreadTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTask"},{"name":"MainThreadTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTelemetry"},{"name":"MainThreadTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTerminalService"},{"name":"MainThreadTextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditor"},{"name":"MainThreadTextEditorProperties","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditor"},{"name":"MainThreadTextEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditors"},{"name":"MainThreadTheming","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTheming"},{"name":"MainThreadTimeline","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTimeline"},{"name":"MainThreadTreeViews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTreeViews"},{"name":"MainThreadTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTunnelService"},{"name":"MainThreadUrls","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadUrls"},{"name":"MainThreadWebviews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWebview"},{"name":"MainThreadWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWindow"},{"name":"MainThreadWorkspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWorkspace"},{"name":"major","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"MakeAddress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"MaliciousExtensionChecker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"MaliciousStatusLabelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ManageAuthorizedExtensionURIsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionUrlHandler"},{"name":"ManageAutomaticTaskRunning","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks"},{"name":"ManageExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ManageExtensionsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess"},{"name":"ManagementPersistentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"manageTrustedDomainSettingsCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"MANIFEST_CACHE_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"Map","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"mapArrayOrNot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"mapPager","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"mapToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"Margin","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/margin/margin"},{"name":"MarginViewLineDecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations"},{"name":"MarginViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"mark","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"markAsFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"MarkdownCellRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"MarkdownCellViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel"},{"name":"markdownEscapeEscapedCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"MarkdownRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/markdown/markdownRenderer"},{"name":"MarkdownRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/mdRenderer"},{"name":"MarkdownString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"MarkdownString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"MarkdownString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"MarkdownString","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"markdownUnescapeCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"marked","kind":"alias","kindModifiers":"declare","sortText":"4"},{"name":"markedStringsEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"Marker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"Marker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"MarkerController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoError"},{"name":"MarkerDecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/markerDecorationsServiceImpl"},{"name":"MarkerNavigationWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"MarkerRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markerService"},{"name":"MarkerSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"MarkerSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MarkerSeverity","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"MarkersFilterActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"MarkersFilters","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"MarkersModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"MarkersTreeAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkersView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersView"},{"name":"MarkersViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkersWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"MarkerTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"MarkerTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MarkerTag","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"MarkerViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"markTimeline","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"mas","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"match","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"match","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"Match","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"MATCHES_LIMIT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"matchesCamelCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesContiguousSubString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzy2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzyCodiconAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"matchesPrefix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesScheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"matchesStrictPrefix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesSubString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesWords","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"MatchFindAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"MatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"matchMedia","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"Math","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MAX_BYTES_ON_DISK","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"MAX_CONNECTION_FAILURES_BEFORE_WARN","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"MAX_FILE_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MAX_FOLDING_REGIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"MAX_HEAP_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MAX_LINE_NUMBER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"MAX_OUTPUT_LENGTH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"MAX_VALUE_RENDER_LENGTH_IN_VIEWLET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"maxHeaderSize","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"MaximizeGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"maxSatisfying","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"mayIncludeActionsOfKind","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"measure","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Measurement","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"MediaDeviceInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaDevices","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaElementAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaEncryptedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeyMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeys","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeySession","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeyStatusMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeySystemAccess","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaQueryList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaQueryListEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamAudioDestinationNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrackAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Memento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/memento"},{"name":"memoize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"memory","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Memory","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"memoryUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Menu","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Menu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"MENU_ESCAPED_MNEMONIC_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"MENU_MNEMONIC_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"menuBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menubar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Menubar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/electron-main/menubar"},{"name":"MenuBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menubar"},{"name":"MENUBAR_SELECTION_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MENUBAR_SELECTION_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MENUBAR_SELECTION_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MenubarControl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/menubarControl"},{"name":"MenubarMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/electron-main/menubarMainService"},{"name":"MenubarService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/menubar/electron-browser/menubarService"},{"name":"menuBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuEntryActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"menuForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuId","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"MenuItem","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"MenuItemAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"MenuItemExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"MenuPreventer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/menuPreventer"},{"name":"MenuRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"menuSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSelectionBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSeparatorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/menuService"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/extensionsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/keybindingsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/globalStateMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/snippetsMerge"},{"name":"mergeAllGroups","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"mergeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"mergeCommonContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCommonHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCurrentContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCurrentHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MergedEnvironmentVariableCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableCollection"},{"name":"mergeEnvironments","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"MergeGroupMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"mergeIncomingContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeIncomingHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergePagers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"mergeSort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"MergeWindowTabsHandlerHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"MessageChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessageChannel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"MessageController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/message/messageController"},{"name":"MessageData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MessageData"},{"name":"MessageData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"MessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessagePort","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessagePort","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"Messages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/messages"},{"name":"MessageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"MessageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"METHODS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"MetricData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MetricData"},{"name":"MetricData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"MIME_BINARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MIME_TEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MIME_UNKNOWN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MimeType","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MimeTypeArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MimeTypeRendererResolver","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"mimeTypeSupportedByCore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"MIN_MAX_MEMORY_SIZE_MB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/files"},{"name":"Minimap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimap"},{"name":"MINIMAP_GUTTER_WIDTH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"minimapBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MinimapCharRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharRenderer"},{"name":"MinimapCharRendererFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharRendererFactory"},{"name":"minimapError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapGutterAddedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"minimapGutterDeletedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"minimapGutterModifiedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MinimapLinesRenderingData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"MinimapPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"MinimapPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"minimapSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderActiveBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MinimapTokensColorTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/minimapTokensColorTracker"},{"name":"minimapWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimist","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/minimist/index"},{"name":"MinimizeOtherGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MINIMUM_LETTER_SPACING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"minimumTranslatedStrings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/minimalTranslations"},{"name":"minor","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"minSatisfying","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"minVersion","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"MirrorTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/mirrorTextModel"},{"name":"MissingDependencyError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"mixin","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"mkdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdirp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"mkdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdtemp","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdtempSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mnemonicButtonLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"mnemonicMenuLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"mocha","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Mocha","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"mock","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"MockContextKeyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/test/common/mockKeybindingService"},{"name":"MockDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/test/common/mockKeybindingService"},{"name":"MockMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/mockMode"},{"name":"MockObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/mockSearchTree"},{"name":"MockRawSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockTextAreaWrapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/controller/textAreaState.test"},{"name":"ModelBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"ModelConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"ModelDecorationMinimapOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelDecorationOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelDecorationOverviewRulerOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelRawContentChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawEOLChanged","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawFlush","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLineChanged","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLinesDeleted","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLinesInserted","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"ModelTransientSettingWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/abstractCodeEditorService"},{"name":"ModesContentHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/modesContentHover"},{"name":"ModeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modeServiceImpl"},{"name":"ModesGlyphHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/modesGlyphHover"},{"name":"ModesHoverController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hover"},{"name":"ModesRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"MODIFIED_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"modifiedItemIndicator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ModifierLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"modify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"modifySearchEditorContextLinesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"module","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Module","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"monaco","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"MonacoEnvironment","kind":"let","kindModifiers":"declare","sortText":"4"},{"name":"MonarchBracket","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"MonarchTokenizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchLexer"},{"name":"monitorEventLoopDelay","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"MonospaceLineBreaksComputerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/monospaceLineBreaksComputer"},{"name":"MouseController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"MouseEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MouseHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseHandler"},{"name":"MouseTarget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"MouseTargetFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"MouseTargetType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"MouseTargetType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MouseWheelClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"move","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"move","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MOVE_ACTIVE_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"MOVE_FILE_TO_TRASH_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"moveBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MoveCaretCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/caretOperations/moveCaretCommand"},{"name":"MoveCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"moveCursor","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"MoveEditorLeftInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorRightInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToAboveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToBelowGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToFirstGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToLastGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToLeftGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToNextGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToPreviousGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToRightGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"moveFileToTrashHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"MoveFocusedViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"MoveGroupDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupUpAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/moveLinesCommand"},{"name":"MoveOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveOperations"},{"name":"MoveSelectionToNextFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MoveSelectionToPreviousFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"moveTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MoveToNextChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MoveToPreviousChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MoveWindowTabToNewWindowHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"MoveWordCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"MSAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSBlobBuilder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"msContentScript","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOCredentialAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOSignature","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOSignatureAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGesture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGestureEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGraphicsTrust","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSInputMethodContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyNeededEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeys","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeySession","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSPointerEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"msWriteProfilerMark","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MultiCursorSelectionController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSelectionControllerAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSessionResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultilineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultilineTokens2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultilineTokensBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultiModelEditStackElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"MultipleEditorGroupsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"MultiplexLayoutController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"MultiplexLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"multiSelectModifierSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"MutableDisposable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"MutationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MutationObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MutationRecord","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Mutex","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-mutex/index"},{"name":"MyArray","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"MyEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/parts/editor/baseEditor.test"},{"name":"MyOtherEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/parts/editor/baseEditor.test"},{"name":"name","kind":"const","kindModifiers":"declare","sortText":"4"},{"name":"NamedNodeMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"namespace","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Namespace","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"NaN","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NativeAccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/accessibility/electron-browser/accessibilityService"},{"name":"NativeBackupTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/electron-browser/backupTracker"},{"name":"NativeClipboardService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/clipboard/electron-browser/clipboardService"},{"name":"NativeExtHostSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostSearch"},{"name":"nativeImage","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeImage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService"},{"name":"NativePathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/electron-browser/pathService"},{"name":"NativeRequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/request/electron-browser/requestService"},{"name":"NativeResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"NativeResourceIdentityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/node/resourceIdentityServiceImpl"},{"name":"NativeSimpleFileDialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/simpleFileDialog"},{"name":"NativeStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageService"},{"name":"NativeTelemetryOptOut","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut"},{"name":"NativeTextFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/electron-browser/textFileEditor"},{"name":"NativeTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService"},{"name":"NativeTextSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/textSearchManager"},{"name":"nativeTheme","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/update/electron-browser/updateService"},{"name":"NativeWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/window"},{"name":"NativeWorkbenchEnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/electron-browser/environmentService"},{"name":"NativeWorkspaceEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService"},{"name":"NativeWorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/electron-browser/workspacesService"},{"name":"NavigateBackwardsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateBetweenGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateForwardAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateLastAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateToLastEditLocationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigationModeAddon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/navigationModeAddon"},{"name":"NavigationPreloadManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"navigator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Navigator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"neq","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"net","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"netLog","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"networkInterfaces","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"never","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NEVER_MEASURE_RENDER_TIME_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"NeverShowAgainScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"new","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NEW_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewEditorGroupAboveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupBelowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewExplorerItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"NewFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"NewWindowAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"newWindowCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"NewWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"newWriteableBufferStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"newWriteableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"NEXT_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"nextCharLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"NextCommentThreadAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"NextMarkerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoError"},{"name":"NextMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextMatchFindAction2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"NextSelectionMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextSideBarViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"nextTick","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"nextTick","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"NO_KEY_MODS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"noAsar","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"NODATA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Node","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"nodeAcceptEdit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"NodeCachedDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner"},{"name":"NodeClient","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/NodeClient"},{"name":"NodeColor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"NodeColor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"NodeDebugHelperService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugHelperService"},{"name":"NodeFilter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NodeIterator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NodeJS","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"NodeList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"noDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"nodeReadableToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"NodeSocket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"nodeSocketFactory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/node/nodeSocketFactory"},{"name":"nodesToArrays","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/browser/ui/grid/util"},{"name":"nodeStreamToVSBufferReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"NodeTestBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test"},{"name":"NoEditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"noIntlCompareFileNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"NOMEM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NoMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"NONAME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NoOpNotification","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NoOpProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NoOpWorkspaceTagsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/browser/workspaceTagsService"},{"name":"normalize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"normalize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"normalizeDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"normalizeExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"normalizeFileChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/watcher"},{"name":"normalizeGitHubUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/common/issueReporterUtil"},{"name":"normalizeNFC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"normalizeNFD","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"normalizePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"normalizeRoots","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/chokidarWatcherService"},{"name":"normalizeVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"NoTabsTitleControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/noTabsTitleControl"},{"name":"notDeepEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"notDeepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"notebook","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"NOTEBOOK_CELL_EDITABLE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_MARKDOWN_EDIT_MODE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_RUN_STATE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_TYPE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_DISPLAY_ORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NOTEBOOK_EDITABLE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_EDITOR_CURSOR_BOUNDARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NOTEBOOK_EDITOR_EDITABLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EDITOR_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EXECUTING_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_VIEW_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NotebookCellList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/notebookCellList"},{"name":"NotebookCellListDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"NotebookCellMetadataDefaults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel"},{"name":"NotebookCellTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel"},{"name":"NotebookCodeEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebook.contribution"},{"name":"notebookDocumentMetadataDefaults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookEditorCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"NotebookEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditorInput"},{"name":"NotebookEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditorInput"},{"name":"NotebookEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookEventDispatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookFindWidget"},{"name":"NotebookLayoutChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookMetadataChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"notebookOutputContainerColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookOutputRendererInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer"},{"name":"NotebookOutputRendererInfoStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"notebookProviderExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/extensionPoint"},{"name":"NotebookProviderInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookProvider"},{"name":"NotebookProviderInfoStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"NotebookRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookRegistry"},{"name":"notebookRendererExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/extensionPoint"},{"name":"NotebookService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"NotebookTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/model/notebookTextModel"},{"name":"NotebookViewEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel"},{"name":"notEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"NOTFOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Notification","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Notification","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NotificationActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"NotificationChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationHandle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NOTIFICATIONS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_HEADER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_HEADER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_ERROR_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_INFO_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_LINKS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_TOAST_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_WARNING_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NotificationsAlerts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsAlerts"},{"name":"NotificationsCenter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCenter"},{"name":"NotificationsCenterVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/notification/common/notificationService"},{"name":"NotificationsFilter","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NotificationsList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsList"},{"name":"NotificationsListDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NotificationsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationsStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsStatus"},{"name":"NotificationsToasts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsToasts"},{"name":"NotificationsToastsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationTemplateRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NotificationViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationViewItemContentChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationViewItemProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NOTIMP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NotImplementedError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"NOTINITIALIZED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"notStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"NsfwWatcherService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/nsfwWatcherService"},{"name":"null","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NULL_LANGUAGE_IDENTIFIER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NULL_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NULL_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NullApiDeprecationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"NullAppender","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"NullCommandService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"nullExtensionDescription","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"NullExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"NullFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/test/common/nullFileSystemProvider"},{"name":"NullLifecycleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"NullLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"NullOpenerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"nullRange","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"NullTelemetryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"nullTokenize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"nullTokenize2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"number","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Number","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NumberBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"O_APPEND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_CREAT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DIRECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DIRECTORY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DSYNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_EXCL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOATIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOCTTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOFOLLOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NONBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_RDONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_RDWR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_SYMLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_SYNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_TRUNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_WRONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"object","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Object","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ObjectIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"ObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTree"},{"name":"ObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTreeModel"},{"name":"off","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"OfflineAudioCompletionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OfflineAudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"offscreenBuffering","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OffscreenCanvas","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OffscreenCanvasRenderingContext2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ok","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"ok","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/assert"},{"name":"on","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"on","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"onabort","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onafterprint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationcancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationiteration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onauxclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onbeforeprint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onbeforeunload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onblur","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncanplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncanplaythrough","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"once","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"once","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"events"},{"name":"once","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/functional"},{"name":"once","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"onchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onclose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncompassneedscalibration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncontextmenu","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncuechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondblclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondevicelight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondevicemotion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondeviceorientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondeviceorientationabsolute","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onDidChangeFullscreen","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"onDidChangeKeyboardLayout","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"onDidChangeModelLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"onDidChangeZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"onDidCreateEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"onDidCreateModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"ondrag","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragexit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondrop","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondurationchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OneCursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/oneCursor"},{"name":"OneLineRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"onemptied","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onended","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnEnterSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/onEnter"},{"name":"oneOf","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"OneReference","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"OneReferenceRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"onerror","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OneSnippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetSession"},{"name":"onExtensionChanged","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"onfocus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ongotpointercapture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onhashchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnigScanner","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"OnigString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"oninput","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oninvalid","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeydown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeypress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeyup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"onlanguagechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ONLINE_SERVICES_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"onload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadeddata","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadedmetadata","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onlostpointercapture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmessage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmessageerror","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousedown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousemove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousewheel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturedoubletap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgestureend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturehold","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturestart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturetap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsinertiastart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointercancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerdown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointermove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onoffline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ononline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onorientationchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpagehide","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpageshow","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpause","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onplaying","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointercancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerdown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointermove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpopstate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onprogress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onratechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onreadystatechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onrejectionhandled","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onreset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onresize","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onscroll","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsecuritypolicyviolation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onseeked","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onseeking","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselectionchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselectstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onstalled","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onstorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsubmit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsuspend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontimeupdate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontoggle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchcancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchmove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitioncancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionrun","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnTypeFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"OnTypeRenameAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"OnTypeRenameContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"OnTypeRenameProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"onUnexpectedError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"onUnexpectedExternalError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"onunhandledrejection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onunload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvolumechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayactivate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayblur","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayconnect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaydeactivate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaydisconnect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayfocus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypointerrestricted","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypointerunrestricted","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypresentchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onwaiting","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onwheel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onWillDisposeModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"open","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"OPEN_CREATE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_EDITOR_AT_INDEX_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"OPEN_PRIVATECACHE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_READONLY","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_READWRITE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_SHAREDCACHE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_TO_SIDE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OPEN_URI","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OpenAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"openBreakpointSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"OpenContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"OpenDebugConsoleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugViewlet"},{"name":"opendir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"opendirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"OpenEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"OpenEditorsFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"OpenEditorsGroupContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OpenEditorsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/openEditorsView"},{"name":"OpenEditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"opener","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OpenerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/openerService"},{"name":"OpenerValidatorContributions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsValidator"},{"name":"OpenExplorerViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files.contribution"},{"name":"OpenExtensionLogsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/electron-browser/logsActions"},{"name":"OpenExtensionsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions"},{"name":"OpenExtensionsViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"OpenFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenFileFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"openFilePreserveFocusHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"OpenFirstEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenFolderAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenInEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"OpenInEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenIssueReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenIssueReporterActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/common/commands"},{"name":"OpenLastEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenLatestReleaseNotesInBrowserAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"OpenLocalFileCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLocalFileFolderCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLocalFolderCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLogsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/electron-browser/logsActions"},{"name":"OpenMatchToSide","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"openModeSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"OpenNewEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenNewEditorToSideCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenNextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenProcessExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueActions"},{"name":"OpenRecentAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"OpenResultsInEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"OpenSearchEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"OpenSearchEditorToSideAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"openSearchView","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"OpenSearchViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"openStdin","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"openSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"OpenUrlAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/url.contribution"},{"name":"OpenViewPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"OpenWebviewDeveloperToolsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"openWindowCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OpenWindowSessionLogFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsActions"},{"name":"OpenWithAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenWorkspaceButtonContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorWidgets"},{"name":"OpenWorkspaceConfigFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OperatingSystem","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Option","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"optional","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"OPTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"or","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"OrganizeImportsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"organizeImportsCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"orientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Orientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"origin","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"originalFSPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"orthogonal","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"OS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"OS_PROVIDES_FILE_PROTECTION","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"OscillatorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"outerHeight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"outerWidth","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OutgoingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"OutlineAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineConfigKeys","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineElementTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineGroupTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineItemComparator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlinePane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/outline/browser/outlinePane"},{"name":"OutlineSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineViewFiltered","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineViewFocused","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineViewId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineVirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutOfProcessWin32FolderWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/win32/csharpWatcherService"},{"name":"OUTPUT_MIME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OutputAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/node/outputAppender"},{"name":"OutputBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingIO"},{"name":"OutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"OutputChannelModelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModelService"},{"name":"OutputChannelModelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/electron-browser/outputChannelModelService"},{"name":"OutputEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputView"},{"name":"OutputLinkComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkComputer"},{"name":"OutputLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkProvider"},{"name":"OutputPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"OutputRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/outputRenderer"},{"name":"OutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputServices"},{"name":"OutputViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputView"},{"name":"outside","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"OverconstrainedError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OverflowEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OverlayWidgetDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"OverlayWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"OverlayWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"OVERRIDE_PROPERTY_PATTERN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"overrideIdentifierFromKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"OverviewRuler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler"},{"name":"overviewRulerAddedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerCommentingRangeForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentGlyphWidget"},{"name":"overviewRulerCommonContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerCurrentContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerDeletedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"overviewRulerFindMatchForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerIncomingContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerInfo","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"overviewRulerModifiedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"overviewRulerSelectionHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"OverviewRulerZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"OverviewZoneManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"package","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"pad","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"PageCoordinates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"PagedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listPaging"},{"name":"PagedModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"PagedScreenReaderStrategy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaState"},{"name":"PageTransitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PageViewData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/PageViewData"},{"name":"PageViewData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"pageXOffset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pageYOffset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Pane","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"PaneComposite","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panecomposite"},{"name":"PaneCompositePanel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"Panel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PANEL_ACTIVE_TITLE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_ACTIVE_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/outline/browser/outline.contribution"},{"name":"PANEL_INACTIVE_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_INPUT_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PanelActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PanelDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PanelFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"PanelKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"PanelPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelPart"},{"name":"PanelPositionContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"PanelRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PaneView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"PannerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ParameterHintsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHintsModel"},{"name":"ParameterHintsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHintsWidget"},{"name":"ParameterInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ParameterInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ParameterInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"parent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"parentPort","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"parse","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"parse","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/plistParser"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/tokenization/typescript"},{"name":"parseArgs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"parseClassifierString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"parseCLIProcessArgv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"parseCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"ParsedTokenThemeRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ParseErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parseExtensionDevOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDevOptions"},{"name":"parseExtensionHostPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseFloat","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"parseHrefAndDimensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"parseInt","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"parseKeyboardLayoutDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"parseLineAndColumnAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/paths"},{"name":"parseLinkedText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedText"},{"name":"parseMainProcessArgv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"ParseOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parsePathArg","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"parser","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Parser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"parseRawGrammar","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"parseReplaceString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"parseSavedSearchEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"parseSearchPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseTokenTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"parseTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parseUserDataDir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"parseWithLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/plistParser"},{"name":"Part","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/part"},{"name":"PartFingerprint","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"PartFingerprints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"PartialModelCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"PartialViewCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"Parts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"PassThrough","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"PASTE_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"pasteFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"PasteWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"patch","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"Path2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pathIncludedInQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"PathIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"pathOrURIToURI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"pathsToEditors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"pathToFileURL","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"PatternExcludesFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"PatternIncludesFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"PatternInputWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget"},{"name":"patternsToIExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"PAUSE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"PAUSE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"PauseableEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"PaymentAddress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentRequestUpdateEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pbkdf2","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"pbkdf2Sync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"PeekContext","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorGutterBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsFileForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsMatchForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"PeekViewWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"performance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"performance","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"Performance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceEntry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceMark","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceMeasure","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceNavigation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceNavigationTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceObserver","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"PerformanceObserverEntryList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceResourceTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerfviewContrib","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor"},{"name":"PerfviewInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor"},{"name":"PerfWidgetExternal","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PeriodicWave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionRequestedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Permissions","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionStatus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PersistentConnectionEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"PersistentContributableViewsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"PersistentProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"personalbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PICK_WORKSPACE_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"pickerGroupBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"pickerGroupForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"PickerQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/pickerQuickAccess"},{"name":"pid","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Piece","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"pieceToQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"PieceTreeBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"PieceTreeTextBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer"},{"name":"PieceTreeTextBufferBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder"},{"name":"PieceTreeTextBufferFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder"},{"name":"pipeline","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"Placeholder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"PlaceHolderPanelActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PlaceHolderToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"PlaceHolderToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PlaceHolderViewletActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"PLAINTEXT_LANGUAGE_IDENTIFIER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"PLAINTEXT_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"platform","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"platform","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"platform","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"platform","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Platform","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"PlatformToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Plugin","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PluginArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"POINT_CONVERSION_COMPRESSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"POINT_CONVERSION_HYBRID","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"POINT_CONVERSION_UNCOMPRESSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"PointerEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PointerEventHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/pointerHandler"},{"name":"PointerHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/pointerHandler"},{"name":"PointerHandlerLastRenderData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"PopStateEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"popup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/electron-browser/contextmenu"},{"name":"position","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Position","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"positionFromString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"positionIsInRange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"PositionPanelActionConfigs","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"positionToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"posix","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"posix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"postMessage","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"powerMonitor","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"powerSaveBlocker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"POWERSHELL_PATH","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"ppid","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prebakedMiniMaps","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapPreBaked"},{"name":"PreferencesContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferencesContribution"},{"name":"PreferencesEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"PreferencesEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"PreferencesLabel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"PreferencesSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"PreferencesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/browser/preferencesService"},{"name":"preferredSideBySideGroupDirection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"prefersExecuteOnUI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"prefersExecuteOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"PrefixMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"PrefixSumComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/prefixSumComputer"},{"name":"PrefixSumIndexOfResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/prefixSumComputer"},{"name":"prepareActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"prepareCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"prepareQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"prepend","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"prependListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"prependListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prependOnceListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"prependOnceListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prerelease","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"PresentationOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"presentationSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"PreserveCaseCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/replaceInput"},{"name":"prevCharLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"PREVIEW_DIR_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"PREVIOUS_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"PreviousMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousMatchFindAction2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PreviousSelectionMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousSideBarViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"print","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"privateDecrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"privateEncrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"ProblemCollectorEventKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"ProblemHandlingStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"ProblemLocationKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemMatcherParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemMatcherRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemPatternParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemPatternRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"problemsErrorIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"problemsInfoIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"problemsWarningIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"process","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProcessDataFlag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"ProcessExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ProcessExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ProcessExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ProcessExecutionOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ProcessingInstruction","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProcessRunnerDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/node/processRunnerDetector"},{"name":"ProcessState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ProcessTaskSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/node/processTaskSystem"},{"name":"product","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/product/common/product"},{"name":"ProductContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ProductIconThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/productIconThemeData"},{"name":"productService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"profile","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"profileEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ProfileSessionState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"Progress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"ProgressBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"ProgressBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/progressbar/progressbar"},{"name":"progressBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ProgressBarIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"ProgressEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ProgressLocation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressService"},{"name":"Promise","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PromiseRejectionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"promises","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"promises","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"promisify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"prompt","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"protocol","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Protocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Protocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.electron"},{"name":"ProtocolConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"events"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"module"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"stream"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"https-proxy-agent"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"mocha"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Domain"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/AvailabilityData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Base"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ContextTagKeys"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Data"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPoint"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Envelope"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/EventData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/StackFrame"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionDetails"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MessageData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MetricData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/PageViewData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RemoteDependencyData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RequestData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Channel"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/TelemetryClient"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/NodeClient"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/http-proxy-agent/index"},{"name":"provideDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerDecorationsProvider"},{"name":"provideSelectionRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/smartSelect"},{"name":"provideSignatureHelp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/provideSignatureHelp"},{"name":"provideSuggestionItems","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"Proxy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProxyAgent","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-proxy-agent/index"},{"name":"ProxyAuthHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/auth"},{"name":"ProxyIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"pseudoRandomBytes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"publicDecrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"publicEncrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"PublicKeyCredential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushSubscription","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushSubscriptionOptions","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pushToEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"pushToStart","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Query","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionQuery"},{"name":"QueryBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/queryBuilder"},{"name":"QueryGlobTester","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"QueryType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"Queue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"queueMicrotask","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"QuickAccessController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/quickAccess"},{"name":"QuickAccessLeastRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessLeastRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessNavigateNextAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/quickAccessActions"},{"name":"QuickAccessPreviousEditorFromHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessPreviousRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessPreviousRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"QuickAccessViewPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"QuickCommandNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"QuickFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"QuickFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"QuickFixActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"QuickFixController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"QuickHelpNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"quickInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QuickInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputBox"},{"name":"QuickInputButtons","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"QuickInputButtons","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"QuickInputController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInput"},{"name":"QuickInputEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"QuickInputEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"quickInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QuickInputList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputList"},{"name":"QuickInputListFocus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputList"},{"name":"QuickInputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/quickInput"},{"name":"QuickInputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/quickinput/browser/quickInputService"},{"name":"quickInputTitleBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QUICKOPEN_DETAIL_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"QUICKOPEN_SKIP_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"QuickOutlineNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"quickPickItemScorerAccessor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"QuickPickItemScorerAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"QuickSwitchWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"R_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"raceCancellation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"raceTimeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RadioGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"RadioNodeList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RandomAccessReader","kind":"class","kindModifiers":"abstract,export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"RandomBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"randomBytes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomFill","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomFillSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"RandomSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"range","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Range","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"RangeError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RangeHighlightDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/rangeDecorations"},{"name":"RangeHighlightDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"RangeMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"RangesCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"RangesCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"RangeUtil","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/rangeUtil"},{"name":"RatingsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RawContentChangedType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"RawContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"RawDebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/rawDebugSession"},{"name":"rawListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"RawObjectReplElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"rbDelete","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"rcompare","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"rcompareIdentifiers","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ReactionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"ReactionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"read","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Readable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"ReadableStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ReadableStreamReader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"readableToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readCharWidths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"readdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readdir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readDirsInDir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readdirSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readdirWithFileTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"readFromStdin","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"readlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readonly","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ReadonlyEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"readRawMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"ReadStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ReadStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"readSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readTrustedDomains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"readUInt16LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt32BE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt32LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"realcaseSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"realpath","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"realpath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"realpathSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"realpathSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"ReapplyBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"RecommendationWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"recomputeMaxEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"recomputeTreeMetadata","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"ReconnectionPermanentFailureEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ReconnectionRunningEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ReconnectionWaitEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"Recoverable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"RedoWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"RefactorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"refactorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"RefCountedStyleSheet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"ReferenceCollection","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"ReferenceError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ReferenceProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ReferencesController","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesController"},{"name":"ReferencesModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"ReferenceWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget"},{"name":"Reflect","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"RefreshAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"RefreshExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"REFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"REG_BINARY","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_DWORD","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_EXPAND_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_MULTI_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_NONE","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_QWORD","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_TYPES","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"RegexCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"RegExp","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"regExpContainsBackreference","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"regExpFlags","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"regExpLeadsToEndlessLoop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"register","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerAction2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"registerCodeActionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerCodeLensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"registerColorProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerColors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"registerColorThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerColorThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"registerCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"registerCompletionItemProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"registerContextMenuListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/electron-main/contextmenu"},{"name":"registerContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceContributions"},{"name":"registerContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"registerDeclarationProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDefaultLanguageCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerDefinitionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDiffEditorContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerDocumentFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentHighlightProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentRangeFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentRangeSemanticTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentSemanticTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentSymbolProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerEditorAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerEditorCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerEditorContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerFileIconThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerFileIconThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/fileIconThemeSchema"},{"name":"registerFileProtocol","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols"},{"name":"registerFoldingRangeProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerHoverProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerIcon","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"registerImplementationProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerInstantiatedEditorAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerLanguageCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerLinkProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerModelAndPositionCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerModelCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerNotificationCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"registerOnTypeFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerOnTypeRenameProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerOutputTransform","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookRegistry"},{"name":"registerProductIconThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerProductIconThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/productIconThemeSchema"},{"name":"registerReferenceProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerRemoteContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote"},{"name":"registerRenameProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSelectionRangeProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSignatureHelpProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSingleton","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/extensions"},{"name":"registerTerminalActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"registerTestEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"registerTextMime","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"registerThemingParticipant","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"registerTypeDefinitionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerWindowDriver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/browser/driver"},{"name":"registerWindowDriver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-browser/driver"},{"name":"Registry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/registry/common/platform"},{"name":"Registry","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"ReindentLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ReindentSelectedLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ReinstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"rejects","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"RelatedInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"RelatedInformationRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"relative","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"relative","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"relativePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"RelativePattern","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"RelativePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Relay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"RelayURLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/url/electron-browser/urlService"},{"name":"release","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"release","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"releaseEvents","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ReleaseNotesManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/releaseNotesEditor"},{"name":"ReloadAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ReloadWebviewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"ReloadWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"ReloadWindowWithExtensionsDisabledAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"remeasureFonts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"remote","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"REMOTE_EXPLORER_TYPE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"REMOTE_FILE_SYSTEM_CHANNEL_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel"},{"name":"REMOTE_HOST_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"REMOTE_MACHINE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"RemoteAgentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/abstractRemoteAgentService"},{"name":"RemoteAgentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/browser/remoteAgentServiceImpl"},{"name":"RemoteAgentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl"},{"name":"RemoteAuthorities","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/network"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"RemoteAuthorityResolverErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"RemoteAuthorityResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/remoteAuthorityResolverService"},{"name":"RemoteAuthorityResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/electron-browser/remoteAuthorityResolverService"},{"name":"RemoteBadgeWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RemoteConnectionState","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteDependencyData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RemoteDependencyData"},{"name":"RemoteDependencyData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"RemoteDependencyDataConstants","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Constants"},{"name":"RemoteExtensionEnvironmentChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentEnvironmentChannel"},{"name":"RemoteExtensionHostClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHostClient"},{"name":"RemoteExtensionLogFileName","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentService"},{"name":"RemoteExtensionManagementChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc"},{"name":"RemoteExtensionsInstaller","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/remoteExtensionsInstaller"},{"name":"RemoteFileDialogContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel"},{"name":"RemoteFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"RemoteInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"RemoteNameContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchService"},{"name":"RemoteUserConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"RemoteViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/remote"},{"name":"RemoteWindowActiveIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/remoteIndicator"},{"name":"REMOVE_ROOT_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"REMOVE_ROOT_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"removeAccents","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"RemoveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"RemoveActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"RemoveAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeAllListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"removeAllListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"RemoveAllWatchExpressionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeAnsiEscapeCodes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"RemoveBreakpointAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeClasses","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeCSSRulesContainingSelector","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeElementsAfterNulls","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/resolvedKeybindingItem"},{"name":"removeEventListener","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RemoveFromRecentlyOpenedAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"removeFromValueTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"removeListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"removeListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"removeMarkdownEscapes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"removeNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"removeTabIndexAndUpdateFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"rename","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"rename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/rename"},{"name":"RenameAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/rename"},{"name":"renameHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"renameIgnoreError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RenameInputField","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/renameInputField"},{"name":"RenameProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"renameSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"renderCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"RenderedLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewLayer"},{"name":"Renderer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Renderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList"},{"name":"rendererLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"renderExpressionValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"renderFormattedText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"RenderIndentGuides","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"RenderingContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"RenderLineInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"RenderLineNumbersType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"RenderLineNumbersType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"RenderLineOutput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"RenderLineOutput2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderMarkdown","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/markdownRenderer"},{"name":"renderMarkdownDocument","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markdown/common/markdownDocumentRenderer"},{"name":"RenderMinimap","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"RenderMinimap","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"renderText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"renderVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"renderViewLine","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderViewLine2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderViewTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"RenderWhitespace","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"ReopenClosedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ReopenResourcesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"repeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Repl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/repl"},{"name":"REPL_MODE_SLOPPY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"REPL_MODE_STRICT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"REPL_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"ReplAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceActiveKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceAllCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replaceAllCommand"},{"name":"ReplaceAllInFileActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceAllInFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceAllInFolderActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandThatPreservesSelection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandThatSelectsText","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandWithOffsetCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandWithoutChangingPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceInFilesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/replaceInput"},{"name":"ReplaceInputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplacePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"ReplacePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/replace"},{"name":"ReplacePiece","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"ReplacePreviewContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceService"},{"name":"ReplaceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceService"},{"name":"ReplDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplEvaluationInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplEvaluationInputsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplEvaluationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplEvaluationResultsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplRawObjectsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"REPLServer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"ReplSimpleElementsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplVariablesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"report","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"reporters","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"mocha"},{"name":"ReportExtensionIssueAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"ReportPerformanceIssueUsingReporterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueActions"},{"name":"RepositoryPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"RepositoryViewDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"request","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"request","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"request","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/request/browser/request"},{"name":"Request","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"requestAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RequestChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/requestIpc"},{"name":"RequestChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/requestIpc"},{"name":"RequestData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RequestData"},{"name":"RequestData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"RequestInitiator","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RequestMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/electron-main/requestMainService"},{"name":"RequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/browser/requestService"},{"name":"RequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/node/requestService"},{"name":"RequestType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"require","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RequireInterceptor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRequireInterceptor"},{"name":"RerunSearchEditorSearchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"RerunSearchEditorSearchCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"ResetFocusedViewLocationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ResetGroupSizesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"resetSentinel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"ResetViewLocationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"resizeBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"resizeTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"resolve","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"resolve4","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolve6","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveAny","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveCname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveColorValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"resolveCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/commonProperties"},{"name":"ResolvedAuthority","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ResolvedAuthority","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ResolvedKeybinding","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"ResolvedKeybindingItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/resolvedKeybindingItem"},{"name":"ResolvedKeybindingPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"resolveExtensionsSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"resolveMarketplaceHeaders","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService"},{"name":"resolveMx","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveNaptr","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveNs","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolvePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"resolvePatternsForProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"resolvePtr","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Resolver","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveSettingsTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"resolveSoa","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveSrv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveTerminalEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/terminalEncoding"},{"name":"resolveTxt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveWorkbenchCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/browser/workbenchCommonProperties"},{"name":"resolveWorkbenchCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/workbenchCommonProperties"},{"name":"ResourceContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/resources"},{"name":"ResourceDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"ResourceEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/resourceEditorInput"},{"name":"ResourceEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/resourceEditorModel"},{"name":"ResourceGlobMatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"ResourceGlobMatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/resources"},{"name":"ResourceLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"ResourceLabels","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"resourceLanguageSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ResourceMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"ResourceMarkers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"ResourceMarkersRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"ResourceQueue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"ResourcesDropHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"ResourceSelectedForCompareContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"resourceSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"resourcesPath","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ResourceTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resourceTree"},{"name":"resourceUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ResourceWithCommentsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"ResourceWithCommentThreads","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"Response","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ResponseType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ResponsiveState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RESTART_FRAME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"RESTART_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"RESTART_SESSION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"restore","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"restoreFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"restoreParentsScrollTop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"restoreRecentlyOpened","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"restoreWindowsState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsStateStorage"},{"name":"RestrictedRenderingContext","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"resultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"retry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"return","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"REVEAL_IN_EXPLORER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"RevealInSideBarForSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"RevealKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RevealLine_","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"RevealProblemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"revealResourcesInOS","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/electron-browser/fileCommands"},{"name":"RevealTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"reverse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"REVERSE_CONTINUE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"REVERT_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"RevertAndCloseEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"revertLocalChangesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"ReviewViewZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"ReviewZoneWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentThreadWidget"},{"name":"revive","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"reviveQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"reviveWebviewExtensionDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory"},{"name":"reviveWorkspaceEditDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"reviveWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"rewriteAbsolutePaths","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"rewriteWorkspaceFileForNewLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"RGBA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"RGBA8","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/rgba"},{"name":"rgErrorMsgForDisplay","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"rgErrorMsgForDisplay","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"rgPath","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-ripgrep/lib/index"},{"name":"RichEditBracket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"RichEditBrackets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"RichEditSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"rightRotate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"righttest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"rimraf","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RimRafMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"rimrafSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RipgrepParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"RipgrepSearchProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchProvider"},{"name":"RipgrepTextSearchEngine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"rmdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rmdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rootCertificates","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"rot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"RotatingLogger","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"RowCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rowCache"},{"name":"RPCProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RSA_NO_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_OAEP_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_PSS_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_SSLV23_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_X931_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"rsort","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"RTCCertificate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDataChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDataChannelEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtlsTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtlsTransportStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtmfSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDTMFSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDTMFToneChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceCandidate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceCandidatePairChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceGatherer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceGathererEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceTransportStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIdentityAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnectionIceErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnectionIceEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpReceiver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpTransceiver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSctpTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSessionDescription","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSrtpSdesTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSsrcConflictEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsProvider","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsReport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCTrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"rtrim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Rulers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/rulers/rulers"},{"name":"run","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RunAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"runAtThisOrScheduleAtNextAnimationFrame","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"RunAutomaticTasks","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks"},{"name":"runInContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runInExternalTerminal","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"runInNewContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runInThisContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runMain","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"RunOnceScheduler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RunOnceWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RunOnOptions","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunOnOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"RunOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"RuntimeExtensionsEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"RuntimeExtensionsInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput"},{"name":"RuntimeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunToCursorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"runWhenIdle","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"S_IFBLK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFCHR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFIFO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFLNK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFMT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFREG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IROTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWOTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXOTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"safeBtoa","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"safeStringify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"sandbox","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"sandboxed","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"sanitize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"sanitizeFilePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"sanitizeGridNodeDescriptor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"sanitizeProcessEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"sanitizeRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"Sash","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"SashState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"satisfies","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SAVE_ALL_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_ALL_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_ALL_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_AS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_AS_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_WITHOUT_FORMATTING_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILES_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SaveAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"SaveAllInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"SaveExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"SaveLocalFileCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"saveParentsScrollTop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"SaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant"},{"name":"SaveParticipantsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"SaveReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SaveWorkspaceAsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"ScanCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanCodeBinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanCodeUtils","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanError","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"Scanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"scheduleAtNextAnimationFrame","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"schema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchemaCommon"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v1"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v2"},{"name":"Schemas","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/network"},{"name":"Schemas","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"scm","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SCMAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/menus"},{"name":"SCMService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scmService"},{"name":"SCMStatusController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/activity"},{"name":"SCMTreeKeyboardNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMTreeSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"Scope","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ScopedCredential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScopedCredentialInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScopedLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"score","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageSelector"},{"name":"scoreFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"scoreFuzzy2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"scoreItemFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"screen","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screen","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Screen","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenLeft","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScreenOrientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenTop","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenX","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenY","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Script","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"ScriptProcessorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scroll","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Scrollable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"ScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"ScrollbarArrow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarArrow"},{"name":"scrollbars","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrollbarShadow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderActiveBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ScrollbarState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarState"},{"name":"ScrollbarVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"ScrollbarVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"ScrollbarVisibilityController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController"},{"name":"scrollBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ScrollDecorationViewPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration"},{"name":"ScrollPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon"},{"name":"ScrollState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"scrollTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ScrollType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"ScrollType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"scrollX","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrollY","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"scryptSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"sdkVersion","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"SEARCH_EXCLUDE_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-search/typings/xterm-addon-search"},{"name":"SearchChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchIpc"},{"name":"SearchChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchIpc"},{"name":"SearchCompletionExitCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchDND","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor"},{"name":"SearchEditorBodyScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"searchEditorFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"searchEditorFindMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SearchEditorFindMatchClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SearchEditorID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SearchEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput"},{"name":"SearchEditorScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"searchEditorTextInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor"},{"name":"Searcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchHistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchHistoryService"},{"name":"SearchInputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"searchMatchComparer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchParams","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchProviderType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchResultIdx","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SearchResultModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchService"},{"name":"SearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/rawSearchService"},{"name":"SearchSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchView"},{"name":"SearchViewFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"SearchViewPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchView"},{"name":"SearchViewVisibleKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"SearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"SearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"SearchWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SecurityPolicyViolationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SELECT_FOR_COMPARE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SelectActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"selectAllSearchEditorMatchesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"SelectAllSearchEditorMatchesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SelectAllTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SelectAllWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"SelectAndStartAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"selectBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"selectBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBox"},{"name":"SelectBoxList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBoxCustom"},{"name":"SelectBoxNative","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBoxNative"},{"name":"SelectColorThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/themes/browser/themes.contribution"},{"name":"SelectDefaultShellWindowsTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"selectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectHighlightsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"Selection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Selection","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Selection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/selection"},{"name":"Selection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Selection","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Selection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"selectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectionBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"SelectionClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard"},{"name":"SelectionClipboardContributionID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/selectionClipboard"},{"name":"SelectionDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/selection"},{"name":"SelectionDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SelectionDirection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"SelectionHighlighter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"SelectionMatchFindAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"SelectionRange","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SelectionRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SelectionRange","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SelectionRangeRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SelectionsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/selections/selections"},{"name":"selectListBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"selectorPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"self","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SEMANTIC_HIGHLIGHTING_SETTING_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"SemanticTokens","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensBuilder","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensEdits","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensEdits","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensHelp","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/semanticTokensHelp"},{"name":"SemanticTokensLegend","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensLegend","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensProviderStyling","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"SemanticTokensProviderStylingConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"SemVer","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SEMVER_SPEC_VERSION","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"send","kind":"method","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"Sender","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"SENTINEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"SENTINEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"sep","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"sep","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"Separator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"sequence","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Sequence","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/sequence"},{"name":"Sequencer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"SerializableFileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SerializableGrid","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"serialize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"serializeEnvironmentVariableCollection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableShared"},{"name":"serializeFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"serializePipePositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"Serializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"serializeSearchConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"serializeSearchError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"serializeSearchResultForEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"serve","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"serve","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-main/driver"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/electron-main/ipc.electron-main"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.cp"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"ServerExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"ServerResponse","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"SERVFAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ServiceCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/serviceCollection"},{"name":"ServiceUIFrameContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerContainer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerRegistration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"session","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Session","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"Session","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"sessionStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Set","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SET_CONTEXT_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"setARIAContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"setAsyncMode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"setCollapseStateAtLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateForMatchingLines","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateForType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateLevelsDown","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateLevelsUp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateUp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"SetColorThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"SetEditorLayoutAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"setegid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"seteuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setFdLimit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"SetFileIconThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"setFlagsFromString","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"setFullscreen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"setgid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setGlobalLeakWarningThreshold","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"setgroups","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setImmediate","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setImmediate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"setImmediate","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"setInterval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setInterval","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"setLanguageConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"SetLogLevelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsActions"},{"name":"SetMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"setMaxListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"setMaxListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setModelLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setModelMarkers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setMonarchTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"setNodeStickiness","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"setOptions","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"SetPanelPositionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"setPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"setPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"setPriority","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"SetProductIconThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"setProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"setServers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"setSnippetSuggestSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"setTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setTimeout","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setTimeout","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"SettingArrayRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingBoolRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingComplexRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingEnumRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingExcludeRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"settingKeyToDisplayFormat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingMatches","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"SettingNewExtensionsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingNumberRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"settings","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"SETTINGS_COMMAND_OPEN_SETTINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_EDIT_FOCUSED_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FILTER_ONLINE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_LIST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_TOC","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SWITCH_TO_JSON","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"Settings2EditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"SettingsChangeRelauncher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution"},{"name":"settingsCheckboxBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsCheckboxBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsCheckboxForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsEditor2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsEditor2"},{"name":"SettingsEditor2Input","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"SettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"SettingsEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"SettingsGroupTitleRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"SettingsGroupTitleWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsHeaderForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsHeaderWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsNumberInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsNumberInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsNumberInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectListBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsSync"},{"name":"SettingsTargetsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsTextInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsTextInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsTextInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingsTreeElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingsTreeGroupElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeNewExtensionsElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeSettingElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingTextRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingTreeRenderers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingValueType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"setTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"setToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"setuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setUncaughtExceptionCaptureCallback","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setUnexpectedErrorHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"setup","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"setup","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"setupMaster","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"setupTerminalCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalCommands"},{"name":"setupTerminalMenu","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalMenu"},{"name":"setWordDefinitionFor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"setZoomFactor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"setZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"Severity","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/severity"},{"name":"Severity","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"SeverityIcon","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/severityIcon/common/severityIcon"},{"name":"SeverityLevel","kind":"enum","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"SeverityLevel","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"shadowCaretRangeFromPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"ShadowRoot","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SharedArrayBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"sharedLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"SharedProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/sharedProcess"},{"name":"SharedProcessMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-main/sharedProcessMainService"},{"name":"SharedProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService"},{"name":"SharedWorker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"shell","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"SHELL_CWD_INVALID_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"SHELL_PATH_DIRECTORY_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"SHELL_PATH_INVALID_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ShellExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ShellExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ShellExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ShellExecutionOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"shift","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"ShiftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/shiftCommand"},{"name":"shorten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"shouldSetLangEnvVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"shouldSynchronizeModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelService"},{"name":"show","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"SHOW_EDITORS_IN_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SHOW_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ShowActiveFileInExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ShowAllCommandsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"ShowAllEditorsByAppearanceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowAllEditorsByMostRecentlyUsedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowAzureExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowBuiltInExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowCandidateContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/showCandidate"},{"name":"ShowCurrentReleaseNotesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ShowCurrentReleaseNotesActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/common/update"},{"name":"ShowDisabledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowEditorsInActiveGroupByMostRecentlyUsedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowEnabledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"showExtensionQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/format/browser/showExtensionQuery"},{"name":"ShowInstalledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowLanguageExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ShowLanguageExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowNextChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"ShowNextWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ShowOpenedFileInNewWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ShowOutdatedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowPopularExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowPreviousChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"ShowPreviousWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ShowProblemsPanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"ShowRecommendationsOnlyOnDemandKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ShowRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowRecommendedKeymapExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowReleaseNotesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ShowRuntimeExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"showSimpleSuggestions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"ShowViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ShowWebViewEditorFindWidgetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"shuffle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"ShutdownReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"SIDE_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"SidebarFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"SidebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/sidebar/sidebarPart"},{"name":"SideBarVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"SideBySideEditor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SideBySideEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/sideBySideEditor"},{"name":"SideBySideEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SIGABRT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGALRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGBREAK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGBUS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGCHLD","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGCONT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGFPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGHUP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGILL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGINT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGIOT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGKILL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"sign","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"SIGN_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/common/sign"},{"name":"SignatureHelp","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureHelp","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureHelp","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SignatureHelpProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SignatureInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Signer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"SignService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/browser/signService"},{"name":"SignService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/node/signService"},{"name":"SIGPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPOLL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPROF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPWR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGQUIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSEGV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSTKFLT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSTOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSYS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTERM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTRAP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTSTP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTTIN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTTOU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUNUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGURG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUSR1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUSR2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGVTALRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGWINCH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGXCPU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGXFSZ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SimpleBreadcrumbsItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"SimpleBulkEditService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleButton","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"SimpleCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"simpleCheckboxBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"simpleCheckboxBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"simpleCheckboxForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SimpleCommentEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/simpleCommentEditor"},{"name":"SimpleConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleEditorModelResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleEditorProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleFileDialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"SimpleFindReplaceWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindReplaceWidget"},{"name":"SimpleFindWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget"},{"name":"SimpleKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"SimpleLayoutService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleNotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleReplElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"SimpleResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleServicesNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"SimpleUriLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleWorkerClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"SimpleWorkerServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"SimpleWorkspaceContextService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SingleCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"SingleEditorGroupsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"singleLetterHash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"SingleLineInputHeight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"SingleModelEditStackElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"singlePagePager","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"SingleProxyRPCProtocol","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/api/testRPCProtocol"},{"name":"sinon","kind":"alias","kindModifiers":"declare","sortText":"4"},{"name":"Sinon","kind":"var","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"size","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"size","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"Sizing","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"Sizing","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"SlicedLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/lineTokens"},{"name":"SlowBuffer","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"SlowExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions"},{"name":"SmartSnippetInserter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/smartSnippetInserter"},{"name":"SmoothScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"SmoothScrollingOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"SmoothScrollingUpdate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"snapshotToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"SnapUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.snap"},{"name":"Snippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"SnippetCompletion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider"},{"name":"SnippetCompletionProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider"},{"name":"SnippetController2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetController2"},{"name":"SnippetFile","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"snippetFinalTabstopHighlightBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"snippetFinalTabstopHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SnippetParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"SnippetSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetSession"},{"name":"SnippetSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"SnippetSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"SnippetsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/snippetsSync"},{"name":"SnippetString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SnippetString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"snippetTabstopHighlightBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"snippetTabstopHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Socket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dgram"},{"name":"Socket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"SocketDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"sort","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SortBy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"sortedDiff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Sorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"SortLinesAscendingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"SortLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/sortLinesCommand"},{"name":"SortLinesDescendingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"sortMimeTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"SortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"SortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"Source","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"Source","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"Source","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"SourceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"sourceActionCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"SourceBreakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SourceBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SourceBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SourceBufferList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SourceControlInputBoxValidationType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SourceControlInputBoxValidationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SparseEncodedTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"spawn","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"spawn","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"node-pty"},{"name":"spawnRipgrepCmd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"spawnSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"SpdLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/spdlogService"},{"name":"specify","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechGrammar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechGrammarList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognition","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionAlternative","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionResult","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionResultList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"speechSynthesis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisUtterance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisVoice","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SPLIT_EDITOR_DOWN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_LEFT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_RIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_UP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"splitEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SplitEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorOrthogonalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorsVertically","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SplitEditorUpAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"splitGlobAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"SplitInActiveWorkspaceTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SplitLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"SplitLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"splitName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"SplitTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SplitView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"spreadGlobComponents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"spy","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"SQLiteStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/node/storage"},{"name":"SSL_OP_ALL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CIPHER_SERVER_PREFERENCE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CISCO_ANYCONNECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_COOKIE_EXCHANGE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CRYPTOPRO_TLSEXT_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_EPHEMERAL_RSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_LEGACY_SERVER_CONNECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MICROSOFT_SESS_ID_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MSIE_SSLV2_RSA_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_CA_DN_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_CHALLENGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_QUERY_MTU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SSLv2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SSLv3","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TICKET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1_1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1_2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_PKCS1_CHECK_1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_PKCS1_CHECK_2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SINGLE_DH_USE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SINGLE_ECDH_USE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SSLEAY_080_CLIENT_DH_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_BLOCK_PADDING_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_D5_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_ROLLBACK_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"StableEditorScrollState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"StackFrame","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"StackFrame","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/StackFrame"},{"name":"StackFrame","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"StandaloneCodeEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneCodeEditorNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"StandaloneCodeEditorServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeServiceImpl"},{"name":"StandaloneCommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneCommandsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess"},{"name":"StandaloneConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"StandaloneDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneGotoLineQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess"},{"name":"StandaloneGotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess"},{"name":"StandaloneKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneQuickInputServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"StandaloneReferencesController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch"},{"name":"StandaloneTelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneThemeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneThemeServiceImpl"},{"name":"StandardAutoClosingPairConditional","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfiguration"},{"name":"StandardKeyboardEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/keyboardEvent"},{"name":"StandardMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"standardMouseMoveMerger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/globalMouseMoveMonitor"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"StandardWheelEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"StandardWindow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"start","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"start","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"start","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-watchdog/index"},{"name":"StartAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"StartDebugActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActionViewItems"},{"name":"StartDebugQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugQuickAccess"},{"name":"startExtensionHostProcess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup"},{"name":"StartExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"StartFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"StartFindReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"StartFindWithSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"startProfiling","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"StartStopProblemCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"startsWith","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startsWithIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startsWithUTF8BOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterMain"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/processExplorer/processExplorerMain"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/sharedProcessMain"},{"name":"StartupKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"StartupKindToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"StartupProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/startupProfiler"},{"name":"StartupTimings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/startupTimings"},{"name":"stat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"stat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"State","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"stateExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"StatefullMarkdownCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell"},{"name":"StateMachine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"Statement","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"StateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/stateService"},{"name":"StateType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"StaticDND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"StaticExtensionsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/staticExtensions"},{"name":"StaticLanguageSelector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/mockMode"},{"name":"StaticRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StaticRouter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"StaticServices","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneServices"},{"name":"StatisticType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"statLink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"Stats","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"statSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"status","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"status","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"STATUS_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_DEBUGGING_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_DEBUGGING_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_DEBUGGING_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_HOST_NAME_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_HOST_NAME_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_ITEM_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_ITEM_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_CODES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"statusbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StatusbarAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/statusbar/common/statusbar"},{"name":"StatusBarAlignment","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"StatusBarAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"StatusBarColorProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"StatusbarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/statusbar/statusbarPart"},{"name":"StatusLabelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"StatusMessageChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"StatusUpdater","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"stderr","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"stdin","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"stdinDataListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"stdout","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"STEP_BACK_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_INTO_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_INTO_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OUT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OUT_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OVER_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OVER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"StereoPannerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"stop","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"stop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/event"},{"name":"STOP_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STOP_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"StopExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"StopWatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stopwatch"},{"name":"Storage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Storage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"StorageDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/storageDataCleaner"},{"name":"StorageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StorageHint","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"StorageKeysSyncRegistryChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"StorageKeysSyncRegistryChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"StorageKeysSyncRegistryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/storageKeys"},{"name":"StorageMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageMainService"},{"name":"StorageManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StorageManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService"},{"name":"StorageScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"strcmp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"Stream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"StreamDebugAdapter","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"streamToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"streamToBufferReadableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"streamToNodeReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"strict","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"strictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"string","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"String","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StringBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"StringDecoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"string_decoder"},{"name":"stringDiff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"StringDiffSequence","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"StringEOL","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"stringHash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"stringify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"stringify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"StringIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"StringRepresentationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"StringSHA1","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"stringToSnapshot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"stripCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"stripComments","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"stripUTF8BOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"stripWildcards","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"stub","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"styleMedia","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleMedia","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleSheet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleSheetList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SubmenuAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"SubmenuItemAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"substituteMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"SubtleCrypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SuggestAlternatives","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestAlternatives"},{"name":"SuggestController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestController"},{"name":"SuggestEnabledInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput"},{"name":"suggestFilename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"SuggestMemoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"SuggestModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"SuggestWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"suggestWidgetStatusbarMenu","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"suite","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"suiteRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"suiteSetup","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"suiteTeardown","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"super","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"SUPPORTED_CODE_ACTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"SUPPORTED_ENCODINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"SurroundSelectionCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/surroundSelectionCommand"},{"name":"SVGAElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAngle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedAngle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedBoolean","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedEnumeration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedInteger","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedLength","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedLengthList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedNumber","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedNumberList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedPreserveAspectRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedString","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedTransformList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateMotionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateTransformElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimationElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGCircleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGClipPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGComponentTransferFunctionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGCursorElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGDefsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGDescElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElementInstance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElementInstanceList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGEllipseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEBlendElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEColorMatrixElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEComponentTransferElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFECompositeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEConvolveMatrixElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDiffuseLightingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDisplacementMapElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDistantLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDropShadowElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFloodElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncAElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncBElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEGaussianBlurElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMergeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMergeNodeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMorphologyElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEOffsetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEPointLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFESpecularLightingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFESpotLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFETileElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFETurbulenceElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFilterElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGForeignObjectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGeometryElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGraphicsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLength","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLengthList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLinearGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLineElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMarkerElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMaskElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMetadataElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGNumber","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGNumberList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSeg","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegArcAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegArcRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegClosePath","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicSmoothAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicSmoothRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticSmoothAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticSmoothRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoHorizontalAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoHorizontalRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoVerticalAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoVerticalRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegMovetoAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegMovetoRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPatternElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPointList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPolygonElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPolylineElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPreserveAspectRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRadialGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGScriptElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStopElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStringList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStyleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSVGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSwitchElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSymbolElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextContentElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextPositioningElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTitleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTransform","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTransformList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTSpanElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGUnitTypes","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGUseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGViewElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGZoomAndPan","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGZoomEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"switch","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"SwitchPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"SwitchRemoteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/explorerViewItems"},{"name":"SwitchRemoteViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/explorerViewItems"},{"name":"SwitchTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SwitchTerminalActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SwitchWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"symbol","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Symbol","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SYMBOL_ICON_ARRAY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_BOOLEAN_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CLASS_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_COLOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CONSTANT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CONSTRUCTOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_ENUMERATOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_EVENT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FIELD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FILE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FOLDER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FUNCTION_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_INTERFACE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_KEY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_KEYWORD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_METHOD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_MODULE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NAMESPACE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NULL_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NUMBER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_OBJECT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_OPERATOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_PACKAGE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_PROPERTY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_REFERENCE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_SNIPPET_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_STRING_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_STRUCT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_TEXT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_TYPEPARAMETER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_UNIT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_VARIABLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SymbolInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SymbolKinds","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/symbolsQuickAccess"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"symlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"symlink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"symlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"SyncActionDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"SyncDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/descriptors"},{"name":"SyncIgnoredIconAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"SyncManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SyncResource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"SyncStatus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"SyntaxError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SyntaxKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"SyntaxRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"SystemDisabledWarningAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"systemPreferences","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TAB_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_BORDER_TOP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BORDER_TOP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TabCompletionController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/tabCompletion"},{"name":"TabFocus","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"table","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TabsTitleControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/tabsTitleControl"},{"name":"TAG","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"tail","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"tail2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"takeHeapSnapshot","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Task","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Task","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TASK_RUNNING_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"Task2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskConfigSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"TaskDefinition","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskDefinitionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskDefinitionRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskDefinitionRegistry"},{"name":"TaskDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskErrors","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskEvent","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskEventKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskExecuteKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskFilterDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskGroup","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskGroup","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskHandleDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"TaskPanelKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskPanelKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskPresentationOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskQuickPick","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"TaskRevealKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskRevealKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskRunResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugTaskRunner"},{"name":"TaskRunSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskRunType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"tasks","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TASKS_CONFIGURATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TASKS_DEFAULT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TaskScope","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskSequentializer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TaskService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskService"},{"name":"TaskService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/electron-browser/taskService"},{"name":"TaskSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskSourceKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TasksQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/tasksQuickAccess"},{"name":"tasksSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TaskStatusBarContributions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/task.contribution"},{"name":"teardown","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"TelemetryAppenderChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetryIpc"},{"name":"TelemetryAppenderClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetryIpc"},{"name":"TelemetryClient","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/TelemetryClient"},{"name":"TelemetryClient","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"TelemetryContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution"},{"name":"telemetryLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryService"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/browser/telemetryService"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/electron-browser/telemetryService"},{"name":"TelemetryType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"telemetryTypeToBaseType","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"TEMPDIR_PREFIX","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"template","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"Terminal","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"xterm"},{"name":"TERMINAL_ACTION_CATEGORY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_BORDER_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_COMMAND_ID","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_CONFIG_SECTION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_CURSOR_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_CURSOR_FOREGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_FOREGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_SELECTION_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TerminalConfigHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper"},{"name":"terminalConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalConfiguration"},{"name":"TerminalCursorStyle","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TerminalDataBufferer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalDataBuffering"},{"name":"TerminalFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalFindWidget"},{"name":"TerminalInstance","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalInstance"},{"name":"TerminalInstanceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalInstanceService"},{"name":"TerminalInstanceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService"},{"name":"TerminalLinkManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager"},{"name":"TerminalNativeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService"},{"name":"TerminalPasteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"TerminalProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalProcess"},{"name":"TerminalProcessExtHostProxy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy"},{"name":"TerminalProcessManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalProcessManager"},{"name":"TerminalQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalsQuickAccess"},{"name":"terminalSendSequenceCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"TerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalService"},{"name":"TerminalTab","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalTab"},{"name":"TerminalTaskSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem"},{"name":"TerminalValidatedLocalLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider"},{"name":"TerminalViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalView"},{"name":"TerminalWebLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalWebLinkProvider"},{"name":"TerminalWidgetManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager"},{"name":"TerminalWordLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider"},{"name":"TERMINATE_THREAD_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"TerminateResponseCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"TerminateResponseCode","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"TernarySearchTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"test","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"test","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"TEST_VIEW_CONTAINER_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"TestAccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testApplyEditsWithSyncedModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/editableTextModelTestUtils"},{"name":"TestBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestBackupMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test"},{"name":"testCase","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"TestCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"TestChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestCodeEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"TestCodeEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/editorTestServices"},{"name":"TestColorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"testCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCommand"},{"name":"TestCommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/editorTestServices"},{"name":"TestConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/testConfiguration"},{"name":"TestConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/test/common/testConfigurationService"},{"name":"TestContextService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"TestDecorationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/test/foldingModel.test"},{"name":"TestDecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestDialogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test"},{"name":"TestDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/test/common/testDialogService"},{"name":"TestDiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/test/electron-browser/diskFileService.test"},{"name":"TestEditorGroupAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorGroupsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorGroupView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestElectronService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestExperimentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test"},{"name":"TestExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test"},{"name":"TestExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/utils"},{"name":"TestFileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileIconTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"TestFilesConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/test/findController.test"},{"name":"TestHistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestInstantiationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/test/common/instantiationServiceMock"},{"name":"TestLayoutService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestListService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestNativePathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestNativeTextFileServiceWithEncodingOverrides","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestNotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"TestNotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/test/common/testNotificationService"},{"name":"TestPanelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestPathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestReadonlyTextFileEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"testRepeatedActionAndExtractPositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"testRepeatOnly","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"TestRPCProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/api/testRPCProtocol"},{"name":"TestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestServiceAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestServiceAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestServiceClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestSharedProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testTextBufferFactory","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test"},{"name":"TestTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestTextResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestTextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/services/modelService.test"},{"name":"TestTextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"TestThemeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"TestUserDataSyncUtilService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"TestView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/browser/ui/grid/util"},{"name":"TestViewletService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testViewModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/viewModel/testViewModel"},{"name":"TestViewsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestWindowConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestWorkingCopy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test"},{"name":"TestWorkingCopyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/test/common/testWorkspace"},{"name":"TestWorkspace","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/test/common/testWorkspace"},{"name":"Text","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Text","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TEXT_DIFF_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TEXT_FILE_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"TextAreaHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaHandler"},{"name":"TextAreaInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaInput"},{"name":"TextAreaState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaState"},{"name":"TextBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"textBlockQuoteBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textBlockQuoteBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextChange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textChange"},{"name":"textCodeBlockBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextCompareEditorActiveContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextCompareEditorVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextDecoder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextDecoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TextDecoderStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textDiffEditor"},{"name":"TextDiffEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/textDiffEditorModel"},{"name":"TextDocumentSaveReason","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextDocumentSaveReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextDocumentSaveReason","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEdit","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"TextEditElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"TextEditorCursorBlinkingStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"TextEditorCursorBlinkingStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TextEditorDecorationType","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"TextEditorEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"TextEditorLineNumbersStyle","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorLineNumbersStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorLineNumbersStyle","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextEditorOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorSelectionChangeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorSelectionChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorSelectionRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"TextEditorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/browser/history"},{"name":"TextEncoder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextEncoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TextEncoderStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextFileContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"TextFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileEditor"},{"name":"TextFileEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileEditorModel"},{"name":"TextFileEditorModelManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileEditorModelManager"},{"name":"TextFileEditorModelState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileEditorTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileEditorTracker"},{"name":"TextFileLoadReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileOperationError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileOperationResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileSaveErrorHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"TextFileSaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileSaveParticipant"},{"name":"TextInputActionsProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/textInputActions"},{"name":"textLinkActiveForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textLinkForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textmateColorGroupSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"textmateColorSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"textmateColorsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"TextMateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/browser/textMateService"},{"name":"TextMateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateService"},{"name":"TextmateSnippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TextMateWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateWorker"},{"name":"TextMateWorkerHost","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateService"},{"name":"TextMetrics","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"TextModelCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"TextModelResolvedOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"TextModelResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textmodelResolver/common/textModelResolverService"},{"name":"TextModelSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"TextModelTokenization","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelTokens"},{"name":"textPreformatForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationServiceImpl"},{"name":"TextResourceEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textResourceEditor"},{"name":"TextResourceEditorInput","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textresourceProperties/common/textResourcePropertiesService"},{"name":"TextSearchEngineAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/textSearchAdapter"},{"name":"TextSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"TextSearchMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"TextSearchResultsCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"textSeparatorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextSnapshotReadable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackCueList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Themable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemableDecorationAttachmentRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ThemableDecorationRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ThemeColor","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ThemeColor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"themeColorFromId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemeConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"ThemeIcon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ThemeIcon","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemeIcon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ThemeMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/electron-main/themeMainService"},{"name":"ThemeRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"ThemeRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMHelper"},{"name":"ThemeSettings","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"ThemeTrieElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ThemeTrieElementRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"this","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Thread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ThreadAndSessionIds","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"threadId","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"throttle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"ThrottledDelayer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Throttler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"throw","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"throwDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"throwProposedApiError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"throws","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"tildify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"time","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimeBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"timeEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timeline","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimelineElementTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"timelineEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimelineFollowActiveEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TimelineItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TimelineKeyboardNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineListVirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelinePane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelinePaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timeline.contribution"},{"name":"TimelinePaneId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"TimelineService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timelineService"},{"name":"timeLog","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TIMEOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"TimeoutTimer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TimeRanges","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"timeStamp","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timingSafeEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"title","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"TITLE_BAR_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TitlebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/titlebarPart"},{"name":"TitlebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart"},{"name":"TitleCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"TitleControl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/titleControl"},{"name":"TitleEventSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TLSSocket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"TMGrammarFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMGrammarFactory"},{"name":"tmpdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"TMScopeRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMScopeRegistry"},{"name":"toASCII","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"toBackupWorkspaceResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/electron-browser/backup"},{"name":"toBufferOrReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"toCanonicalName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"tocData","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"TOCRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"TOCTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"TOCTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"toDecodeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"toDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"toErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorMessage"},{"name":"toExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"toExtensionDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"toFileChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/watcher"},{"name":"toFileOperationResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"toFileSystemProviderErrorCode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"TOGGLE_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_CONDITIONAL_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_DIFF_IGNORE_TRIM_WHITESPACE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"TOGGLE_DIFF_SIDE_BY_SIDE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"TOGGLE_IGNORE_EXTENSION_ACTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"TOGGLE_INLINE_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"TOGGLE_LOG_POINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"TOGGLE_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ToggleActivityBarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleAutoSaveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ToggleAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ToggleBreakpointsActivatedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"toggleCaseSensitiveCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleCaseSensitiveCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleCaseSensitiveKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"toggleClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"ToggleCollapseAndExpandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"toggleCollapseState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"ToggleColumnSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection"},{"name":"ToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ToggleDevToolsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ToggleEditorLayoutAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleEditorVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleGroupSizesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ToggleHighContrastNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"ToggleMaximizedPanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"ToggleMenuBarAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleMinimapAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleMinimap"},{"name":"ToggleMultiCursorModifierAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier"},{"name":"TogglePanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"ToggleReactionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"toggleRegexCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleRegexCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleRegexKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleRenderControlCharacterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter"},{"name":"ToggleRenderWhitespaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace"},{"name":"toggleSearchEditorCaseSensitiveCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorCaseSensitiveCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorContextLinesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorRegexCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorRegexCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorWholeWordCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorWholeWordCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"ToggleSearchOnTypeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleSearchScopeKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleSharedProcessAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ToggleSidebarPositionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleSidebarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleStatusbarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleTabFocusModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode"},{"name":"ToggleTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"ToggleViewAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ToggleViewModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"toggleWholeWordCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleWholeWordCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleWholeWordKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleWindowTabsBarHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"Token","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"Token","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TOKEN_TYPE_WILDCARD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenClassificationExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/tokenClassificationExtensionPoint"},{"name":"TokenizationRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TokenizationRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/tokenizationRegistry"},{"name":"TokenizationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"TokenizationResult2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"TokenizationStateStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelTokens"},{"name":"TokenizationSupport2Adapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"tokenize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"tokenizeLineToHTML","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/textToHtmlTokenizer"},{"name":"tokenizeToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/textToHtmlTokenizer"},{"name":"TokenMetadata","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TokensStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"TokensStore2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"TokenStyle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenStylingRule","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"tokenStylingSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"TokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"toKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"toLocalISOString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/date"},{"name":"toLocalResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"toMultilineTokens2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"toNamespacedPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"toNodeEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"toolbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ToolBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/toolbar/toolbar"},{"name":"TOOLTIP_HOVER_THRESHOLD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"TooltipWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"toOverrides","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"top","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"top","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"topAsync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"toReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"toResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"toResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"toSlashes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"toStandardTokenType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"toStoreData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"toStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"toString","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"totalmem","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"Touch","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Touch","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"TouchBar","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarButton","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarColorPicker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarGroup","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarLabel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarPopover","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarScrubber","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSegmentedControl","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSlider","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSpacer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TouchList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"toUint32","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"toUint8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"toUnicode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"toValuesTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"toWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"toWorkspaceFolders","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"toWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"trace","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"traceDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"traceProcessWarnings","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"TrackedRangeStickiness","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"TrackedRangeStickiness","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"trackFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"transcode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"transform","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"Transform","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"Transform","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TransformableMarker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"transformAndReviveIncomingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"transformErrorForSerialization","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"transformIncomingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"transformOutgoingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"TransformStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TransitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Translations","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionPoints"},{"name":"translationsConfigFile","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"transparent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TransposeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"Tray","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TreeDragOverBubble","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeDragOverReactions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"TreeError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"treeIndentGuidesStroke","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TreeItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TreeItem2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TreeMouseEventTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"TreeResourceNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"TreeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"TreeViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"TreeVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeWalker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TRIGGER_RENAME_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"TriggerAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/pickerQuickAccess"},{"name":"triggerAsyncId","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"triggerDownload","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"TriggerParameterHintsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHints"},{"name":"Triggers","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TriggerSuggestAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestController"},{"name":"trim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"TrimFinalNewLinesParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"trimTrailingWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/trimTrailingWhitespaceCommand"},{"name":"TrimTrailingWhitespaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"TrimTrailingWhitespaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/trimTrailingWhitespaceCommand"},{"name":"TrimWhitespaceParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"true","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"trueMachineIdKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"truncate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"truncate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"truncateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"TRUSTED_DOMAINS_CONTENT_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"TRUSTED_DOMAINS_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"TrustedDomainsFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsFileSystemProvider"},{"name":"try","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"TunnelCloseableContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelDto","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"TunnelFactoryContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/tunnelFactory"},{"name":"TunnelModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"TunnelPanel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelPanelDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/tunnelService"},{"name":"TunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/node/tunnelService"},{"name":"TunnelType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"TunnelTypeContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"twistiePixels","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"type","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"type","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Type","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/lineCommentCommand"},{"name":"typeAndModifierIdPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TypeDefinitionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TypeError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"typeof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"TypeOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorTypeOperations"},{"name":"types","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TypeWithAutoClosingCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorTypeOperations"},{"name":"ucs2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"UIEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"UIKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"UIKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"UILabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"Uint16Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8ClampedArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8Matrix","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"umask","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"undefined","kind":"var","kindModifiers":"","sortText":"4"},{"name":"UndoIgnoreExtensionRecommendationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UndoRedoElementType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedo"},{"name":"UndoRedoService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedoService"},{"name":"UndoWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"unescape","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"unescape","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"Unicode11Addon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-unicode11/typings/xterm-addon-unicode11"},{"name":"unicodeEscapesToPCRE2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"UninstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"unique","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"uniqueFilter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"unknown","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"UNKNOWN_SOURCE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"UnknownExtensionRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"unlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"unlink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"unlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"UnloadReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"unmnemonicLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"untildify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"UNTITLED_WORKSPACE_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"UntitledTextEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorInput"},{"name":"UntitledTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorModel"},{"name":"UntitledTextEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorService"},{"name":"unwatchFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"unzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"unzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"UpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UpdateAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UpdateChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateIpc"},{"name":"updateColorThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"UpdateContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"updateFileIconThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"updateIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"updateProblemMatchers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v2"},{"name":"updateProductIconThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"updateTreeMetadata","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"UpdateType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"updateViewTypeSchema","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"UpperCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"uppercaseFirstLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"uptime","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"uptime","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Uri","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Uri","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"URI","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"URIError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"UriIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"uriToFsPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uri"},{"name":"URITransformer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"URITransformerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUriTransformerService"},{"name":"url","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"URL","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"URL","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"URLHandlerChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLHandlerChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLHandlerRouter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLSearchParams","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"URLSearchParams","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"URLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/node/urlService"},{"name":"USE_ICACLS","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"USE_SPLIT_JSON_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"useFakeTimers","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"useFakeXMLHttpRequest","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"USER_DATA_SYNC_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"USER_MANIFEST_CACHE_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"USER_STANDALONE_CONFIGURATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"USER_TASKS_GROUP_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskService"},{"name":"userAgent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"UserConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"UserDataAutoSyncChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userDataSync/electron-browser/userDataAutoSyncService"},{"name":"UserDataSycnUtilServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"UserDataSyncBackupStoreService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncBackupStoreService"},{"name":"UserDataSyncChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"UserDataSyncEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncEnablementService"},{"name":"UserDataSyncError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"UserDataSyncErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"userDataSyncLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"UserDataSyncLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncLog"},{"name":"UserDataSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncService"},{"name":"UserDataSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService"},{"name":"UserDataSyncStoreError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"UserDataSyncStoreService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncStoreService"},{"name":"UserDataSyncTestServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"UserDataSyncTrigger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger"},{"name":"UserDataSyncUtilServiceClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncViewContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncView"},{"name":"UserDataSyncWorkbenchContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync"},{"name":"userInfo","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"UserSettings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"UserSettingsLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"UserSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"userSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"useSlashForPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"USLayoutResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding"},{"name":"USUAL_WORD_SEPARATORS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"UTF16be","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16be_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16le","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16le_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8_BOM_CHARACTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"UTF8_with_bom","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"utimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"utimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"UV_UDP_REUSEADDR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"V4MAPPED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"valid","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ValidAnnotatedEditOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"validateConstraint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"validateConstraints","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"ValidatedEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"validateFileName","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"validateFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"validatePaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/paths"},{"name":"validateProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"validateTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"ValidationState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"ValidationStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"ValidityState","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"validRange","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"values","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"values","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"var","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Variable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"Variable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"VARIABLES_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"VariablesDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"variableSetEmitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"VariablesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"VariablesView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"verbose","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"Verbose","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"Verbosity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"VerifiedTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem"},{"name":"verify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"Verify","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"version","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"version","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"version","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"version","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"versions","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"VerticalRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"VerticalScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/verticalScrollbar"},{"name":"VideoPlaybackQuality","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"View","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewImpl"},{"name":"VIEW_CONTAINER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"ViewColumn","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ViewColumn","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ViewColumn","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"viewColumnToEditorGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/editor"},{"name":"ViewConfigurationChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewContainerLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"ViewContentPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"ViewContentSizeChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewContentWidgets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets"},{"name":"ViewContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewContext"},{"name":"ViewController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewController"},{"name":"ViewCursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewCursors/viewCursor"},{"name":"ViewCursors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewCursors/viewCursors"},{"name":"ViewCursorStateChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewDecorationsChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewDescriptorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/views/browser/viewDescriptorService"},{"name":"ViewEventDispatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEventDispatcher"},{"name":"ViewEventEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewEventHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewEventHandler"},{"name":"ViewEventsCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewFlushedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewFocusChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewIdentifierMap","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewLanguageConfigurationEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLayout"},{"name":"Viewlet","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/remote.contribution"},{"name":"ViewletActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ViewletDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ViewletRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ViewLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"ViewLineData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewLineMappingChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLineOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"ViewLineRenderingData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewLines","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLines"},{"name":"ViewLinesChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLinesDeletedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLinesInsertedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLineToken","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewLineTokenFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewMenuActions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewMenuActions"},{"name":"ViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModelImpl"},{"name":"ViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugViewModel"},{"name":"ViewModelDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewModelDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModelDecorations"},{"name":"ViewOutgoingEvents","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOutgoingEvents"},{"name":"ViewOverlayLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ViewOverlayWidgets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets"},{"name":"ViewPane","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewPaneContainer"},{"name":"ViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewPaneContainer"},{"name":"ViewPart","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"Viewport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewportData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLinesViewportData"},{"name":"ViewQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"ViewRevealRangeRequestEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"viewsContainersContribution","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/viewsExtensionPoint"},{"name":"ViewScrollChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"ViewsWelcomeContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution"},{"name":"viewsWelcomeExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewsWelcomeExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewThemeChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewTokensChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewTokensColorsChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"viewTypeSchamaAddition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"ViewZoneDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"ViewZones","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewZones/viewZones"},{"name":"ViewZonesChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"VirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"VirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"virtualMachineHint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/id"},{"name":"VirualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"VisibleLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewLayer"},{"name":"VisibleRanges","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"visit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"void","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"VRDisplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRDisplayCapabilities","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRDisplayEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VREyeParameters","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRFieldOfView","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRFrameData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRPose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"vs","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"vs_code_editor_walkthrough","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/vs_code_editor_walkthrough"},{"name":"vs_code_welcome_page","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page"},{"name":"vs_dark","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"VS_DARK_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VS_HC_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VS_LIGHT_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VSBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"VTTCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VTTRegion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"W_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WAIT_BETWEEN_RESEND","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"WALK_THROUGH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"WalkThroughArrowDown","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughArrowUp","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider"},{"name":"WalkThroughInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput"},{"name":"WalkThroughModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput"},{"name":"WalkThroughPageDown","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughPageUp","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"WalkThroughSnippetContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider"},{"name":"warn","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Warning","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"watch","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"watch","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/chokidar/types/index"},{"name":"WATCH_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"WatcherChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherIpc"},{"name":"WatcherChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherIpc"},{"name":"WatcherChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherIpc"},{"name":"WatcherChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherIpc"},{"name":"WatchExpressionsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/watchExpressionsView"},{"name":"WatchExpressionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/watchExpressionsView"},{"name":"watchFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"watchFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"watchFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"WatchingProblemCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"WatermarkContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/watermark/browser/watermark"},{"name":"WaveShaperNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WeakMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WeakMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"WeakSet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebAssembly","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"WebAuthentication","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebAuthnAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webContents","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebContents","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"webFrame","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebGL2RenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLActiveInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebglAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-webgl/typings/xterm-addon-webgl"},{"name":"WebGLBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLContextEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLFramebuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLObject","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLProgram","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLQuery","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLRenderbuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLRenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLSampler","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLShader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLShaderPrecisionFormat","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLSync","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLTexture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLTransformFeedback","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLUniformLocation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLVertexArrayObject","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebIssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/browser/issueService"},{"name":"webkitCancelAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitConvertPointFromNodeToPage","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitConvertPointFromPageToNode","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"WebKitCSSMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebKitPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webkitRequestAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitRTCPeerConnection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webkitURL","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebLinksAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-web-links/typings/xterm-addon-web-links"},{"name":"WebRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebResourceIdentityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/common/resourceIdentityService"},{"name":"WebSocket","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebSocketNodeSocket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"WebTelemetryAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/browser/telemetryService"},{"name":"webviewDeveloperCategory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"WebviewEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditor"},{"name":"WebviewEditorCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"WebViewEditorFindNextCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"WebViewEditorFindPreviousCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"WebviewEditorInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory"},{"name":"WebviewEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"WebviewFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewFindWidget"},{"name":"webviewHasOwnEditFunctionsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"webviewHasOwnEditFunctionsContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"WebviewIconManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewIconManager"},{"name":"WebviewInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInput"},{"name":"WebviewMessageChannels","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/baseWebviewElement"},{"name":"WebviewPortMappingManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/portMapping"},{"name":"WebviewResourceResponse","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"WebviewResourceScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"WebviewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewService"},{"name":"webviewTag","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebviewThemeDataProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/themeing"},{"name":"WebWorkerExtensionHostStarter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter"},{"name":"WelcomeInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomeOverlayAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay"},{"name":"WelcomePageAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"welcomePageBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomePageContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/welcomeView"},{"name":"WheelEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"whenDeleted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"whenProviderRegistered","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"while","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"WholeWordsCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"Widget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/widget"},{"name":"widgetShadow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"WidgetVerticalAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager"},{"name":"WillSaveStateReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"win32","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"win32","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"win32","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"Win32UpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.win32"},{"name":"window","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"window","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Window","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WINDOW_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WINDOW_INACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WindowDriverChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverRegistryChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverRegistryChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windows"},{"name":"windowOpenNoOpener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"windowSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"WindowsExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"WindowsKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"windowsKeyboardMappingEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"WindowsMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsMainService"},{"name":"WindowsNativeResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"WindowsShellHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/windowsShellHelper"},{"name":"WindowsShellType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"windowsStore","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Winreg","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"with","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"withEditorModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/editorTestUtils"},{"name":"withFormatting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"withNullAsUndefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"withTestCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"withTestNotebook","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"withUndefinedAsNull","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"WordCharacterClass","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"WordCharacterClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"WordContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/wordContextKey"},{"name":"WordDistance","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/wordDistance"},{"name":"WordLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"WordNavigationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordPartLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"WordPartOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordPartRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"WordRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"WordSelectionRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/wordSelections"},{"name":"Workbench","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/workbench"},{"name":"WORKBENCH_BACKGROUND","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WorkbenchAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchColorsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"WorkbenchCompressibleAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchCompressibleObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchConfigurationNodeBase","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/configuration"},{"name":"WorkbenchContextKeysHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkbenchDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchInstantiationService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"workbenchInstantiationService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"WorkbenchIssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueService"},{"name":"WorkbenchKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keybindingService"},{"name":"WorkbenchList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListAutomaticKeyboardNavigation","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListAutomaticKeyboardNavigationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListDoubleSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListFocusContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListHasSelectionOrFocus","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListMultiSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListSupportsKeyboardNavigation","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListSupportsMultiSelectContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchModeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/mode/common/workbenchModeService"},{"name":"WorkbenchObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchPagedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchReferencesController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch"},{"name":"WorkbenchState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WorkbenchStateContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkbenchThemeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/workbenchThemeService"},{"name":"worker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"Worker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Worker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"Worker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"workerData","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"WorkerExtHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"WorkerExtHostTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"WorkerExtHostTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"workers","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"WorkingCopyCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"WorkingCopyFileOperationParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant"},{"name":"WorkingCopyFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileService"},{"name":"WorkingCopyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"Worklet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"workspace","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Workspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WORKSPACE_EXTENSION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"WORKSPACE_FILTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"WORKSPACE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WORKSPACE_STANDALONE_CONFIGURATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WorkspaceBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"WorkspaceChangeExtHostRelauncher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution"},{"name":"WorkspaceConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"WorkspaceConfigurationEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"WorkspaceConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"WorkspaceEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"WorkspaceEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"WorkspaceEdit","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"WorkspaceFileEdit","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"WorkspaceFolder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WorkspaceFolderCountContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkspaceRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations"},{"name":"WorkspaceRecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"WorkspaceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configurationService"},{"name":"WorkspaceSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"workspaceSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WorkspacesHistoryMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService"},{"name":"WorkspacesMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"WorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesService"},{"name":"WorkspaceSymbol","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"WorkspaceSymbolProviderRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"WorkspaceTags","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"WorkspaceTagsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTagsService"},{"name":"WorkspaceTextEdit","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"WorkspaceWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/workspaceWatcher"},{"name":"wrap","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"WrappingIndent","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"WrappingIndent","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"wrapWithCorrelationContext","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"Writable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"WritableStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"write","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"writeFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFileSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"writeHeapSnapshot","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"writeProfile","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"writer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"WriteStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"WriteStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"writeSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeTransientState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleWordWrap"},{"name":"writeUInt16LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt32BE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt32LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writev","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writevSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"WSA_E_CANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSA_E_NO_MORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEACCES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEADDRINUSE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEADDRNOTAVAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEAFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEALREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEBADF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNABORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDESTADDRREQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDISCON","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDQUOT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEFAULT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEHOSTDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEHOSTUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINPROGRESS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVAL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVALIDPROCTABLE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVALIDPROVIDER","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEISCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAELOOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEMFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEMSGSIZE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENAMETOOLONG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOBUFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOMORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOPROTOOPT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTEMPTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEOPNOTSUPP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROCLIM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROTONOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROTOTYPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROVIDERFAILEDINIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEREMOTE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESHUTDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESOCKTNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESTALE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAETIMEDOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAETOOMANYREFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEUSERS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEWOULDBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSANOTINITIALISED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASERVICE_NOT_FOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASYSCALLFAILURE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASYSNOTREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSATYPE_NOT_FOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAVERNOTSUPPORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"X_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"x01","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x02","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x03","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x04","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x05","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x06","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x07","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x08","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x09","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x10","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x11","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x12","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x13","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x14","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x15","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x16","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x17","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x18","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x19","kind":"const","kindModifiers":"","sortText":"4"},{"name":"xdescribe","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"xdgRuntimeDir","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"xit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLDocument","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequestEventTarget","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequestUpload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLSerializer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathEvaluator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathExpression","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathResult","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XSLTProcessor","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"yield","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Z_ASCII","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BEST_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BEST_SPEED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BINARY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BUF_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DATA_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFAULT_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFAULT_STRATEGY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFLATED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_ERRNO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FILTERED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FINISH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FIXED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FULL_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_HUFFMAN_ONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_MEM_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NEED_DICT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NO_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NO_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_PARTIAL_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_RLE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_STREAM_END","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_STREAM_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_SYNC_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_TEXT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_TREES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_UNKNOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_VERSION_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"zip","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"ZipFile","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"ZipFile","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yazl/index"},{"name":"ZoneWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"ZoomInAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ZoomOutAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ZoomResetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"}]}}'; diff --git a/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts b/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts index de3582441a7..93dead3f3df 100644 --- a/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts +++ b/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts @@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range'; import { MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { IModelChangedEvent } from 'vs/editor/common/model/mirrorTextModel'; import { mock } from 'vs/base/test/common/mock'; - +import * as perfData from './extHostDocumentData.test.perf-data'; suite('ExtHostDocumentData', () => { @@ -301,9 +301,9 @@ suite('ExtHostDocumentData', () => { test('getWordRangeAtPosition can freeze the extension host #95319', function () { const regex = /(https?:\/\/github\.com\/(([^\s]+)\/([^\s]+))\/([^\s]+\/)?(issues|pull)\/([0-9]+))|(([^\s]+)\/([^\s]+))?#([1-9][0-9]*)($|[\s\:\;\-\(\=])/; - const line = '{"seq":0,"type":"response","command":"completionInfo","request_seq":956,"success":true,"body":{"isGlobalCompletion":true,"isMemberCompletion":false,"isNewIdentifierLocation":false,"entries":[{"name":"__dirname","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"__filename","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"_getInstrumentationKey","kind":"method","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"_util","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"$","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"abort","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"AbortController","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbortSignal","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbstractCaseAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractCodeEditorService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/abstractCodeEditorService"},{"name":"AbstractCommandsQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/commandsQuickAccess"},{"name":"AbstractConfigureRecommendedExtensionsAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"AbstractContextKeyService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"AbstractDebugAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"AbstractDebugAdapter","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/abstractDebugAdapter"},{"name":"AbstractDeleteAllToBoundaryAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractEditorCommandsQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/commandsQuickAccess"},{"name":"AbstractEditorNavigationQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/editorNavigationQuickAccess"},{"name":"AbstractExpressionsRenderer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"AbstractExtensionService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService"},{"name":"AbstractExtHostExtensionService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"AbstractExtHostOutputChannel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"AbstractFileDialogService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/abstractFileDialogService"},{"name":"AbstractFileOutputChannelModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"AbstractFileSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractGotoLineQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/gotoLineQuickAccess"},{"name":"AbstractGotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/gotoSymbolQuickAccess"},{"name":"AbstractJsonFileSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractKeybindingService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/abstractKeybindingService"},{"name":"AbstractLifecycleService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycleService"},{"name":"AbstractLineHighlightOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"AbstractLogService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"AbstractPathService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/common/pathService"},{"name":"AbstractProblemCollector","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"AbstractProcess","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"AbstractRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbstractRemoteAgentService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/abstractRemoteAgentService"},{"name":"AbstractScrollableElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"AbstractScrollbar","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/abstractScrollbar"},{"name":"AbstractSearchAndReplaceAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"AbstractSettingRenderer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"AbstractSettingsModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"AbstractShowReleaseNotesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"AbstractSortLinesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractTaskService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/abstractTaskService"},{"name":"AbstractTelemetryOptOut","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut"},{"name":"AbstractTextFileService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/browser/textFileService"},{"name":"AbstractTextMateService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/browser/abstractTextMateService"},{"name":"AbstractTextResourceEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textResourceEditor"},{"name":"AbstractTree","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"AbstractTunnelService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/tunnelService"},{"name":"AbstractUpdateService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/abstractUpdateService"},{"name":"AbstractURLService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlService"},{"name":"AbstractVariableResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/variableResolver"},{"name":"AbstractWorkspaceEditingService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService"},{"name":"Accelerator","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"acceptLocalChangesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"access","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"AccessibilityHelpNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"AccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"AccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"AccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibilityService"},{"name":"AccessibilitySupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"AccessibilitySupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"accessSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"AccountsActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ACL_IDENTITY","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"ACLED_DIRECTORIES","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"Action","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"Action2","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ActionBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"actions","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vscode-nsfw"},{"name":"ActionsOrientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActivatedExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ActivationTimes","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ACTIVE_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"activeContrastBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ActiveEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupEmptyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupIndexContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupLastContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorIsReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveGroupEditorsByMostRecentlyUsedQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"ActivePanelContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"ActiveViewletContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"ActiveWindowManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/activeWindowTracker"},{"name":"ACTIVITY_BAR_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_ACTIVE_FOCUS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BADGE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BADGE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ActivitybarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarPart"},{"name":"ActivityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/browser/activityService"},{"name":"ActivityUpdater","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"ADD_CONFIGURATION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"ADD_ROOT_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"ADD_ROOT_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"addArg","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"addClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addClasses","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addContextToEditorMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchHelpers"},{"name":"AddCursorsAtSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"addDisposableGenericMouseDownListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableGenericMouseMoveListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableGenericMouseUpListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableNonBubblingMouseOutListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableNonBubblingPointerOutListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableThrottledListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addEventListener","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"AddFunctionBreakpointAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"addListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"addListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ADDRCONFIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"ADDRGETNETWORKPARAMS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"AddRootFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"AddSelectionToNextFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"AddSelectionToPreviousFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"addSetting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"addStandardDisposableGenericMouseDownListner","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addStandardDisposableGenericMouseUpListner","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addStandardDisposableListener","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addTerminalEnvironmentKeys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"addToValueTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"AddToWorkspaceFolderRecommendationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"AddToWorkspaceRecommendationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"addTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"AddWatchExpressionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"adoptToGalleryExtensionId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"after","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"afterEach","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Agent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"Agent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"Aggregation","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"alert","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"alert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"alertFormattingEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"ALL_SYNC_RESOURCES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"allCharCodes","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"AllEditorsByAppearanceQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"AllEditorsByMostRecentlyUsedQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"AllKeysConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"allowedNodeEnvironmentFlags","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"allowSetForegroundWindow","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-foreground-love/index"},{"name":"allSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ALPN_ENABLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"AnalyserNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnchorAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"anchorGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"AnchorPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"animate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Animation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationEffect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationPlaybackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationTimeline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ansiColorIdentifiers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"ansiColorMap","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"any","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"anyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"AnythingQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/anythingQuickAccess"},{"name":"ApiCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ApiCommandArgument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ApiCommandResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"app","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"append","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"appendEditorTitleContextMenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions.contribution"},{"name":"appendFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"appendFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"appendKeyBindingLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"appendStylizedStringToContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"appendStylizedStringToContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"appendToCommandPalette","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions.contribution"},{"name":"AppInsightsAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/appInsightsAppender"},{"name":"applicationCache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ApplicationCache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"applicationSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"applyCodeAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"applyConfigurationValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"applyDeprecatedVariableMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolverUtils"},{"name":"applyDragImage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"applyEdit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"applyEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"ApplyEditsResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"ApplyToKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"appVersion","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"arch","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"arch","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"areFunctions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"areKeyboardLayoutsEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"areSame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"areSameExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"areWebviewInputOptionsEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"argv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"argv0","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"AriaLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ArrayBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"arrayInsert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"ArrayNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/navigator"},{"name":"ARROW_IMG_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarArrow"},{"name":"as","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"asArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"AsbtractOutputChannelModelService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"asCSSUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"asDomUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"asJson","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"asPromise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"assert","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"assertAllDefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"AssertDocumentLineMappingDirection","kind":"enum","kindModifiers":"","sortText":"0"},{"name":"assertEqualQueries","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"assertEqualSearchPathResults","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"AssertionError","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"assertIsDefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"assertMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveKeyboardEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveUserBinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"asserts","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"assertSyncedModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/editableTextModelTestUtils"},{"name":"assertType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"assign","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"asText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"asWebviewUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/webview"},{"name":"async","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"AsyncDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"AsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/asyncDataTree"},{"name":"AsyncEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"AsyncResource","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"atob","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Atomics","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"attachBadgeStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachBreadcrumbsStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachButtonStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachCheckboxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachDialogStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachFindReplaceInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachLinkStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachListStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachMenuStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachProgressBarStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachQuickInputStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachSelectBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachStylerCallback","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachSuggestEnabledInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput"},{"name":"Attr","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Audio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioBufferSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioDestinationNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioListener","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioParam","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioParamMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioProcessingEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioScheduledSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioWorklet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioWorkletNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"authentication","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"AuthenticationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/browser/authenticationService"},{"name":"AuthenticationTokenService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount"},{"name":"AuthenticationTokenService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/electron-browser/authenticationTokenService"},{"name":"AuthenticationTokenServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccountIpc"},{"name":"AuthenticatorAssertionResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthenticatorAttestationResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthenticatorResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthStatus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"AutoCheckUpdatesConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"AutoFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"AutoIndentOnPaste","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"AutoIndentOnPasteCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"automaticKeyboardNavigationSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"AutoSaveAfterShortDelayContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"AutoSaveConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"AutoSaveMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"AutoUpdateConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"autoUpdater","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"AvailabilityData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/AvailabilityData"},{"name":"AvailabilityData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"AverageBufferSize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"await","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"BackLayerWebView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView"},{"name":"BackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"BackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/node/backupFileService"},{"name":"BackupFilesModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"BackupMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backupMainService"},{"name":"BackupRestorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/common/backupRestorer"},{"name":"BACKUPS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/common/environment"},{"name":"BackupTracker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/common/backupTracker"},{"name":"BADFAMILY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADFLAGS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"badgeBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"badgeForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BADHINTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADNAME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADQUERY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADRESP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADSTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BareFontInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/fontInfo"},{"name":"BarProp","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Barrier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Base","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Base"},{"name":"Base","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"BaseActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"BaseAudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BaseBinaryResourceEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/binaryEditor"},{"name":"BaseBreakpoint","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"BaseCellViewModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel"},{"name":"BaseCloseAllAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseConfigurationResolverService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/browser/configurationResolverService"},{"name":"BaseCreateEditorGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseDropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"BaseEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/baseEditor"},{"name":"BaseEditorQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"BaseErrorTelemetry","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/errorTelemetry"},{"name":"BaseExtHostTerminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"BaseExtHostTerminalService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"BaseFocusGroupAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseMoveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"basename","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"basename","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"basename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"basenameOrAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"BaseNavigateEditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseQuickAccessEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseQuickAccessNavigateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/quickAccessActions"},{"name":"BaseResizeViewAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"BaseResolvedKeybinding","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/baseResolvedKeybinding"},{"name":"BaseSaveAllAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"BaseSplitEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseSwitchWindow","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"BaseTextEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textEditor"},{"name":"BaseTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/textEditorModel"},{"name":"baseTypeToTelemetryType","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"BaseWebview","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/baseWebviewElement"},{"name":"BaseWindowDriver","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/browser/baseDriver"},{"name":"BaseZoomAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"BasicInplaceReplace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/inplaceReplaceSupport"},{"name":"BatchedCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"before","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"beforeEach","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"BeforeUnloadEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BenchmarkSuite","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/benchmark/benchmarkUtils"},{"name":"BetterMergeId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"BhxBrowser","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"bigint","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"BigInt","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BigInt64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BigIntStats","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"BigUint64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BINARY_DIFF_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"BINARY_FILE_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"BinaryEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/binaryEditorModel"},{"name":"BinaryFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor"},{"name":"BinaryResourceDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/binaryDiffEditor"},{"name":"binarySearch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"BiquadFilterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Blob","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BlockCommentCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/blockCommentCommand"},{"name":"blur","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"boolean","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Boolean","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BooleanEventEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"BOTTOM_CELL_TOOLBAR_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"BoundModelReferenceCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocuments"},{"name":"BracesHidingRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"BracketElectricCharacterSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/electricCharacter"},{"name":"BracketMatchingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/bracketMatching/bracketMatching"},{"name":"BracketSelectionRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/bracketSelections"},{"name":"BracketsUtils","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"breadcrumbsActiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"breadcrumbsBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsConfig","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"BreadcrumbsControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsControl"},{"name":"BreadcrumbsFilePicker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"breadcrumbsFocusForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"breadcrumbsForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsItem","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"BreadcrumbsOutlinePicker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"BreadcrumbsPicker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"breadcrumbsPickerBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"BreadcrumbsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"break","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"breakBetweenGraphemeBreakType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Breakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Breakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Breakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"BREAKPOINT_EDITOR_CONTRIBUTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"BreakpointEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution"},{"name":"BREAKPOINTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"breakpointsExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"BreakpointsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"BreakpointWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointWidget"},{"name":"BreakpointWidgetContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"BroadcastChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"brotliCompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliCompressSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliDecompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliDecompressSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"BrowserBackupTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/browser/backupTracker"},{"name":"BrowserClipboardService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/clipboard/browser/clipboardService"},{"name":"BrowserCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/browser/credentialsService"},{"name":"BrowserEnvironmentConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/browser/environmentService"},{"name":"BrowserFeatures","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/canIUse"},{"name":"BrowserHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/browser/browserHostService"},{"name":"BrowserIntegrityServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/browser/integrityService"},{"name":"BrowserKeyboardMapperFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keymapService"},{"name":"BrowserKeyboardMapperFactoryBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keymapService"},{"name":"BrowserLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/lifecycle/browser/lifecycleService"},{"name":"BrowserPathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/browser/pathService"},{"name":"BrowserRequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/request/browser/requestService"},{"name":"BrowserResizeObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/sizeObserver"},{"name":"BrowserSocketFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/browserSocketFactory"},{"name":"BrowserStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/browser/storageService"},{"name":"BrowserTelemetryOptOut","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut"},{"name":"BrowserTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/browser/browserTextFileService"},{"name":"BrowserUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/update/browser/updateService"},{"name":"BrowserURLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/url/browser/urlService"},{"name":"BrowserView","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWindow","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWindowProxy","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWorkbenchEnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/browser/environmentService"},{"name":"BrowserWorkspaceEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspaceEditingService"},{"name":"BrowserWorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspacesService"},{"name":"btoa","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"buffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"Buffer","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"Buffer","kind":"alias","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"BufferedEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"BufferLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/bufferLog"},{"name":"BufferredOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"bufferToReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"bufferToStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"buildHelpMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"buildRegexParseError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"buildReplaceStringWithCasePreserved","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/search"},{"name":"buildTelemetryMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetry"},{"name":"buildVersionMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"BUILTIN_MANIFEST_CACHE_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"BuiltInBasicsExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"BuiltInExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"builtinModules","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"BuiltInThemesExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"BulkCategory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkEditAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditNaviLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane"},{"name":"BulkEditPreviewProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkEditService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/bulkEdit/browser/bulkEditService"},{"name":"BulkEditSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkFileOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkFileOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkFileOperationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkTextEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"Button","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/button/button"},{"name":"buttonBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"buttonBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"buttonForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ButtonGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/button/button"},{"name":"buttonHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"buttonHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"ByteLengthQueuingStrategy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cache"},{"name":"Cache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/cache"},{"name":"cached","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"cachedDataVersionTag","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"CachedExtensionScanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner"},{"name":"CachedKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keyboardMapper"},{"name":"CachedListVirtualDelegate","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"cachedStringRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/shiftCommand"},{"name":"caches","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CacheStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"calcANSI8bitColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"calcANSI8bitColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"calculateLF","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"calculateSize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"Call","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"callbackify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"CallHierarchyDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyIncomingCall","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyIncomingCall","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyIncomingCall","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyItem","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyOutgoingCall","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyOutgoingCall","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyOutgoingCall","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyTreePeekWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek"},{"name":"CallRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"CALLSTACK_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CallStackEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackEditorContribution"},{"name":"CallStackView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"CancelActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"cancelAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"CancelCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"canceled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"CancellationToken","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cancellation"},{"name":"CancellationTokenSource","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cancellation"},{"name":"CancellationTokenSource","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"CANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"CancelSearchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"canExecuteOnUI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canExecuteOnWeb","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canExecuteOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canNormalize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"CanvasGradient","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CanvasPattern","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CanvasRenderingContext2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"captureEvents","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"CaretPosition","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"case","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CaseSensitiveCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"catch","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CategoryElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"CategoryElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"CDATASection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CELL_MARGIN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"CELL_RUN_GUTTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"CELL_TOOLBAR_SEPERATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"CellEditState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellEditType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellFocusMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CellMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellMenus"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CellRevealPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellRunState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellUri","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CenteredViewLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/centered/centeredViewLayout"},{"name":"Certificate","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"CHANGE_BUFFER_DELAY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"ChangeEncodingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeEOLAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeIndentationSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ChangeModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeSortAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Channel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Channel"},{"name":"ChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ChannelMergerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ChannelServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ChannelSplitterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CharacterClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/characterClassifier"},{"name":"CharacterData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CharacterMapping","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"CharacterMappingConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"CharacterPairSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/characterPair"},{"name":"CharacterSet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/characterClassifier"},{"name":"CharCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/charCode"},{"name":"CharWidthRequest","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"CharWidthRequestType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"chdir","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Checkbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"CheckboxActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"CheckedStates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"CheckForUpdatesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"CheckForVSCodeUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"CheckForVSCodeUpdateActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/common/update"},{"name":"checkProposedApiEnabled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"checkServerIdentity","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"checksum","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/crypto"},{"name":"chmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chmod","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"chmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Choice","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"ChoiceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"ChokidarWatcherService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/chokidarWatcherService"},{"name":"ChordKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"chown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chrome","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ChunkStream","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Cipher","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"clamp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"class","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CLASSIFIER_MODIFIER_SEPARATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"ClassName","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"clean","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"cleanMnemonic","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"cleanRemoteAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"CleanSearchEditorStateCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"cleanUndefinedQueryValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"clear","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"CLEAR_ALL_NOTIFICATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"CLEAR_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"clearAllFontInfos","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"ClearAllNotificationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"ClearCommandHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"ClearEditorHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClearExtensionsInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"clearHistoryCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"clearImmediate","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearImmediate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"clearInterval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearInterval","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"clearLine","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"clearNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"ClearNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"ClearRecentFilesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClearReplAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/repl"},{"name":"clearScreenDown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"ClearSearchHistoryCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ClearSearchResultsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ClearTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"clearTextMimes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"clearTimeout","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearTimeout","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"ClickLinkGesture","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkKeyboardEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.cp"},{"name":"CLIENT_RENEG_LIMIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"CLIENT_RENEG_WINDOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"ClientCoordinates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"clientInformation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRectList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"ClientRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"clipboard","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Clipboard","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClipboardBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"ClipboardEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CLIServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostCLIServer"},{"name":"clock","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"cloneAndChange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"CLOSE_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITOR_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_AND_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_TO_THE_RIGHT_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_SAVED_EDITORS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CloseAllEditorGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseAllEditorsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseCurrentWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"closed","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CloseDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"CloseEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEditorInAllGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEditorsInOtherGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CloseExtensionDetailsOnViewChangeKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"CloseGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CloseLeftEditorsInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseOneEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClosePanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"CloseReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CloseReplaceWidgetActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CloseSidebarAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"closeSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"CloseWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"cmp","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"coalesce","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"coalesceInPlace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"CodeAction","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionAutoApply","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"CodeActionCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"CodeActionCommandArgs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"codeActionCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"CodeActionDocumentationContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationContribution"},{"name":"CodeActionExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint"},{"name":"CodeActionKeybindingResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionMenu"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionMenu"},{"name":"CodeActionModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"CodeActionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeActionsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsContribution"},{"name":"codeActionsExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint"},{"name":"CodeActionsState","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"CodeActionTrigger","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionTriggerType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeActionUi","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionUi"},{"name":"CodeApplication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/app"},{"name":"CodeCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell"},{"name":"CodeCellRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"CodeCellViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel"},{"name":"CodeDataTransfers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CodeEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/codeEditorService"},{"name":"CodeEditorServiceImpl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"CodeEditorStateFlag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"CodeEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"CodeInset","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeLens","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeLens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeLensCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codeLensCache"},{"name":"CodeLensContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensController"},{"name":"CodeLensHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensWidget"},{"name":"CodeLensModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelens"},{"name":"CodeLensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeLensWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensWidget"},{"name":"CodeWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/window"},{"name":"CodiconActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"CodiconLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/codiconLabel/codiconLabel"},{"name":"codiconStartMarker","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"coerce","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"COLLAPSE_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"CollapseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"CollapseAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/treeDefaults"},{"name":"CollapseDeepestExpandedLevelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CollapseExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CollapseNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"collectLaunchConfigs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"collectWorkspaceStats","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"Color","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Color","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"Color","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Color","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ColorDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorDetector"},{"name":"ColorExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorExtensionPoint"},{"name":"ColorFormat","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorId","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ColorInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"colorize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"colorizeElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"colorizeModelLine","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"Colorizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/colorizer"},{"name":"ColorMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ColorPickerBody","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPickerHeader","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPickerModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerModel"},{"name":"ColorPickerWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPresentation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorPresentation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorPresentation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ColorProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ColorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeData"},{"name":"ColorThemeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorThemeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"colorThemeSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"ColorZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"ColumnSelection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorColumnSelection"},{"name":"combinedAppender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"combinedDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"CombinedInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"CombinedSpliceable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/splice"},{"name":"Command","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"CommandLine","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"CommandOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"commands","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"commands","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"CommandsConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"CommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/commands/common/commandService"},{"name":"commandsExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/menusExtensionPoint"},{"name":"CommandsHistory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/commandsQuickAccess"},{"name":"CommandsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"CommandsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"CommandString","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CommandString","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"CommandTrackerAddon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon"},{"name":"Comment","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CommentBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"CommentContextKeys","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentContextKeys"},{"name":"CommentController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"COMMENTEDITOR_DECORATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentThreadWidget"},{"name":"CommentFormActions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentFormActions"},{"name":"CommentGlyphWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentGlyphWidget"},{"name":"CommentMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentMenus"},{"name":"CommentMode","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CommentMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CommentMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CommentMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/commentMode"},{"name":"CommentNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"CommentNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentNode"},{"name":"CommentNodeRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"comments","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"COMMENTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"COMMENTS_VIEW_TITLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsAsyncDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentService"},{"name":"CommentsList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"CommentsModelVirualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsPanel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsView"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CommitCharacterController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestCommitCharacters"},{"name":"CommonEditorConfiguration","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"CommonFindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"commonlyUsedData","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"commonPrefixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"commonPrefixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"commonSuffixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"CommonTask","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"Comparator","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compare","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"COMPARE_RESOURCE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COMPARE_SELECTED_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COMPARE_WITH_SAVED_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"compareAnything","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareBuild","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compareByPrefix","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareFileExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareFileNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareIdentifiers","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compareIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compareItemsByFuzzyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"compareMarkersByUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"comparePaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareSubstring","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compareSubstringIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"CompareWithClipboardAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CompatChangeAll","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"compile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCompile"},{"name":"compileFunction","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"CompletionContext","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"CompletionItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItem","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemInsertTextRule","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemInsertTextRule","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItemKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItemTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"completionKindFromString","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"completionKindToCssClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionList","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/completionModel"},{"name":"CompletionOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"CompletionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionTriggerKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"Component","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/component"},{"name":"ComposedTreeDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"Composite","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositeBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBar"},{"name":"CompositeDescriptor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBar"},{"name":"CompositeDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CompositeDragAndDropObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CompositeOverflowActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositeOverflowActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositePart","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositePart"},{"name":"CompositeProgressIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"CompositeRegistry","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeScope","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"CompositeSnippetVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"CompositionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"compress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"compressConsecutiveTextChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textChange"},{"name":"CompressedNavigationController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"CompressedObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"CompressibleAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/asyncDataTree"},{"name":"CompressibleObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTree"},{"name":"CompressibleObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"computeCodePoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ComputedEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"computeLinks","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"computeRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"computeScreenAwareSize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"computeStyles","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"config","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"config","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"Config","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"Config","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"Configuration","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"CONFIGURATION_SYNC_STORE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"ConfigurationCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configurationCache"},{"name":"ConfigurationCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/node/configurationCache"},{"name":"ConfigurationChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"ConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationEditingError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationEditingErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ConfigurationManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugConfigurationManager"},{"name":"ConfigurationModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/browser/configurationResolverService"},{"name":"ConfigurationResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService"},{"name":"ConfigurationScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationService"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ConfigurationTargetToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"configurationTelemetry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"ConfigureAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"ConfigureLanguageBasedSettingsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesActions"},{"name":"ConfigureLocaleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/localizationsActions"},{"name":"ConfigureNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"configureOpenerTrustedDomainsHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"ConfigureRecommendedExtensionsCommandsContributor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfigureRuntimeArgumentsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ConfigureTaskAction","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/abstractTaskService"},{"name":"ConfigureWorkspaceFolderRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfigureWorkspaceRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfiguringTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"confirm","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ConfirmResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"CONFLICT_RESOLUTION_CONTEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"CONFLICT_RESOLUTION_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"ConflictDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/bulkEdit/browser/conflicts"},{"name":"connect","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"connect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"connect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"connect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"connect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"connected","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ConnectionGainEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ConnectionLostEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ConnectionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectPrimaryMenuToInlineActionBar","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"connectProxyResolver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/proxyResolver"},{"name":"connectRemoteAgentExtensionHost","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectRemoteAgentManagement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectRemoteAgentTunnel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"CONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"console","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Console","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ConsoleLogInAutomationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/browser/log"},{"name":"ConsoleLogInMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ConsoleLogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ConsoleLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"consolidate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"const","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"constants","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"constants","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"constants","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"constants","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/constants"},{"name":"Constants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"Constants","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"Constants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"ConstantSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"consumeReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeReadableWithLimit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeStreamWithLimit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"contains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"containsDragType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"containsEmoji","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsFullWidthCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsRTL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsUppercaseCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ContentHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverWidgets"},{"name":"contentTracing","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ContentViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ContentWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"ContentWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"context","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Context","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/provideSignatureHelp"},{"name":"Context","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"Context","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"Context","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"CONTEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/toolbar/toolbar"},{"name":"CONTEXT_ACCESSIBILITY_MODE_ENABLED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"CONTEXT_ACTIVE_LOG_OUTPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_AUTH_TOKEN_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"CONTEXT_BREAKPOINT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINT_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINTS_EXIST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINTS_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_CALLSTACK_ITEM_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_CUSTOM_EDITORS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CONTEXT_DEBUG_CONFIGURATION_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_UX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_UX_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_EXPRESSION_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_EXTENSION_HOST_PROFILE_RECORDED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"CONTEXT_FIND_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FIND_WIDGET_NOT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CONTEXT_FOCUSED_SESSION_IS_ATTACH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_BREAKPOINT_WIDGET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_DEBUG_MODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_DEBUG_REPL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_OUTPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_JUMP_TO_CURSOR_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_KEYBINDING_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_KEYBINDINGS_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_KEYBINDINGS_SEARCH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_LOADED_SCRIPTS_ITEM_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_LOADED_SCRIPTS_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_MENU_CHANNEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/common/contextmenu"},{"name":"CONTEXT_MENU_CLOSE_CHANNEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/common/contextmenu"},{"name":"CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"CONTEXT_OUTPUT_SCROLL_LOCK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_PROFILE_SESSION_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"CONTEXT_RENAME_INPUT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/renameInputField"},{"name":"CONTEXT_REPLACE_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_RESTART_FRAME_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_SETTINGS_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_SETTINGS_JSON_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_SETTINGS_SEARCH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_STEP_BACK_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_SYNC_ENABLEMENT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"CONTEXT_SYNC_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"CONTEXT_TOC_ROW_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_UPDATE_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"CONTEXT_VARIABLES_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_WATCH_EXPRESSIONS_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"ContextAwareMenuEntryActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"contextBridge","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ContextKeyAndExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyDefinedExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyEqualsExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyExpr","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyExprType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyFalseExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotEqualsExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotRegexExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyOrExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyRegexExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"ContextKeyTrueExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextMenuController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/contextmenu/contextmenu"},{"name":"ContextMenuHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextMenuHandler"},{"name":"ContextMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextMenuService"},{"name":"ContextMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService"},{"name":"ContextScopedFindInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextScopedHistoryInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextScopedReplaceInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextSubMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/contextmenu"},{"name":"ContextTagKeys","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ContextTagKeys"},{"name":"ContextTagKeys","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ContextView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"ContextViewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextViewService"},{"name":"continue","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CONTINUE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"CONTINUE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"Contracts","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"contrastBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ContributableViewsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"ContributedCustomEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors"},{"name":"ContributedTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"convertBufferRangeToViewport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"convertLinkRangeToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"convertSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeCompatibility"},{"name":"convertSimple2RegExpPattern","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"convertToDAPaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"convertToVSCPaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"ConvolverNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cookies","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"CoordinatesConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"copy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"COPY_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"COPY_PATH_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COPY_RELATIVE_PATH_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COPY_STACK_TRACE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"copyAllCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyAllCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"copyFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"COPYFILE_EXCL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"COPYFILE_FICLONE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"COPYFILE_FICLONE_FORCE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"copyFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"copyFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"CopyLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/copyLinesCommand"},{"name":"copyMatchCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyMatchCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CopyNotificationMessageAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"CopyOptions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaInput"},{"name":"copyPathCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyPathCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CopyTerminalSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"CopyValueAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"CopyWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"CoreEditingCommands","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CoreEditorCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CoreNavigationCommands","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CorrelationContextManager","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/AutoCollection/CorrelationContextManager"},{"name":"count","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"CountBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/countBadge/countBadge"},{"name":"countEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"Counter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"CountQueuingStrategy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"countReset","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"cpus","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"cpuUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"crash","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"crashReporter","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"crashReporterIdStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"create","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"domain"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorSimpleWorker"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkComputer"},{"name":"create","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateWorker"},{"name":"createActionViewItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createAndBindHistoryNavigationWidgetScopedContextKeyService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"createAndFillInActionBarActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createAndFillInContextMenuActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createApiFactoryAndRegisterActors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.api.impl"},{"name":"createBreadcrumbsPicker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"createBreakpointDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution"},{"name":"createBrotliCompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createBrotliDecompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createCancelablePromise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"createCellViewModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel"},{"name":"createChannelReceiver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc"},{"name":"createChannelSender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc"},{"name":"createCipher","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createCipheriv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createConnection","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"createContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"createCSSRule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createCustomTask","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"createDecipher","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDecipheriv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDecorationsForStackFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackEditorContribution"},{"name":"createDecorator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"createDecorator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"createDeflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createDeflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createDiffEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createDiffieHellman","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDiffNavigator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createECDH","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createEditorFromSearchResult","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"createEditorPagePosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"createElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"createError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"createErrorWithActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorsWithActions"},{"name":"createExtHostContextProxyIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"createFakeScopedLineTokens","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/modesTestUtils"},{"name":"createFastDomNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/fastDomNode"},{"name":"createFileEditorInput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"createFileIconThemableTreeContainerScope","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"createFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"createFindMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"createGunzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createGzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createHash","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createHmac","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createHook","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"createImageBitmap","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"createInflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createInflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createInterface","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"createKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"createLineMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"createLineStarts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createLineStartsFast","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createMainContextProxyIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"createMatchers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/textMateScopeMatcher"},{"name":"createMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"createMemoizer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"createMessageOfType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"createMetaElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createMockBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"createMockSession","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/browser/callStack.test"},{"name":"createMockText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"createModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createMonacoBaseAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneBase"},{"name":"createMonacoEditorAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createMonacoLanguagesAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"createMouseMoveEventMerger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseHandler"},{"name":"CreateNewLocalTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote"},{"name":"CreateNewTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"createPrivateKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createProxyObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"createPublicKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createQueuedSender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"createReadStream","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"createReadStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/io"},{"name":"createRegExp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"createRequire","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"createRequireFromPath","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"createResourceExcludeMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"createRotatingLogger","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"createRotatingLogger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/spdlogService"},{"name":"createRotatingLoggerAsync","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"createScanner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"createScopedLineTokens","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"createSecretKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createSecureContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSecurePair","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSecureServer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"createSerializedGrid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"createServer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSign","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createSimpleKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"createSingleEditOp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/commands/shiftCommand.test"},{"name":"createSingleEditOp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test"},{"name":"createSlowExtensionAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions"},{"name":"createSocket","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dgram"},{"name":"createStringBuilder","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"createStubInstance","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"createStyleSheet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createSuggestItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/test/completionModel.test"},{"name":"createSyncDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/descriptors"},{"name":"createTerminalEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"createTestCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"createTextBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactory","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactoryFromSnapshot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactoryFromStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/editorTestUtils"},{"name":"createTextSearchResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"createTOCIterator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"createTokenizationSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchLexer"},{"name":"createTracing","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"trace_events"},{"name":"createUintArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createUnzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createUpdateURL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/abstractUpdateService"},{"name":"createValidator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesValidation"},{"name":"createVerify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createWaitMarkerFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/waitMarkerFile"},{"name":"createWebWorker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/webWorker"},{"name":"createWebWorker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createWriteStream","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Credential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CredentialsContainer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Critical","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"crypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Crypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CryptoKey","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CryptoKeyPair","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSS","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"CSSConditionRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"cssEscape","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"CSSFontFaceRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSGroupingRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSImportRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSKeyframeRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSKeyframesRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSMediaRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSNamespaceRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSPageRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSRuleList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleDeclaration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleSheet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSSupportsRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ctxCommentEditorFocused","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/simpleCommentEditor"},{"name":"ctxHasSymbols","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/symbolNavigation"},{"name":"ctxReferenceSearchVisible","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesController"},{"name":"CurrentLineHighlightOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"CurrentLineMarginHighlightOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"currentSchemaVersion","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"currentSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"Cursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"CursorAtBoundary","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CursorChangeReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorEvents"},{"name":"CursorChangeReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CursorCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCollection"},{"name":"CursorColumns","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorModelState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"CursorMove","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveCommands"},{"name":"CursorMoveCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveCommands"},{"name":"CursorPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveOperations"},{"name":"CursorRedo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorStateChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"cursorStyleToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"cursorTo","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"CursorUndo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorUndoRedoController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorWordAccessibilityLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordPartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CustomEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditors"},{"name":"CustomEditorInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CustomEditorInfoCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CustomEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInput"},{"name":"CustomEditorInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory"},{"name":"CustomEditorModelManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditorModelManager"},{"name":"CustomEditorPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"customEditorsAssociationsSettingId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"CustomEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditors"},{"name":"customEditorsExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/extensionPoint"},{"name":"CustomElementRegistry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"customElements","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CustomEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CustomExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CustomExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CustomExecution2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CustomExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"CUSTOMIZED_TASK_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CustomMenubarControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/menubarControl"},{"name":"CustomTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CustomTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customTextEditorModel"},{"name":"CustomTreeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"cutFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CutWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"cwd","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"cwd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DARK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"darken","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DarwinUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.darwin"},{"name":"data","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/filters.perf.data"},{"name":"Data","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Data"},{"name":"Data","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"Database","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"DataBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DataBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"DataCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataPoint","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPoint"},{"name":"DataPoint","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"DataPointType","kind":"enum","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"DataPointType","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"DataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"DataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"DataTransfer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransferItem","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransferItemList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransfers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/dataTree"},{"name":"DataUri","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"DataView","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Date","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"debounce","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"debug","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"debug","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Debug","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"DEBUG_HELPER_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DebugAdapterExecutable","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterExecutable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugAdapterInlineImplementation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterInlineImplementation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugAdapterServer","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugConsoleMode","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugConsoleMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugContentProvider"},{"name":"debugExceptionWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"debugExceptionWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"DebugExtensionHostAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"debugger","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Debugger","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Debugger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugger"},{"name":"debuggersExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"DebugHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugHover"},{"name":"debugIconContinueForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconDisconnectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconPauseForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconRestartForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStartForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepBackForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepIntoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepOutForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepOverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStopForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debuglog","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"DebugModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"debugPort","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DebugProgressContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugProgress"},{"name":"DebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugService"},{"name":"DebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugSession"},{"name":"DebugStatusContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugStatus"},{"name":"DebugTaskRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugTaskRunner"},{"name":"DebugToolBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugToolBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugToolBarBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"DebugViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugViewlet"},{"name":"Decipher","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"DeclarationProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"declare","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"decode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"decode","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"decode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"decodeSemanticTokensDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/semanticTokensDto"},{"name":"decodeStream","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"decodeURI","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"decodeURIComponent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"decodeUTF16LE","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"decodeUTF8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"decompress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"Decoration","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Decoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DecorationRangeBehavior","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DecorationRangeBehavior","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DecorationRangeBehavior","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DecorationRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DecorationSegment","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"DecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/decorations/decorations"},{"name":"DecorationsOverviewRuler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler"},{"name":"DecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/decorations/browser/decorationsService"},{"name":"DecorationToRender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"DecreaseSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"DecreaseViewSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"DedupOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"deepClone","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"deepEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"deepFreeze","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"deepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"default","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"DEFAULT_COMMANDS_TO_SKIP_SHELL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_CUSTOM_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"DEFAULT_ECDH_CURVE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"DEFAULT_EDITOR_MAX_DIMENSIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_EDITOR_MIN_DIMENSIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_EDITOR_PART_OPTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_ENCODING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"DEFAULT_LABELS_CONTAINER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"DEFAULT_LETTER_SPACING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_LINE_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_LOG_LEVEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"DEFAULT_PRODUCT_ICON_THEME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/productIconThemeData"},{"name":"DEFAULT_PRODUCT_ICON_THEME_SETTING_VALUE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"DEFAULT_SETTINGS_EDITOR_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"DEFAULT_SETTINGS_EDITOR_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"DEFAULT_TERMINAL_OSX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"DEFAULT_VALUE","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"DEFAULT_WORD_REGEXP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"defaultApp","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"defaultBreadcrumbsStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"defaultCipherList","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"defaultClient","kind":"let","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"DefaultConfigurationExportHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper"},{"name":"DefaultConfigurationModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"defaultCoreCipherList","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"defaultCustomEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors"},{"name":"DefaultDeserializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"defaultDialogStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"DefaultElementMapper","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"DefaultEndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"DefaultEndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"defaultGenerator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/idGenerator"},{"name":"defaultInsertColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"defaultKeybindingsContents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultKeybindingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultKeyboardNavigationDelegate","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"defaultListStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"defaultMaxListeners","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"defaultMenuStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"DefaultPaneDndController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"DefaultPreferencesEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"DefaultPreferencesEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"defaultQuickAccessContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"defaultQuickAccessContextKeyValue","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"DefaultQuickAccessFilterValue","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"DefaultRawSettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultRecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"defaultRemoveColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DefaultRoleName","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"defaultSearchConfig","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"DefaultSerializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"DefaultSettings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultSettingsEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"DefaultSettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultSettingsHeaderWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"DefaultSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"defaultSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"defaultStatus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DefaultStyleController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"defaultStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBox"},{"name":"DefaultURITransformer","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"defaultWebSocketFactory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/browserSocketFactory"},{"name":"defaultWindowState","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/window"},{"name":"DefaultWorkerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/worker/defaultWorkerFactory"},{"name":"DeferredPermissionRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeferredPromise","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"define","kind":"const","kindModifiers":"declare","sortText":"4"},{"name":"DefineKeybindingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"DefineKeybindingOverlayWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"DefineKeybindingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"defineTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"DefinitionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToCommands"},{"name":"DefinitionLink","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DefinitionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"deflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateRawSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"DelayedDragHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DelayedPagedModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"Delayer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"DelayNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Delegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"Delegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList"},{"name":"DelegatedLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"DelegatingEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorService"},{"name":"delete","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"DeleteAllLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteAllRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"deleteFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DeleteLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorDeleteOperations"},{"name":"deletePassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"deletePassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"DeleteWordCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordEndLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordEndRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordPartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"DeleteWordPartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"DeleteWordRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordStartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordStartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"delimiter","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"delimiter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"delta","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"DeltaExtensionsResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDescriptionRegistry"},{"name":"departFocus","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"DependsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"deprecate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"Deprecated_RemoteAuthorityContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"describe","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"descriptionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"deserialize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"deserializeEnvironmentVariableCollection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableShared"},{"name":"deserializePipePositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"Deserializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"deserializeSearchError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"desktopCapturer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"DesktopDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"DesktopHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/electron-browser/desktopHostService"},{"name":"DESTRUCTION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"detect","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"detectAvailableShells","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"detectEncodingByBOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/encoding/encoding.test"},{"name":"detectEncodingByBOMFromBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"detectEncodingFromBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"DetectIndentation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"detectModeId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"DeviceAcceleration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceLightEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceMotionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceOrientationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"devicePixelRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceRotationRate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DH_CHECK_P_NOT_PRIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_CHECK_P_NOT_SAFE_PRIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_NOT_SUITABLE_GENERATOR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_UNABLE_TO_CHECK_GENERATOR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"Diagnostic","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Diagnostic","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Diagnostic","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDiagnostics"},{"name":"DiagnosticRelatedInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticRelatedInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticRelatedInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticsChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsIpc"},{"name":"DiagnosticSeverity","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticSeverity","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"DiagnosticsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsIpc"},{"name":"DiagnosticTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"dialog","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Dialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dialog/dialog"},{"name":"DialogChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-browser/dialogIpc"},{"name":"DialogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-main/dialogs"},{"name":"DialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/dialogService"},{"name":"DialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/dialogService"},{"name":"didBindWorkbenchListAutomaticKeyboardNavigation","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"DidChangeContentEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"DidChangeDecorationsEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"didUseCachedData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/timer/electron-browser/timerService"},{"name":"diff","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"diff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"DiffAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"diffBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffChange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diffChange"},{"name":"DiffComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/diff/diffComputer"},{"name":"DiffEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/diffEditorInput"},{"name":"DiffEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/diffEditorModel"},{"name":"DiffEditorState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"DiffEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffEditorWidget"},{"name":"DiffieHellman","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"diffInserted","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"diffInsertedOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffNavigator"},{"name":"diffRemoved","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"diffRemovedOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffReview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffReview"},{"name":"Dimension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"dir","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Dir","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"Dirent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"dirExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"dirname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"dirname","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"dirname","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"DirtyDiffController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyDiffModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyDiffWorkbenchController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"DirtyFilesIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/dirtyFilesIndicator"},{"name":"DirtyWorkingCopiesContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"dirxml","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"DisableAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"DisableAllWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DISABLED_EXTENSIONS_STORAGE_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"DisabledExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"DisableDropDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableForWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableGloballyAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"disconnect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"disconnect","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DISCONNECT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"DISCONNECT_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"DiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/diskFileSystemProvider"},{"name":"DiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/electron-browser/diskFileSystemProvider"},{"name":"DiskSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchService"},{"name":"DispatchConfig","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/dispatchConfig"},{"name":"dispatchEvent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Disposable","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Disposable","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"Disposable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Disposable","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"DisposableStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"disposableTimeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"dispose","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"dispose","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"disposed","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"distinct","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"distinct","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"distinctES6","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"distinctParents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"do","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"doBenchmark","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/benchmark/benchmarkUtils"},{"name":"Dock","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"document","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Document","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"documentationExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint"},{"name":"DocumentationExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint"},{"name":"DocumentFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentFragment","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DocumentHighlight","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentHighlight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentHighlight","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"DocumentHighlightProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentLink","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentLink","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentLink","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentRangeFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentRangeSemanticTokensAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"DocumentRangeSemanticTokensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentSemanticTokensAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"DocumentSemanticTokensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentSymbol","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentSymbol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentSymbol","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentSymbolProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentTimeline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DocumentType","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"doesNotReject","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"doesNotThrow","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"domain","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Domain","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"domain"},{"name":"Domain","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Domain"},{"name":"Domain","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"domainSupportsProperties","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Constants"},{"name":"domainToASCII","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"domainToUnicode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"domContentLoaded","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"DOMError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"domEvent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/event"},{"name":"DOMException","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMImplementation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMLineBreaksComputerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/domLineBreaksComputer"},{"name":"DOMMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMMatrixReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMParser","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMPointReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMQuad","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DomReadingContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"DOMRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMRectList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMRectReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DomScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"DOMSettableTokenList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMStringList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMStringMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMTokenList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"doNotTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"dosDateTimeToDate","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"DOWNLOAD_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DOWNLOAD_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DownloadItem","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"DownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadService"},{"name":"DownloadServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadIpc"},{"name":"DownloadServiceChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadIpc"},{"name":"DragAndDropCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/dnd/dragAndDropCommand"},{"name":"DragAndDropController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/dnd/dnd"},{"name":"DragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DragAndDropObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DragEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DraggedCompositeIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedEditorGroupIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedEditorIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedViewIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DragMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"Driver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-main/driver"},{"name":"DriverChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"DriverChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"Dropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropdownMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropdownMenuActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropDownMenuActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Duplex","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"DuplicateSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DuplicateWorkspaceInNewWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"DynamicsCompressorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DynamicStandaloneServices","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneServices"},{"name":"DynamicViewOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/dynamicViewOverlay"},{"name":"DynamicWebviewEditorOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay"},{"name":"DynamicWorkspaceRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/dynamicWorkspaceRecommendations"},{"name":"E2BIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EACCES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EADDRINUSE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EADDRNOTAVAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EAFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EAGAIN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EALREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBADF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBADMSG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBUSY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECANCELED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECDH","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"ECHILD","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNABORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EDEADLK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EDESTADDRREQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"edit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"EditableConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"EditOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/editOperation"},{"name":"EditOperationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"EditOperationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"editor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"EDITOR_BOTTOM_PADDING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_CONTRIBUTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"EDITOR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_FONT_DEFAULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EDITOR_GROUP_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_EMPTY_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_FOCUSED_EMPTY_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_TABS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_TABS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_MODEL_DEFAULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EDITOR_PANE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_TITLE_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"EDITOR_TOOLBAR_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_TOP_MARGIN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_TOP_PADDING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"EditorActivation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"editorActiveIndentGuides","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorActiveLineNumber","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorActiveLinkForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorAreaVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorAssociationsConfigurationNode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"EditorAutoIndentStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorAutoIndentStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EditorAutoSave","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorAutoSave"},{"name":"editorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorBracketMatchBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorBracketMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorBreadcrumbsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsModel"},{"name":"editorCodeLensForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"EditorCommandsContextActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsContribution"},{"name":"editorConfigurationBaseNode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"EditorContextKeys","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorContextKeys"},{"name":"EditorControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorControl"},{"name":"editorCursorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorCursorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/editor"},{"name":"EditorDropTarget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorDropTarget"},{"name":"editorErrorBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorExtensionsRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"editorFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindRangeHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorFontLigatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"editorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/editorGroup"},{"name":"EditorGroupActiveEditorDirtyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorGroupEditorsCountContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorGroupToViewColumn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/editor"},{"name":"EditorGroupView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorGroupView"},{"name":"editorGutter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorGutterAddedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorGutterDeletedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorGutterModifiedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorHintBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHintForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverStatusBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorInactiveSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorIndentGuides","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorInfoBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorInput","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorKeybindingCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/keybindingCancellation"},{"name":"EditorLayoutInfoComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorLayoutSingleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutThreeColumnsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutThreeRowsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoByTwoGridAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoColumnsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoColumnsBottomAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoRowsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoRowsRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"editorLightBulbAutoFixForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorLightBulbForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorLineHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorLineHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorLineNumbers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorMarkerNavigationBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationInfo","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMatchesToTextSearchResults","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchHelpers"},{"name":"EditorMemento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/baseEditor"},{"name":"EditorModeContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"EditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorModesRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"EditorMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorMouseEventFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorOpenContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"EditorOption","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorOption","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EditorOptions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorOptionsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"editorOverviewRulerBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorPagePosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorPart"},{"name":"EditorPinnedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorPointerEventFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorProgressIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"editorRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorRangeHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorRuler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorScopedQuickInputServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"EditorScroll_","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"EditorScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar"},{"name":"editorSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorService"},{"name":"EditorSimpleWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorSimpleWorker"},{"name":"EditorsObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorsObserver"},{"name":"EditorsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"EditorStateCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"EditorStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"editorSuggestWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetSelectedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"EditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorSymbolHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorSymbolHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewContext"},{"name":"EditorType","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"editorUnnecessaryCodeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorUnnecessaryCodeOpacity","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorWalkThroughAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough"},{"name":"EditorWalkThroughInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough"},{"name":"editorWarningBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorWhitespace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/linesLayout"},{"name":"editorWhitespaces","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetResizeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorWorkerClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorWorkerHost","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorWorkerServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorZoom","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorZoom"},{"name":"EditPreferenceWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"EditStack","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"EDOM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EEXIST","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EFAULT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EFBIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EHOSTUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EIDRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EILSEQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINPROGRESS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINVAL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EISCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EISDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"electron","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Electron","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"ElectronAcceleratorLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"ElectronMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/electron-main/electronMainService"},{"name":"ElectronService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/electron/electron-browser/electronService"},{"name":"ElectronURLListener","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/electron-main/electronUrlListener"},{"name":"ElectronWebviewBasedWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewElement"},{"name":"ElectronWebviewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewService"},{"name":"Element","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ElementsDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"ElementSizeObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/elementSizeObserver"},{"name":"ELOOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"else","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"EmbeddedCodeEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/embeddedCodeEditorWidget"},{"name":"EmbeddedDiffEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/embeddedCodeEditorWidget"},{"name":"embeddedEditorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"EMFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"emit","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"emit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"emitKeypressEvents","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"Emitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"Emitter","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"Emitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"emitWarning","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"EMLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EmmetEditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/emmet/browser/emmetActions"},{"name":"empty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"EmptyExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"EmptyPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"EmptyPaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"emptyProgressRunner","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"EmptyView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/emptyView"},{"name":"EMSGSIZE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EnableAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"EnableAllWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ENABLED_EXTENSIONS_STORAGE_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"enableDebug","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"EnabledExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"EnableDropDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableForWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableGloballyAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Enablement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"EnablementState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"enablePromiseAPIs","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ENAMETOOLONG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"encode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"encode","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"encode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"EncodedTokenizationSupport2Adapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"encodeSemanticTokensDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/semanticTokensDto"},{"name":"encodeStream","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"encodeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"encodeURI","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"encodeURIComponent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"encodeUTF8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"encodingExists","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"encodingExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"EncodingMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EncodingOracle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService"},{"name":"endianness","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"EndOfLine","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EndOfLine","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"EndOfLinePreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"EndOfLinePreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EndOfLineSequence","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"EndOfLineSequence","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"endsWith","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ENETDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENETRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENETUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"Engine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"ENGINE_METHOD_ALL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_CIPHERS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DIGESTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_ECDH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_ECDSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_NONE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_PKEY_ASN1_METHS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_PKEY_METHS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_RAND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_RSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_STORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOBUFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENODATA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENODEV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOENT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOEXEC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOLCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOMEM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOMSG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOPROTOOPT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSPC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSYS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTEMPTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTSUP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ensureFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ensureValidWordDefinition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"Entry","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"enum","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"env","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"env","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"env","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ENV_azurePrefix","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_http_proxy","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_https_proxy","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_iKey","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_profileQueryEndpoint","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"Envelope","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Envelope"},{"name":"Envelope","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"EnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"EnvironmentVariableCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariable"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EnvironmentVariableService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableService"},{"name":"ENXIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EOF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"EOL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"EOPNOTSUPP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EOVERFLOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPERM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTONOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTOTYPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"eq","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"equal","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"equals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"equals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"equalsIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ERANGE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EROFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"error","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Error","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Error","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"ErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ErrorEvent","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/errorTelemetry"},{"name":"errorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"errorHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ErrorHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ErrorScope","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ErrorTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/browser/errorTelemetry"},{"name":"ErrorTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/errorTelemetry"},{"name":"escape","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"escape","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"escape","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"escapeCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"escapeNonWindowsPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"escapeRegExpCharacters","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ESPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ESRCH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"etag","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ETAG_DISABLED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ETIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ETIMEDOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ETXTBSY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"eval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"EvalError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EvaluatableExpression","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EvaluatableExpression","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EvaluatableExpression","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"EvaluatableExpressionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"event","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Event","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Event","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"Event","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"EventBufferer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"EventData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/EventData"},{"name":"EventData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"EventEmitter","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EventEmitter","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"events"},{"name":"EventHelper","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"EventMultiplexer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"eventNames","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"eventNames","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"EventSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EventTarget","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EventType","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"EventType","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/touch"},{"name":"EWOULDBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"exception","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ExceptionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ExceptionData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionData"},{"name":"ExceptionData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ExceptionDetails","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionDetails"},{"name":"ExceptionDetails","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ExceptionWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"ExcludePatternInputWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget"},{"name":"ExcludeSettingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"EXDEV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ExeBasedRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations"},{"name":"exec","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"exec","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/sudo-prompt/index"},{"name":"execArgv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"execFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"execFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"execPath","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"execSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"ExecutableDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"ExecuteCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"ExecuteCommandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ExecuteCommandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"executionAsyncId","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"ExecutionEngine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"ExecutionEngine","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"exists","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"exists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"existsSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"exit","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-watchdog/index"},{"name":"exit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"exitCode","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"EXPAND_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ExpandAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ExpandNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"expectation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"ExperimentActionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"experimental","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/colorRegistry.releaseTest"},{"name":"ExperimentalPrompts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/browser/experimentalPrompt"},{"name":"ExperimentalRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/experimentalRecommendations"},{"name":"ExperimentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"ExperimentState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"ExplorerCompressedFirstFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressedFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressedLastFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressionDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerDecorationsProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerDecorationsProvider"},{"name":"ExplorerDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerFocusCondition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerFolderContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"ExplorerModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"ExplorerResourceCut","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceMoveableToTrash","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceNotReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerRootContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"explorerRootErrorEmitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerService"},{"name":"ExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerView"},{"name":"ExplorerViewletViewsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"ExplorerViewletVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"export","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"exportEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"exports","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Expression","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ExpressionContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"EXT_HOST_CREATION_DELAY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"extends","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"EXTENSION_BADGE_REMOTE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EXTENSION_BADGE_REMOTE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EXTENSION_IDENTIFIER_PATTERN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"EXTENSION_IDENTIFIER_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"EXTENSION_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"ExtensionAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionActivationProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress"},{"name":"ExtensionActivationTimes","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ExtensionActivationTimesBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"extensionButtonProminentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"extensionButtonProminentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"extensionButtonProminentHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionContainers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionData","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"ExtensionData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionDependencyChecker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker"},{"name":"ExtensionDescriptionRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDescriptionRegistry"},{"name":"ExtensionDropDownAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionEditor"},{"name":"ExtensionEditorDropDownAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionEnablementService"},{"name":"ExtensionGalleryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService"},{"name":"ExtensionHostDebugBroadcastChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebugIpc"},{"name":"ExtensionHostDebugChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebugIpc"},{"name":"ExtensionHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService"},{"name":"ExtensionHostLogFileName","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ExtensionHostMain","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostMain"},{"name":"ExtensionHostPersistentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ExtensionHostProcessManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProcessManager"},{"name":"ExtensionHostProcessWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionHost"},{"name":"ExtensionHostProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler"},{"name":"ExtensionHostProfileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService"},{"name":"ExtensionIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"ExtensionIdentifierWithVersion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"ExtensionKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ExtensionKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ExtensionManagementChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionManagementChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionManagementError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementService"},{"name":"ExtensionManagementServerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService"},{"name":"ExtensionManagementServerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/node/extensionManagementService"},{"name":"ExtensionMemento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostMemento"},{"name":"ExtensionMessageCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionPackCountWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"ExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionPointContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/extensionHost.contribution"},{"name":"ExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper.contribution"},{"name":"ExtensionPointUserDelta","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionRecommendationReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"ExtensionRecommendations","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendations"},{"name":"ExtensionRecommendationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService"},{"name":"ExtensionRegistryReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ExtensionRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionResourceLoaderService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService"},{"name":"extensionResultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"extensionResultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/api/extHostSearch.test"},{"name":"extensions","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/jsonschemas/common/jsonContributionRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"Extensions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/contributions"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"Extensions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/output"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/actions"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/editor"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"EXTENSIONS_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionsActivator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ExtensionsAutoProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler"},{"name":"ExtensionScanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionPoints"},{"name":"ExtensionScannerInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionPoints"},{"name":"ExtensionsChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ExtensionsConfigurationInitialContent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionsConfigurationSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionsConfigurationSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionScriptApis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionService"},{"name":"ExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionService"},{"name":"ExtensionsGridView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionsInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsInput"},{"name":"ExtensionsLabel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ExtensionsLifecycle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionLifecycle"},{"name":"ExtensionsListView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"ExtensionsManifestCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionsManifestCache"},{"name":"ExtensionsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionsRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/extensionsSync"},{"name":"ExtensionState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionStoragePaths","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostStoragePaths"},{"name":"ExtensionsTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionsViewletViewsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"ExtensionsViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"ExtensionsWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService"},{"name":"ExtensionTipsChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionTipsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionTipsService"},{"name":"ExtensionToolTipAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"ExtensionWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"external","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"External","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ExternalElementsDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"ExternalThemeTrieElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ExternalUriResolverContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/externalUriResolver"},{"name":"ExtHostApiCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ExtHostApiDeprecationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"ExtHostAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostAuthentication"},{"name":"ExtHostCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostClipboard"},{"name":"ExtHostCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"ExtHostComments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostComments"},{"name":"ExtHostCommentThread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostComments"},{"name":"ExtHostConfigProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"ExtHostConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"ExtHostContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"extHostCustomer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostCustomersRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostDebugConsole","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostDebugService"},{"name":"ExtHostDebugServiceBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDecorations"},{"name":"ExtHostDiagnostics","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDiagnostics"},{"name":"ExtHostDialogs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDialogs"},{"name":"ExtHostDocumentContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentContentProviders"},{"name":"ExtHostDocumentData","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"ExtHostDocumentLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"ExtHostDocuments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocuments"},{"name":"ExtHostDocumentsAndEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentsAndEditors"},{"name":"ExtHostDocumentSaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentSaveParticipant"},{"name":"ExtHostDownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostDownloadService"},{"name":"ExtHostEditorInsets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCodeInsets"},{"name":"ExtHostEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditors"},{"name":"ExtHostExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostExtensionService"},{"name":"ExtHostExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/worker/extHostExtensionService"},{"name":"ExtHostFileSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostFileSystem"},{"name":"ExtHostFileSystemEventService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostFileSystemEventService"},{"name":"ExtHostLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLabelService"},{"name":"ExtHostLanguageFeatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"ExtHostLanguages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguages"},{"name":"extHostLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"ExtHostLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostLogService"},{"name":"ExtHostLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/worker/extHostLogService"},{"name":"ExtHostMessageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostMessageService"},{"name":"extHostNamedCustomer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostNotebookController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookDocument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookOutputRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostOutputChannelBackedByFile","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostOutputService"},{"name":"ExtHostOutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"ExtHostOutputService2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostOutputService"},{"name":"ExtHostProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostProgress"},{"name":"ExtHostPseudoterminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"ExtHostPushOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"ExtHostQuickOpen","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostQuickOpen"},{"name":"ExtHostRpcService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRpcService"},{"name":"ExtHostSCM","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSCM"},{"name":"ExtHostSCMInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSCM"},{"name":"ExtHostSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"ExtHostStatusBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStatusBar"},{"name":"ExtHostStatusBarEntry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStatusBar"},{"name":"ExtHostStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStorage"},{"name":"ExtHostTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTask"},{"name":"ExtHostTaskBase","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ExtHostTerminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"ExtHostTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTerminalService"},{"name":"ExtHostTextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"ExtHostTextEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"ExtHostTheming","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTheming"},{"name":"ExtHostTimeline","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTimeline"},{"name":"ExtHostTreeViews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTreeViews"},{"name":"ExtHostTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"ExtHostTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTunnelService"},{"name":"ExtHostUrls","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUrls"},{"name":"ExtHostVariableResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWebviewEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWebviews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWindow"},{"name":"ExtHostWorkspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWorkspace"},{"name":"extname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"extname","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"extname","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"extract","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"ExtractError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"extractLocalHostUriMetaDataForPortMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/tunnel"},{"name":"extractRangeFromFilter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"extractResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"extractSearchQueryFromLines","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"extractSearchQueryFromModel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"F_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"fail","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"FailedExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"fakeServer","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"fakeServerWithClock","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"FakeXMLHttpRequest","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"FALLBACK_MAX_MEMORY_SIZE_MB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/files"},{"name":"false","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"FastDomNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/fastDomNode"},{"name":"fchmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fdatasync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fdatasyncSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"features","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"FeedbackDropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/feedback/browser/feedback"},{"name":"FeedbackStatusbarConribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem"},{"name":"fetch","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"FetchFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider"},{"name":"File","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"FILE_EDITOR_INPUT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FileBasedRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations"},{"name":"FileChangesEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FileChangeType","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"FileCopiedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/fileDialogService"},{"name":"FileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/fileDialogService"},{"name":"FileDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/editors/fileEditorInput"},{"name":"FileElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsModel"},{"name":"FileElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"FileElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"fileExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"FileFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileIconThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/fileIconThemeData"},{"name":"FileKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FileLocationKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"FileLoggerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/fileLogService"},{"name":"FileLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/fileLogService"},{"name":"FileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"FileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FileMatchOrFolderMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchOrFolderMatchWithResourceFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchOrMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"FileOperation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FilePreview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"FileQueryCacheState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/cacheState"},{"name":"FileReader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FileReferences","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"FileReferencesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"FileResourceMarkersRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"FILES_ASSOCIATIONS_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FILES_EXCLUDE_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FilesConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"FileSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/fileSearchManager"},{"name":"FileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/fileService"},{"name":"FilesExplorerFocusCondition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FilesExplorerFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FilesFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"FileSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FilesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/stateService"},{"name":"FileStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/browser/storageService"},{"name":"FileSystemError","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileSystemError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FileSystemProviderCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileSystemProviderCapabilities","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"FileSystemProviderError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileSystemProviderErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileThemeIcon","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"FileType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"fileURLToPath","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"FileUserDataProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userData/common/fileUserDataProvider"},{"name":"FileWalker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/win32/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nodejs/watcherService"},{"name":"fillResourceDataTransfers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"Filter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"FilteredMatchesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"FilterOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersFilterOptions"},{"name":"filtersAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"filterValidationDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"FilterViewPaneContainer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewsViewlet"},{"name":"finalHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"finally","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"FinalNewLineParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"find","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"FIND_IDS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"findBestWindowOrFolderForFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"FindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"findCredentials","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"findCredentials","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"FindDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findDecorations"},{"name":"findExecutable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalEnvironment"},{"name":"findExpressionInStackFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugHover"},{"name":"findFirstInSorted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"findFreePort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"findFreePortFaster","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"FindInFilesActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FindInFilesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FindInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInput"},{"name":"FindMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"findMatchingThemeRule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMHelper"},{"name":"FindModelBoundToEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"findNodeAtLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"findNodeAtOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"FindOptionOverride","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findState"},{"name":"FindOptionsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findOptionsWidget"},{"name":"FindOrReplaceInFilesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"findParentWithClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"findPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"findPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"FindReplaceState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findState"},{"name":"findRules","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"FindStartFocusAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"findValidPasteFileTarget","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"FindWidgetViewZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"findWindowOnExtensionDevelopmentPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"findWindowOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"findWindowOnWorkspaceOrFolderUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"finished","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"fips","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"FIRST_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"firstIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"FirstMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"firstNonWhitespaceIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"firstOrDefault","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"firstSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"FixAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"fixAllCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"fixCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"fixDriveC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"fixInsert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"fixNewline","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"fixPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"fixRegexNewline","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"flatten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Float32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Float64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FloatingClickWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorWidgets"},{"name":"focus","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"FOCUS_FIRST_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_LAST_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_NEXT_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_PREVIOUS_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_REPL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"FocusAboveGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusActiveEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FocusActiveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusBelowGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"focusBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"focusedCellIndicator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"FocusedViewContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"FocusEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FocusFilesExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FocusFirstGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusLastGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusLeftGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusNavigationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FocusNextGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusNextInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusNextSearchResultAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusPreviousGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusPreviousInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusPreviousSearchResultAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusQueryEditorWidgetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"FocusQueryEditorWidgetCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"FocusRightGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusSearchFromResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"focusSearchListCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusSearchListCommandID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FocusSessionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"FocusSessionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActionViewItems"},{"name":"foldBackgroundBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/folding"},{"name":"FOLDER_CONFIG_FOLDER_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"FolderConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"FolderFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FolderMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FolderMatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"FolderMatchWithResource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FolderSettingsActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"FolderSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"folderSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"foldersToIncludeGlobs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"foldersToRgExcludeGlobs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"FolderThemeIcon","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"FoldingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/folding"},{"name":"FoldingDecorationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingDecorations"},{"name":"FoldingModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"FoldingRange","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FoldingRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FoldingRange","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"FoldingRangeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FoldingRangeKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"FoldingRangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FoldingRangeKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"FoldingRangeProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"FoldingRegion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"FoldingRegions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"FollowerLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"FontInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/fontInfo"},{"name":"FontStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"fontStylePattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"for","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"forEach","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"foreground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ForeignElementType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"fork","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"fork","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"format","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"format","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"format","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"format","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"formatDocumentRangeWithProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentRangeWithSelectedProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentWithProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentWithSelectedProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"formatPII","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"FormatString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"FormattingConflicts","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"FormattingEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/formattingEdit"},{"name":"FormattingMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatWithOptions","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"FormData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FORMERR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"forwardedPortsViewEnabled","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"frameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"frames","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FrankensteinMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/abstractMode"},{"name":"freemem","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"fromBuffer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromFd","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromMap","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"fromNow","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/date"},{"name":"fromRandomAccessReader","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromRangeOrRangeWithMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"fstat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fstatSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"FSWatcher","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/chokidar/types/index"},{"name":"fsync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fsyncSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ftruncate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ftruncateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"function","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Function","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"futimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"futimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fuzzyContains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"fuzzyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"FuzzyScore","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"fuzzyScoreGraceful","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"fuzzyScoreGracefulAggressive","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"GainNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Gamepad","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadButton","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadHapticActuator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadPose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"generateIndent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentUtils"},{"name":"generateKeyPair","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"generateKeyPairSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"generateRandomChunkWithLF","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateRandomEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateRandomPipeName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"generateRandomReplaces","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateSequentialInserts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateTokensCSSForColorMap","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"generateUuid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uuid"},{"name":"Gesture","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/touch"},{"name":"get","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"get","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"getAbsoluteGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"getActiveEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"getActiveNotebookEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"getActiveTextEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"getActiveWebviewEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"getAllMethodNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"getAllPropertyNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"getAppDataPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/paths"},{"name":"getBaseLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"getBasenameTerms","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getBlinkMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getBreakpointMessageAndClassName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"getCharContainingOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getCharIndex","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"getCiphers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getCiphers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"getClientArea","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getCodeActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"getCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"getCodeForKeyCode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/keyboardEvent"},{"name":"getCodeLensData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelens"},{"name":"getColorPresentations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/color"},{"name":"getColorRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"getColors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/color"},{"name":"getComparisonKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"getComputedStyle","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getComputedStyle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getConfigurationKeys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getConfigurationValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getContentHeight","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getContentWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getContext","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerView"},{"name":"getContext","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"getContextForContributedActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"getContextMenuActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"getCorrelationContext","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"getCPUUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getCreationTime","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getCurrentActivationRecord","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"getCurrentKeyboardLayout","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"getCurves","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getCwd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDeclarationsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getDefaultIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getDefaultSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getDefaultShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDefaultShellArgs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDefaultUserDataPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/paths"},{"name":"getDefaultValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"getDefaultValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getDefinitionsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getDelayedChannel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"getDiffieHellman","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getDisallowedIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getDispatchConfig","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/dispatchConfig"},{"name":"getDocumentFormattingEditsUntilResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getDocumentRangeFormattingEditsUntilResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getDocumentSymbols","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/documentSymbols"},{"name":"getDomainsOfRemotes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getDomNodePagePosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getDuration","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEditOperation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCommand"},{"name":"getEditorPartOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"getegid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getElementsByTagName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getEmptyExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getEnabledCategories","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"trace_events"},{"name":"getEncodedLanguageId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"getEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEntry","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"getErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"geteuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getExactExpressionStartAndEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getExcludes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"getExpandedBodySize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"getExtensionHostDebugSession","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getExtensionKind","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"getExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"getExtraColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils"},{"name":"getFileNamesMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"getFirstFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"getGalleryExtensionId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getGalleryExtensionTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getgid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getGraphemeBreakType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getgroups","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getHashedRemotesFromConfig","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getHashes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getHeapCodeStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapSnapshot","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapSpaceStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapStatistics","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getHover","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/getHover"},{"name":"getIconClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputUtils"},{"name":"getIconClasses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"getIconRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"getIdAndVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"getIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"getImplementationsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getInstalledExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"getInvalidTypeError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesValidation"},{"name":"getIOCounters","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getIssueReporterStyles","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueService"},{"name":"getKeyboardLayoutId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"getKeyMap","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"getLangEnvVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getLanguages","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"getLargestChildWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getLastActiveWindow","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"getLeadingWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getLineEndOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"getLineStartOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"getLinks","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"getLocalExtensionTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getLogLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"getMac","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/macAddress"},{"name":"getMachineId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/id"},{"name":"getMachineInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"getMainProcessParentEnv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalEnvironment"},{"name":"getMaliciousExtensionsSet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getManifest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementUtil"},{"name":"getMapForWordSeparators","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"getMatchedCSSRules","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getMaxListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"getMaxListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getMediaMime","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"getMenuBarVisibility","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"getMigratedSettingValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getModelMarkers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getMultiSelectedEditorContexts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"getMultiSelectedResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getNextCodePoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getNextTickChannel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"getNLines","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getNLSConfiguration","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/languagePacks"},{"name":"getNodeColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"getNodeIsInOverviewRuler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"getNodePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNodeType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNodeValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNonWhitespacePrefix","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsService"},{"name":"getOccurrencesAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordHighlighter/wordHighlighter"},{"name":"getOnTypeFormattingEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getOnTypeRenameRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"getOpenEditorsViewMultiSelection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getOrDefault","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"getOrMakeSearchEditorInput","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput"},{"name":"getOrSet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"getOuterEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"getOutOfWorkspaceEditorResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"getOutputSimpleEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform"},{"name":"getPackedSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getParseErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonErrorMessages"},{"name":"getPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"getPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"getPathFromAmdModule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/amd"},{"name":"getPathLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"getPathTerms","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getPixelRatio","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getPlatformTextDecoder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"getPriority","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"getProcessCpuUsage","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProcessList","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProcessMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getProcessTree","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProxyAgent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/node/proxy"},{"name":"getQuickNavigateHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"getRandomElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"getRandomEOLSequence","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomInt","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomTestPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/testUtils"},{"name":"getRealAndSyntheticDocumentFormattersOrdered","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getReferencesAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getReindentEditOperations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"getRelativeLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"getRemoteAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"getRemoteName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"getRemotes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getResizesObserver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/sizeObserver"},{"name":"getResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"getResourceForCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"getSCMResourceContextKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/menus"},{"name":"getScopes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"getSearchView","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"getSelection","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getSelectionKeyboardEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"getSelectionSearchString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"getServers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"getServiceMachineId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/serviceMachineId/common/serviceMachineId"},{"name":"getSettingsTargetName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"getShadowRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getShellEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/shellEnv"},{"name":"getSimpleCodeEditorWidgetOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions"},{"name":"getSimpleEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions"},{"name":"getSimpleWorkspaceLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/label/common/label"},{"name":"getSingletonServiceDescriptors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/extensions"},{"name":"getSnippetSuggestSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"getSpaceCnt","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentUtils"},{"name":"getStackFrameThreadAndSessionToFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugService"},{"name":"getStateLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"getStdinFilePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"getStoredWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"getStringIdentifierForProxy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"GetStringRegKey","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/vscode-windows-registry/index"},{"name":"getSuggestionComparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"getSyncResourceFromLocalPreview","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getSystemMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getSystemShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"getSystemVersion","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getTemplates","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskTemplates"},{"name":"getTerminalShellConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalConfiguration"},{"name":"getThemeTypeSelector","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"getTimeSinceLastZoomLevelChanged","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getTitleBarStyle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"getTokenClassificationRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"getTopLeftOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalHeight","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalScrollWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTypeDefinitionsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getUnpackedSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"getUriFromAmdModule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/amd"},{"name":"getUriFromSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"getUserDataSyncStore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getVisbileViewContextKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"getVisibleAndSorted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getVisibleState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"getWebviewContentMimeType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/mimeTypes"},{"name":"getWellFormedFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"getWindowsBuildNumber","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"getWindowsShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"getWindowsStateStoreData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsStateStorage"},{"name":"getWordAtText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"getWordDefinitionFor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"getWorkerBootstrapUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/worker/defaultWorkerFactory"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspaces"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test"},{"name":"getWorkspaceSymbols","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"getXtermLineContent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"getZoomFactor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"global","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GLOBAL_ACTIVITY_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/activity"},{"name":"GlobalActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"globalAgent","kind":"let","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"globalAgent","kind":"let","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"GlobalCompareResourcesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"GlobalEditorMouseMoveMonitor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"GlobalExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService"},{"name":"globalGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"GlobalMouseMoveMonitor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/globalMouseMoveMonitor"},{"name":"GlobalNewUntitledFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"GlobalRemoveRootFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"globals","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"globalShortcut","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"GlobalStateSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/globalStateSync"},{"name":"GlobalStorageDatabaseChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageIpc"},{"name":"GlobalStorageDatabaseChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageIpc"},{"name":"GlobalStyleSheet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"globalThis","kind":"module","kindModifiers":"","sortText":"4"},{"name":"GlobPattern","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"GlyphHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverWidgets"},{"name":"GlyphMarginOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"GOTO_NEXT_CHANGE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"GOTO_PREVIOUS_CHANGE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"GotoDefinitionAtPositionEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess"},{"name":"GoToLineNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"GotoLineQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess"},{"name":"GotoSymbolAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess"},{"name":"GotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess"},{"name":"gracefulify","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/graceful-fs/index"},{"name":"grammarsExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMGrammars"},{"name":"Graph","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/graph"},{"name":"GraphemeBreakType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Grid","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"GridView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"GridViewSizing","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"group","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"groupBy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"groupBy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"groupByExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"GroupChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"groupCollapsed","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"GroupDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"groupEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"groupIntersect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"GroupLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupOrientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupsArrangement","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"gt","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"gte","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"gtr","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"guessIndentation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/indentationGuesser"},{"name":"guessMimeTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"gunzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gunzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"handleANSIOutput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"handleANSIOutput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"Handler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"handleVetos","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"hang","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"hasChildProcesses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"hasClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"hasFileFolderCopyCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hasFileReadStreamCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"Hash","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"HashChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Hasher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"hashPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/node/backupFileService"},{"name":"hasOpenReadWriteCloseCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hasParentWithClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"hasReadWriteCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"HasSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"hasSiblingFn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"hasSiblingPromiseFn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"hasStdinWithoutTty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"hasTextDecoder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"hasToIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"hasTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"hasUncaughtExceptionCaptureCallback","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"hasWorkspaceFileExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"hc_black","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"HC_THEME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"Headers","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HelpQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/helpQuickAccess"},{"name":"HiddenAreasRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"HiddenRangeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/hiddenRangeModel"},{"name":"hide","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"HIDE_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"HIDE_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"HideNotificationsCenterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"HideWebViewEditorFindCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"HideWelcomeOverlayAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay"},{"name":"HIGH_CONTRAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"HighlightedLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/highlightedlabel/highlightedLabel"},{"name":"HighlightMatchesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"history","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"History","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HistoryInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"HistoryNavigationEnablementContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"HistoryNavigationWidgetContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"HistoryNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/history"},{"name":"HistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/browser/history"},{"name":"HitTestContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"HIVES","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCC","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCR","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCU","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKLM","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKU","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"Hmac","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"homedir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"HorizontalPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"HorizontalRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"HorizontalScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/horizontalScrollbar"},{"name":"horizontalScrollingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"HostExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"hostname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"HotExitConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"Hover","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Hover","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Hover","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"HoverOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverOperation"},{"name":"HoverProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"HoverStartMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverOperation"},{"name":"hrtime","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"HSLA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"HSVA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"HTMLAllCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAnchorElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAppletElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAreaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAudioElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBaseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBaseFontElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBodyElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLButtonElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLCanvasElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDataElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDataListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDetailsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDialogElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDirectoryElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDivElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDocument","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLEmbedElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFieldSetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFontElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFormControlsCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFormElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFrameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFrameSetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHeadElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHeadingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHtmlElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLIFrameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLInputElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLabelElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLegendElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLIElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLinkElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMapElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMarqueeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMediaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMenuElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMetaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMeterElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLModElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLObjectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptGroupElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptionsCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOutputElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLParagraphElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLParamElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLPictureElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLPreElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLProgressElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLQuoteElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLScriptElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSelectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSlotElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSourceElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSpanElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLStyleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableCaptionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableColElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableDataCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableHeaderCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableRowElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableSectionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTemplateElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTextAreaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTimeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTitleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTrackElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLUListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLUnknownElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLVideoElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Http2ServerRequest","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"Http2ServerResponse","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"HttpProxyAgent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/http-proxy-agent/index"},{"name":"IAccessibilityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"IActivityBarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activityBar/browser/activityBarService"},{"name":"IActivityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"IAuthenticationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/browser/authenticationService"},{"name":"IUserDataSyncAccountService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount"},{"name":"IBackupFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backup"},{"name":"IBackupMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backup"},{"name":"IBreadcrumbsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"IBulkEditService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/bulkEditService"},{"name":"ICACLS_PATH","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"IClipboardService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/clipboard/common/clipboardService"},{"name":"ICodeEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorService"},{"name":"ICodeLensCache","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codeLensCache"},{"name":"ICommandService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"ICommentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentService"},{"name":"IconBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"IConfigurationResolverService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolver"},{"name":"IConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"iconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"IconLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/iconLabel/iconLabel"},{"name":"iconsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"IContextKeyService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"IContextMenuService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextView"},{"name":"IContextViewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextView"},{"name":"ICredentialsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/credentials/common/credentials"},{"name":"ICredentialsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/common/credentials"},{"name":"ICustomEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/common/driver"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"ID_EDITOR_WORKER_SERVICE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerService"},{"name":"ID_INDENT_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"ID_INIT_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/intializingRangeProvider"},{"name":"ID_SYNTAX_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"IDBCursor","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBCursorWithValue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBDatabase","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBFactory","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBIndex","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBKeyRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBObjectStore","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBOpenDBRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBTransaction","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBVersionChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDebugHelperService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"IDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"IDecorationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/decorations/browser/decorations"},{"name":"IdentityCoordinatesConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"IdentityLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"IdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"IdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"IdGenerator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/idGenerator"},{"name":"IDiagnosticsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"IDialogMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-main/dialogs"},{"name":"IDialogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"IdleValue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IdObject","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"IDownloadService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/download"},{"name":"idPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"IDriver","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/common/driver"},{"name":"IEditorGroupsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"IEditorProgressService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"IEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"IEditorWorkerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerService"},{"name":"IElectronMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/electron-main/electronMainService"},{"name":"IElectronService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/node/electron"},{"name":"IEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/common/environment"},{"name":"IEnvironmentVariableService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariable"},{"name":"IExperimentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"IExplorerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"IExtensionGalleryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionHostDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebug"},{"name":"IExtensionHostProfileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"IExtensionManagementServerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IExtensionManagementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionRecommendationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IExtensionResourceLoaderService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader"},{"name":"IExtensionService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"IExtensionStoragePaths","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStoragePaths"},{"name":"IExtensionsWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"IExtensionTipsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionUrlHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionUrlHandler"},{"name":"IExternalTerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/common/externalTerminal"},{"name":"IExtHostApiDeprecationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"IExtHostCommands","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"IExtHostConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"IExtHostDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"IExtHostDecorations","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDecorations"},{"name":"IExtHostDocumentsAndEditors","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentsAndEditors"},{"name":"IExtHostExtensionService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"IExtHostInitDataService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostInitDataService"},{"name":"IExtHostOutputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"IExtHostRpcService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRpcService"},{"name":"IExtHostSearch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"IExtHostStorage","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStorage"},{"name":"IExtHostTask","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"IExtHostTerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"IExtHostTimeline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTimeline"},{"name":"IExtHostTunnelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"IExtHostWorkspace","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWorkspace"},{"name":"if","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"ifError","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"IFileDialogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"IFilesConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"IFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"IframeUtils","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/iframe"},{"name":"IFrameWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewElement"},{"name":"IGlobalExtensionEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ignoreBracketsInToken","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"ignoreErrors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IgnoreExtensionRecommendationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"IHistoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/common/history"},{"name":"IHostService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/browser/host"},{"name":"IHostUtils","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"IInstantiationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"IIntegrityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/common/integrity"},{"name":"IIRFilterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/node/issue"},{"name":"IJSONEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"IKeybindingEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingEditing"},{"name":"IKeybindingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybinding"},{"name":"IKeymapService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"ILabelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/label/common/label"},{"name":"ILaunchMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"ILayoutService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/layout/browser/layoutService"},{"name":"ILifecycleMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"ILifecycleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"IListService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"illegalArgument","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"illegalState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ILocalizationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"ILoggerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ILogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"Image","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IMAGE_PREVIEW_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ImageBitmap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ImageBitmapRenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ImageData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IMainProcessService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/mainProcessService"},{"name":"IMarkerData","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"IMarkerDecorationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/markersDecorationService"},{"name":"IMarkerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"IMarkersWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"IMenubarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"IMenuService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ImmortalReference","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"IMMUTABLE_CODE_TO_KEY_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"IMMUTABLE_KEY_CODE_TO_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"IModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelService"},{"name":"IModeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modeService"},{"name":"impactsEditorPartOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"ImplementationProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"implements","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"import","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"importEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"importScripts","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"in","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"inAppPurchase","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"inc","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"IncomingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"IncomingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"IncreaseSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"IncreaseViewSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"incrementFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"IndentAction","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"IndentAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfiguration"},{"name":"IndentAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"IndentationToSpacesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToSpacesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToTabsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToTabsCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/indentRules"},{"name":"IndentGuidesOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/indentGuides/indentGuides"},{"name":"IndentLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"IndentRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"IndentRulesSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/indentRules"},{"name":"IndentUsingSpaces","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentUsingTabs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"index","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"indexedDB","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"INDEXEDDB_LOGS_OBJECT_STORE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"INDEXEDDB_VSCODE_DB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"IndexedDBLogProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"indexOfPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"IndexTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTree"},{"name":"IndexTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"InEditorZenModeContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"Infinity","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"inflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateRawSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"info","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Information","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"inherits","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"INITIAL","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"initialize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.worker"},{"name":"InitializingRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/intializingRangeProvider"},{"name":"InlineDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"InlineDecorationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"InlineDiffMargin","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/inlineDiffMargin"},{"name":"InMemoryBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"InMemoryFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/inMemoryFilesystemProvider"},{"name":"InMemoryLogProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/common/inMemoryLogProvider"},{"name":"InMemoryStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"InMemoryStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"InMemoryTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"innerHeight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"innerWidth","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"INotebookService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"INotificationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"InPlaceReplaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/inPlaceReplace/inPlaceReplaceCommand"},{"name":"inputActiveOptionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputActiveOptionBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"InputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"InputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"InputDeviceInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"InputEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"InputFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"InputFocusedContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"inputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputPlaceholderForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputsSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolverSchema"},{"name":"inputValidationErrorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationErrorBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"InputValidationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"inputValidationWarningBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationWarningBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inQuickPickContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"InQuickPickContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"inQuickPickContextKeyValue","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"inRecentFilesPickerContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"insane","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/insane/insane"},{"name":"InSearchEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"insert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"InsertCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"InsertCodeCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"InsertCursorAbove","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"InsertCursorBelow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"InsertLineAfterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"InsertLineBeforeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"InsertMarkdownCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"inspect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"INSPECT_MAX_BYTES","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"InspectTokensNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"INSTALL_ERROR_INCOMPATIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"INSTALL_ERROR_MALICIOUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"INSTALL_ERROR_NOT_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"InstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallAnotherVersionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallCountWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"InstallExtensionQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess"},{"name":"InstallExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallInOtherServerAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallLocalExtensionsInRemoteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallOperation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"InstallRecommendedExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallSpecificVersionOfExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallVSIXAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallWorkspaceRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"instanceof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"instanceStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"InstantiationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiationService"},{"name":"Int16Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Int32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Int8Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IntegrityServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/node/integrityService"},{"name":"interface","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Interface","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"INTERNAL_CONSOLE_OPTIONS_SCHEMA","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"InternalEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorAction"},{"name":"InternalModelContentChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"IntersectionObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IntersectionObserverEntry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"intersects","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"intervalCompare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"IntervalNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"IntervalTimer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IntervalTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"Intl","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"IOpenerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"IOutputChannelModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"IOutputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"IPadShowKeyboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard"},{"name":"IPanelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/panel/common/panelService"},{"name":"IPathService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/common/pathService"},{"name":"IPCClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ipcMain","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ipcRenderer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"IPCServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"IPeekViewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"IPreferencesSearchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"IPreferencesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"IProductService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/product/common/productService"},{"name":"IProgressService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"IQuickInputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickInput"},{"name":"IRemoteAgentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentService"},{"name":"IRemoteAuthorityResolverService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"IRemoteExplorerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"IReplaceService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/replace"},{"name":"IRequestService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"IResourceIdentityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/common/resourceIdentityService"},{"name":"IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"isAbsolute","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"isAbsolute","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"isAbsolutePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isActive","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-mutex/index"},{"name":"isAncestor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isArray","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isatty","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"isBasicASCII","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isBoolean","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isBoolean","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isBuffer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IsCenteredLayoutContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isChrome","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"ISCMService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"isCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isCompositeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isCompressedFolderName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"isConfigurationOverrides","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"isContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"isDate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isDebuggerMainContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isDecorationOptionsArr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"isDeepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IsDevelopmentContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isDiffEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isDiffEditorConfigurationKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"isDirtyDiffVisible","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"isDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"ISearchHistoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchHistoryService"},{"name":"ISearchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"ISearchWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"isEdge","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isEdgeWebView","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isEditorConfigurationKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"isEditorInputWithOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isElevated","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-is-elevated/index"},{"name":"isEmojiImprecise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isEmptyMarkdownString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"isEmptyObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isEngineValid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"isEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isEqualAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isEqualOrParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isEqualOrParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isError","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isErrorWithActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorsWithActions"},{"name":"isExcludeSetting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"isFalsyOrEmpty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"isFalsyOrWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isFileMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isFilePatternMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isFileToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"isFilterResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"isFinite","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"isFirefox","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isFolderToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"isFullscreen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"IsFullscreenContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"isFullWidthCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isFunction","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isFunction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isFuzzyAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isFuzzyActionArr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isGridBranchNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"isGridBranchNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"ISharedProcessMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-main/sharedProcessMainService"},{"name":"ISharedProcessService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/sharedProcessService"},{"name":"isHighSurrogate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isHTMLElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isIAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isIExtensionIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"isIExtensionIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ISignService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/common/sign"},{"name":"isIMenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"isInDOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isInShadowDOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isIOS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isIP","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isIPad","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isIPv4","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isIPv6","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isISOKeyboard","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"isISubmenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"isKeymapExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"isLanguagePackExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"isLinux","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsLinuxContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isLittleEndian","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isLocationLink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"isLowerAsciiLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isLowSurrogate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"IsMacContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isMacintosh","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsMacNativeContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isMainFrame","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"isMainThread","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"isMarkdownString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"isMaster","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"isMenubarMenuItemAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemSubmenu","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemUriAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMessageOfType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"isMultilineRegexSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"isNamedProblemMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"isNaN","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"isNative","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"ISnippetsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippets.contribution"},{"name":"isNonEmptyArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"isNotificationViewItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"isNull","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNullOrUndefined","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNullRange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"isNumber","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNumber","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isObject","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isOpera","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"isPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isPatternInWord","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"isPrimitive","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isProgressMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isPromiseCanceledError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"isQuote","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"isRawFileWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRawUriWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isReadableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"isRecentFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRecentFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRecentWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRegExp","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isRelativePattern","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"isRemoteConsoleLog","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"isRemoteDiagnosticError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/common/diagnostics"},{"name":"isRootOrDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isRootUser","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isSafari","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isSCMRepository","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSCMResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSCMResourceGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSearchViewFocused","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"isSecureContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"isSelectionRangeChangeEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"isSelectionSingleChangeEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"isSemanticColoringEnabled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"isSerializedEditorGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/editorGroup"},{"name":"isSerializedFileMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSerializedSearchComplete","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSerializedSearchSuccess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSessionAttach","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isShadowRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isSingleFolderWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isSingleFolderWorkspaceInitializationPayload","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isStandalone","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isStatusbarInDebugMode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"isStoredWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isString","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isStringArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isSuccess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"IssueMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/electron-main/issueMainService"},{"name":"IssueReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterMain"},{"name":"IssueReporterModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterModel"},{"name":"issueReporterPage","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterPage"},{"name":"IssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/issue/electron-browser/issueService"},{"name":"IssueType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/node/issue"},{"name":"isSymbol","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IStandaloneThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/standaloneThemeService"},{"name":"IStateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/state"},{"name":"IStaticExtensionsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/staticExtensions"},{"name":"IStatusbarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/statusbar/common/statusbar"},{"name":"isTextEditorPane","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isThemeColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"isThenable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IStorageKeysSyncRegistryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/storageKeys"},{"name":"IStorageMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageMainService"},{"name":"IStorageService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"ISuggestDataDtoField","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"ISuggestMemoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"ISuggestResultDtoField","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"isUNC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isUndefined","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isUndefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isUndefinedOrNull","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isUnspecific","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"isUntitledWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isUpper","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"isUpperAsciiLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isURLDomainTrusted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsValidator"},{"name":"isUTFEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"isUUID","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uuid"},{"name":"isValidBasename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isValidExtensionVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isValidLocalization","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"isValidMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"isValidVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isValidVersionStr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isVersionValid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isWeb","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsWebContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isWebKit","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isWebkitWebView","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isWindows","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsWindowsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isWindowsDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isWorker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"isWorkspaceBackupInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backup"},{"name":"isWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"isWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isWorkspaceToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"ISymbolNavigationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/symbolNavigation"},{"name":"it","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ITaskService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskService"},{"name":"ITelemetryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"ItemActivation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"Iterable","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/iterator"},{"name":"ITerminalInstanceService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"ITerminalNativeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ITerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"ITextFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"ITextMateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"ITextModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/resolverService"},{"name":"ITextResourceConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationService"},{"name":"ITextResourcePropertiesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationService"},{"name":"IThemeMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/electron-main/themeMainService"},{"name":"IThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ITimelineService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"ITimerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/timer/electron-browser/timerService"},{"name":"ITitleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/title/common/titleService"},{"name":"ITunnelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/tunnel"},{"name":"IUndoRedoService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedo"},{"name":"IUntitledTextEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorService"},{"name":"IUpdateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"IURITransformerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUriTransformerService"},{"name":"IURLService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/url"},{"name":"IUserDataAutoSyncService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncBackupStoreService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncLogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncStoreService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncUtilService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IViewDescriptorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"IViewletService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/viewlet/browser/viewlet"},{"name":"IViewsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"IWebIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/browser/issueService"},{"name":"IWebviewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"IWebviewWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"IWindowsMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windows"},{"name":"IWorkbenchEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/common/environmentService"},{"name":"IWorkbenchExtensionEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IWorkbenchIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issue"},{"name":"IWorkbenchLayoutService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"IWorkbenchThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"IWorkingCopyFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileService"},{"name":"IWorkingCopyService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"IWorkspace","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspaceContextService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspaceEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/common/workspaceEditing"},{"name":"IWorkspaceFolder","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspacesHistoryMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService"},{"name":"IWorkspacesMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"IWorkspacesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"IWorkspaceTagsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/common/workspaceTags"},{"name":"javascriptOnEnterRules","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules"},{"name":"join","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"join","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"join","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"JoinAllGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"JoinLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"joinPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"JoinTwoGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"JSON","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"JSONEditingError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"JSONEditingErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"JSONEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditingService"},{"name":"JsonSchemaVersion","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"JsonSchemaVersion","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"JSONValidationExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/jsonValidationExtensionPoint"},{"name":"JUMP_TO_CURSOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"KEEP_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_NOT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_IS_OPEN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_TEXT_NOT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"KEYBINDING_ENTRY_TEMPLATE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/keybindingsEditorModel"},{"name":"KeybindingEditorDecorationsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"KeybindingIO","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingIO"},{"name":"KeybindingLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/keybindingLabel/keybindingLabel"},{"name":"KeybindingParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingParser"},{"name":"KeybindingResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingResolver"},{"name":"KEYBINDINGS_EDITOR_CLEAR_INPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_COPY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_DEFINE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_REMOVE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_RESET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KeybindingsEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingEditing"},{"name":"KeybindingsEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditor"},{"name":"KeybindingsEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"KeybindingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/keybindingsEditorModel"},{"name":"KeybindingSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybinding"},{"name":"KeybindingsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"KeybindingsSearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"KeybindingsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/keybindingsSync"},{"name":"KeybindingWeight","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"KeybindingWidgetRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"KEYBOARD_LAYOUT_OPEN_PICKER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KeyboardEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"KeyboardLayoutContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution"},{"name":"KeyboardLayoutPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker"},{"name":"KeyboardLayoutPickerContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker"},{"name":"KeyboardMapperFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService"},{"name":"keyboardNavigationSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"KeyboardSupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/canIUse"},{"name":"KeyChord","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"KeyCode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"KeyCodeUtils","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyedTaskIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"KeyframeEffect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"keyFromOverrideIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"KeymapExtensions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"KeymapInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"KeymapRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/keymapRecommendations"},{"name":"KeyMod","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyMod","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneBase"},{"name":"KeyMod","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"KeyObject","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"keyof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"keys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"KeytarCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/credentials/node/credentialsService"},{"name":"KeytarCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/node/credentialsService"},{"name":"KeyValueLogProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/common/keyValueLogProvider"},{"name":"kill","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"KillTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"kMaxLength","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"knownAcronyms","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"KnownSnippetVariableNames","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"knownTermMappings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"kStringMaxLength","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"Label","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"LabelContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/remote.contribution"},{"name":"LabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/label/common/labelService"},{"name":"language","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Language","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"LanguageConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageConfigurationFileHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint"},{"name":"LanguageConfigurationRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageConfigurationRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageFeatureRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageFeatureRegistry"},{"name":"LanguageId","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LanguageIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LanguagePackCachedDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner"},{"name":"languages","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"languages","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"LanguageSelector","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"languagesExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/mode/common/workbenchModeService"},{"name":"LanguagesRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/languagesRegistry"},{"name":"LanguageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"LargeFileOptimizationsWarner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/largeFileOptimizations"},{"name":"LAST_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"lastIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"lastNonWhitespaceIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"lastSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"LAUNCH_CONFIGURATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"LaunchMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"launchSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"launchSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"layout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"Layout","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/layout"},{"name":"LAYOUT_EDITOR_GROUPS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"LayoutAnchorPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"LayoutController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"LayoutData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget"},{"name":"LayoutPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"LazilyResolvedWebviewEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"Lazy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lazy"},{"name":"lazyEnv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"LazyOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"LazyPromise","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/lazyPromise"},{"name":"lchmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"LcsDiff","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"lcut","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"leftest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"leftRotate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"LEGACY_CONSOLE_MODE_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"legacy_ENV_iKey","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"length","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"let","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"lexer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Lexer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"LifecycleMainPhase","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"LifecycleMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"LifecyclePhase","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"LifecyclePhaseToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"LIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"LightBulbWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/lightBulbWidget"},{"name":"lighten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Limiter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"LineBreakData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"LineCommentCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/lineCommentCommand"},{"name":"LineContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/completionModel"},{"name":"LineContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"LineDecoder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/decoder"},{"name":"LineDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"LineDecorationsNormalizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"LineNumbersOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers"},{"name":"LinePartMetadata","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"LineProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"LineRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"LinesDecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations"},{"name":"LinesLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/linesLayout"},{"name":"LineStarts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"LineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/lineTokens"},{"name":"LineTokens2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"LineVisibleRanges","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"link","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Link","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"Link","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/browser/link"},{"name":"LINK_INTERCEPT_THRESHOLD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"LinkComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"LinkDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/links"},{"name":"LinkDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/linkDetector"},{"name":"LinkedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedList"},{"name":"LinkedMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"LinkedText","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedText"},{"name":"LinkProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LinksList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"linkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"linuxDistro","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"LinuxDistro","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"LinuxExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"LinuxUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.linux"},{"name":"List","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"listActiveSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listActiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listDeemphasizedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ListDragOverEffect","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"ListDragOverReactions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"listDropBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listenerCount","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"listenerCount","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"listenerCount","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"listeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"listeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ListeningStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ListError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"listErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetNoMatchesOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFocusBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFocusForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHoverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveFocusBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInvalidItemForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listProcesses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ps"},{"name":"ListResourceNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"ListService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"ListSettingListModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ListSettingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ListView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"listWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"loadavg","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"LOADED_SCRIPTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"LoadedScriptsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/loadedScriptsView"},{"name":"LoaderEvent","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"LoaderEventType","kind":"enum","kindModifiers":"declare","sortText":"4"},{"name":"LOADIPHLPAPI","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"loadLocalResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"loadWASM","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"LOCAL_MACHINE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"locale","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"LocalInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"LocalizationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/node/localizations"},{"name":"LocalizationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/localizations/electron-browser/localizationsService"},{"name":"LocalizationWorkbenchContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/localizations.contribution"},{"name":"localize","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/nls"},{"name":"localize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/nls.mock"},{"name":"localizeManifest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionNls"},{"name":"LocalSearchProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"LocalSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchService"},{"name":"LocalSelectionTransfer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"localStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"location","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"location","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Location","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Location","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Location","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"locationbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"log","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"log","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"log","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"log","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"log","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"LOG_MIME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LOG_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LOG_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LogAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"LogContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputServices"},{"name":"Logger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionPoints"},{"name":"LoggerChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"LoggerChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"LoggerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/loggerService"},{"name":"LogLevel","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"LogLevel","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"LogLevel","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"LogLevel","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"LogLevel","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"logOnceWebWorkerWarning","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"logRemoteEntry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/remoteConsoleUtil"},{"name":"LogsDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsDataCleaner"},{"name":"LogsDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner"},{"name":"LogServiceAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"logStorage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"LogViewer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/logViewer"},{"name":"LogViewerInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/logViewer"},{"name":"LONG_LINE_BOUNDARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"LongRunningOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"lookup","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"lookupService","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"LowerCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"LRUCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"LRUMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"lstat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lstat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"lstatSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lt","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"lte","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ltr","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ltrim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"lutimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lutimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"MacExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"machineIdKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"machineOverridableSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"machineSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"machineSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"MacLinuxFallbackKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper"},{"name":"MacLinuxKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"macLinuxKeyboardMappingEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/web.main"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cli"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/desktop.main"},{"name":"Main","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"MainContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"mainLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"mainModule","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"MainPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/mainPane"},{"name":"MainPaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/mainPane"},{"name":"MainProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/mainProcessService"},{"name":"MAINTAIN_UNDO_REDO_STACK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"MainThreadAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadAuthentication"},{"name":"MainThreadAuthenticationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadAuthentication"},{"name":"MainThreadClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadClipboard"},{"name":"MainThreadCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadCommands"},{"name":"MainThreadCommentController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadComments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadCommentThread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadConfiguration"},{"name":"MainThreadConsole","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadConsole"},{"name":"MainThreadDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDebugService"},{"name":"MainThreadDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDecorations"},{"name":"MainThreadDiagnostics","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDiagnostics"},{"name":"MainThreadDialogs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDialogs"},{"name":"MainThreadDocumentContentProviders","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocumentContentProviders"},{"name":"MainThreadDocumentRangeSemanticTokensProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadDocuments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocuments"},{"name":"MainThreadDocumentsAndEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors"},{"name":"MainThreadDocumentSemanticTokensProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadDownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDownloadService"},{"name":"MainThreadEditorInsets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadCodeInsets"},{"name":"MainThreadErrors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadErrors"},{"name":"MainThreadExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadExtensionService"},{"name":"MainThreadFileSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadFileSystem"},{"name":"MainThreadFileSystemEventService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService"},{"name":"MainThreadKeytar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadKeytar"},{"name":"MainThreadLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLabelService"},{"name":"MainThreadLanguageFeatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadLanguages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguages"},{"name":"MainThreadLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLogService"},{"name":"MainThreadMessageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadMessageService"},{"name":"MainThreadNotebookController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadNotebookDocument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadNotebooks","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadOutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadOutputService"},{"name":"MainThreadProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadProgress"},{"name":"MainThreadQuickOpen","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen"},{"name":"MainThreadSCM","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSCM"},{"name":"MainThreadSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSearch"},{"name":"MainThreadStatusBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadStatusBar"},{"name":"MainThreadStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadStorage"},{"name":"MainThreadTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTask"},{"name":"MainThreadTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTelemetry"},{"name":"MainThreadTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTerminalService"},{"name":"MainThreadTextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditor"},{"name":"MainThreadTextEditorProperties","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditor"},{"name":"MainThreadTextEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditors"},{"name":"MainThreadTheming","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTheming"},{"name":"MainThreadTimeline","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTimeline"},{"name":"MainThreadTreeViews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTreeViews"},{"name":"MainThreadTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTunnelService"},{"name":"MainThreadUrls","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadUrls"},{"name":"MainThreadWebviews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWebview"},{"name":"MainThreadWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWindow"},{"name":"MainThreadWorkspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWorkspace"},{"name":"major","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"MakeAddress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"MaliciousExtensionChecker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"MaliciousStatusLabelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ManageAuthorizedExtensionURIsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionUrlHandler"},{"name":"ManageAutomaticTaskRunning","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks"},{"name":"ManageExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ManageExtensionsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess"},{"name":"ManagementPersistentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"manageTrustedDomainSettingsCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"MANIFEST_CACHE_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"Map","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"mapArrayOrNot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"mapPager","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"mapToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"Margin","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/margin/margin"},{"name":"MarginViewLineDecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations"},{"name":"MarginViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"mark","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"markAsFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"MarkdownCellRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"MarkdownCellViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel"},{"name":"markdownEscapeEscapedCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"MarkdownRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/markdown/markdownRenderer"},{"name":"MarkdownRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/mdRenderer"},{"name":"MarkdownString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"MarkdownString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"MarkdownString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"MarkdownString","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"markdownUnescapeCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"marked","kind":"alias","kindModifiers":"declare","sortText":"4"},{"name":"markedStringsEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"Marker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"Marker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"MarkerController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoError"},{"name":"MarkerDecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/markerDecorationsServiceImpl"},{"name":"MarkerNavigationWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"MarkerRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markerService"},{"name":"MarkerSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"MarkerSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MarkerSeverity","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"MarkersFilterActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"MarkersFilters","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"MarkersModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"MarkersTreeAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkersView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersView"},{"name":"MarkersViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkersWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"MarkerTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"MarkerTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MarkerTag","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"MarkerViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"markTimeline","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"mas","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"match","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"match","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"Match","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"MATCHES_LIMIT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"matchesCamelCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesContiguousSubString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzy2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzyCodiconAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"matchesPrefix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesScheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"matchesStrictPrefix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesSubString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesWords","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"MatchFindAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"MatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"matchMedia","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"Math","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MAX_BYTES_ON_DISK","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"MAX_CONNECTION_FAILURES_BEFORE_WARN","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"MAX_FILE_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MAX_FOLDING_REGIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"MAX_HEAP_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MAX_LINE_NUMBER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"MAX_OUTPUT_LENGTH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"MAX_VALUE_RENDER_LENGTH_IN_VIEWLET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"maxHeaderSize","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"MaximizeGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"maxSatisfying","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"mayIncludeActionsOfKind","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"measure","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Measurement","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"MediaDeviceInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaDevices","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaElementAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaEncryptedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeyMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeys","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeySession","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeyStatusMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeySystemAccess","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaQueryList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaQueryListEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamAudioDestinationNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrackAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Memento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/memento"},{"name":"memoize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"memory","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Memory","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"memoryUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Menu","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Menu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"MENU_ESCAPED_MNEMONIC_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"MENU_MNEMONIC_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"menuBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menubar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Menubar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/electron-main/menubar"},{"name":"MenuBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menubar"},{"name":"MENUBAR_SELECTION_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MENUBAR_SELECTION_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MENUBAR_SELECTION_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MenubarControl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/menubarControl"},{"name":"MenubarMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/electron-main/menubarMainService"},{"name":"MenubarService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/menubar/electron-browser/menubarService"},{"name":"menuBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuEntryActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"menuForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuId","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"MenuItem","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"MenuItemAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"MenuItemExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"MenuPreventer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/menuPreventer"},{"name":"MenuRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"menuSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSelectionBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSeparatorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/menuService"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/extensionsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/keybindingsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/globalStateMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/snippetsMerge"},{"name":"mergeAllGroups","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"mergeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"mergeCommonContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCommonHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCurrentContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCurrentHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MergedEnvironmentVariableCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableCollection"},{"name":"mergeEnvironments","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"MergeGroupMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"mergeIncomingContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeIncomingHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergePagers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"mergeSort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"MergeWindowTabsHandlerHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"MessageChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessageChannel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"MessageController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/message/messageController"},{"name":"MessageData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MessageData"},{"name":"MessageData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"MessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessagePort","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessagePort","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"Messages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/messages"},{"name":"MessageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"MessageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"METHODS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"MetricData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MetricData"},{"name":"MetricData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"MIME_BINARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MIME_TEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MIME_UNKNOWN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MimeType","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MimeTypeArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MimeTypeRendererResolver","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"mimeTypeSupportedByCore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"MIN_MAX_MEMORY_SIZE_MB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/files"},{"name":"Minimap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimap"},{"name":"MINIMAP_GUTTER_WIDTH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"minimapBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MinimapCharRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharRenderer"},{"name":"MinimapCharRendererFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharRendererFactory"},{"name":"minimapError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapGutterAddedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"minimapGutterDeletedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"minimapGutterModifiedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MinimapLinesRenderingData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"MinimapPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"MinimapPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"minimapSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderActiveBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MinimapTokensColorTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/minimapTokensColorTracker"},{"name":"minimapWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimist","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/minimist/index"},{"name":"MinimizeOtherGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MINIMUM_LETTER_SPACING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"minimumTranslatedStrings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/minimalTranslations"},{"name":"minor","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"minSatisfying","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"minVersion","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"MirrorTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/mirrorTextModel"},{"name":"MissingDependencyError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"mixin","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"mkdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdirp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"mkdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdtemp","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdtempSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mnemonicButtonLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"mnemonicMenuLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"mocha","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Mocha","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"mock","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"MockContextKeyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/test/common/mockKeybindingService"},{"name":"MockDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/test/common/mockKeybindingService"},{"name":"MockMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/mockMode"},{"name":"MockObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/mockSearchTree"},{"name":"MockRawSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockTextAreaWrapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/controller/textAreaState.test"},{"name":"ModelBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"ModelConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"ModelDecorationMinimapOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelDecorationOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelDecorationOverviewRulerOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelRawContentChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawEOLChanged","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawFlush","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLineChanged","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLinesDeleted","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLinesInserted","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"ModelTransientSettingWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/abstractCodeEditorService"},{"name":"ModesContentHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/modesContentHover"},{"name":"ModeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modeServiceImpl"},{"name":"ModesGlyphHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/modesGlyphHover"},{"name":"ModesHoverController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hover"},{"name":"ModesRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"MODIFIED_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"modifiedItemIndicator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ModifierLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"modify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"modifySearchEditorContextLinesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"module","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Module","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"monaco","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"MonacoEnvironment","kind":"let","kindModifiers":"declare","sortText":"4"},{"name":"MonarchBracket","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"MonarchTokenizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchLexer"},{"name":"monitorEventLoopDelay","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"MonospaceLineBreaksComputerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/monospaceLineBreaksComputer"},{"name":"MouseController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"MouseEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MouseHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseHandler"},{"name":"MouseTarget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"MouseTargetFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"MouseTargetType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"MouseTargetType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MouseWheelClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"move","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"move","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MOVE_ACTIVE_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"MOVE_FILE_TO_TRASH_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"moveBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MoveCaretCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/caretOperations/moveCaretCommand"},{"name":"MoveCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"moveCursor","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"MoveEditorLeftInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorRightInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToAboveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToBelowGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToFirstGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToLastGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToLeftGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToNextGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToPreviousGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToRightGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"moveFileToTrashHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"MoveFocusedViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"MoveGroupDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupUpAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/moveLinesCommand"},{"name":"MoveOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveOperations"},{"name":"MoveSelectionToNextFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MoveSelectionToPreviousFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"moveTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MoveToNextChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MoveToPreviousChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MoveWindowTabToNewWindowHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"MoveWordCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"MSAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSBlobBuilder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"msContentScript","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOCredentialAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOSignature","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOSignatureAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGesture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGestureEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGraphicsTrust","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSInputMethodContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyNeededEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeys","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeySession","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSPointerEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"msWriteProfilerMark","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MultiCursorSelectionController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSelectionControllerAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSessionResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultilineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultilineTokens2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultilineTokensBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultiModelEditStackElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"MultipleEditorGroupsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"MultiplexLayoutController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"MultiplexLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"multiSelectModifierSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"MutableDisposable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"MutationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MutationObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MutationRecord","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Mutex","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-mutex/index"},{"name":"MyArray","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"MyEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/parts/editor/baseEditor.test"},{"name":"MyOtherEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/parts/editor/baseEditor.test"},{"name":"name","kind":"const","kindModifiers":"declare","sortText":"4"},{"name":"NamedNodeMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"namespace","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Namespace","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"NaN","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NativeAccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/accessibility/electron-browser/accessibilityService"},{"name":"NativeBackupTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/electron-browser/backupTracker"},{"name":"NativeClipboardService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/clipboard/electron-browser/clipboardService"},{"name":"NativeExtHostSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostSearch"},{"name":"nativeImage","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeImage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService"},{"name":"NativePathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/electron-browser/pathService"},{"name":"NativeRequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/request/electron-browser/requestService"},{"name":"NativeResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"NativeResourceIdentityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/node/resourceIdentityServiceImpl"},{"name":"NativeSimpleFileDialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/simpleFileDialog"},{"name":"NativeStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageService"},{"name":"NativeTelemetryOptOut","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut"},{"name":"NativeTextFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/electron-browser/textFileEditor"},{"name":"NativeTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService"},{"name":"NativeTextSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/textSearchManager"},{"name":"nativeTheme","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/update/electron-browser/updateService"},{"name":"NativeWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/window"},{"name":"NativeWorkbenchEnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/electron-browser/environmentService"},{"name":"NativeWorkspaceEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService"},{"name":"NativeWorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/electron-browser/workspacesService"},{"name":"NavigateBackwardsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateBetweenGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateForwardAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateLastAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateToLastEditLocationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigationModeAddon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/navigationModeAddon"},{"name":"NavigationPreloadManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"navigator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Navigator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"neq","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"net","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"netLog","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"networkInterfaces","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"never","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NEVER_MEASURE_RENDER_TIME_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"NeverShowAgainScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"new","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NEW_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewEditorGroupAboveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupBelowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewExplorerItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"NewFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"NewWindowAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"newWindowCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"NewWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"newWriteableBufferStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"newWriteableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"NEXT_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"nextCharLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"NextCommentThreadAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"NextMarkerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoError"},{"name":"NextMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextMatchFindAction2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"NextSelectionMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextSideBarViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"nextTick","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"nextTick","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"NO_KEY_MODS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"noAsar","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"NODATA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Node","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"nodeAcceptEdit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"NodeCachedDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner"},{"name":"NodeClient","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/NodeClient"},{"name":"NodeColor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"NodeColor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"NodeDebugHelperService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugHelperService"},{"name":"NodeFilter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NodeIterator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NodeJS","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"NodeList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"noDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"nodeReadableToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"NodeSocket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"nodeSocketFactory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/node/nodeSocketFactory"},{"name":"nodesToArrays","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/browser/ui/grid/util"},{"name":"nodeStreamToVSBufferReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"NodeTestBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test"},{"name":"NoEditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"noIntlCompareFileNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"NOMEM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NoMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"NONAME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NoOpNotification","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NoOpProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NoOpWorkspaceTagsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/browser/workspaceTagsService"},{"name":"normalize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"normalize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"normalizeDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"normalizeExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"normalizeFileChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/watcher"},{"name":"normalizeGitHubUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/common/issueReporterUtil"},{"name":"normalizeNFC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"normalizeNFD","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"normalizePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"normalizeRoots","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/chokidarWatcherService"},{"name":"normalizeVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"NoTabsTitleControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/noTabsTitleControl"},{"name":"notDeepEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"notDeepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"notebook","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"NOTEBOOK_CELL_EDITABLE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_MARKDOWN_EDIT_MODE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_RUN_STATE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_TYPE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_DISPLAY_ORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NOTEBOOK_EDITABLE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_EDITOR_CURSOR_BOUNDARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NOTEBOOK_EDITOR_EDITABLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EDITOR_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EXECUTING_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_VIEW_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NotebookCellList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/notebookCellList"},{"name":"NotebookCellListDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"NotebookCellMetadataDefaults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel"},{"name":"NotebookCellTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel"},{"name":"NotebookCodeEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebook.contribution"},{"name":"notebookDocumentMetadataDefaults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookEditorCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"NotebookEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditorInput"},{"name":"NotebookEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditorInput"},{"name":"NotebookEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookEventDispatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookFindWidget"},{"name":"NotebookLayoutChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookMetadataChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"notebookOutputContainerColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookOutputRendererInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer"},{"name":"NotebookOutputRendererInfoStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"notebookProviderExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/extensionPoint"},{"name":"NotebookProviderInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookProvider"},{"name":"NotebookProviderInfoStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"NotebookRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookRegistry"},{"name":"notebookRendererExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/extensionPoint"},{"name":"NotebookService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"NotebookTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/model/notebookTextModel"},{"name":"NotebookViewEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel"},{"name":"notEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"NOTFOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Notification","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Notification","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NotificationActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"NotificationChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationHandle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NOTIFICATIONS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_HEADER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_HEADER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_ERROR_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_INFO_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_LINKS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_TOAST_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_WARNING_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NotificationsAlerts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsAlerts"},{"name":"NotificationsCenter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCenter"},{"name":"NotificationsCenterVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/notification/common/notificationService"},{"name":"NotificationsFilter","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NotificationsList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsList"},{"name":"NotificationsListDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NotificationsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationsStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsStatus"},{"name":"NotificationsToasts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsToasts"},{"name":"NotificationsToastsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationTemplateRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NotificationViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationViewItemContentChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationViewItemProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NOTIMP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NotImplementedError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"NOTINITIALIZED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"notStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"NsfwWatcherService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/nsfwWatcherService"},{"name":"null","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NULL_LANGUAGE_IDENTIFIER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NULL_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NULL_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NullApiDeprecationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"NullAppender","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"NullCommandService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"nullExtensionDescription","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"NullExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"NullFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/test/common/nullFileSystemProvider"},{"name":"NullLifecycleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"NullLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"NullOpenerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"nullRange","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"NullTelemetryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"nullTokenize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"nullTokenize2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"number","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Number","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NumberBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"O_APPEND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_CREAT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DIRECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DIRECTORY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DSYNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_EXCL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOATIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOCTTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOFOLLOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NONBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_RDONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_RDWR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_SYMLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_SYNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_TRUNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_WRONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"object","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Object","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ObjectIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"ObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTree"},{"name":"ObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTreeModel"},{"name":"off","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"OfflineAudioCompletionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OfflineAudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"offscreenBuffering","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OffscreenCanvas","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OffscreenCanvasRenderingContext2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ok","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"ok","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/assert"},{"name":"on","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"on","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"onabort","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onafterprint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationcancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationiteration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onauxclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onbeforeprint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onbeforeunload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onblur","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncanplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncanplaythrough","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"once","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"once","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"events"},{"name":"once","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/functional"},{"name":"once","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"onchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onclose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncompassneedscalibration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncontextmenu","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncuechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondblclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondevicelight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondevicemotion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondeviceorientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondeviceorientationabsolute","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onDidChangeFullscreen","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"onDidChangeKeyboardLayout","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"onDidChangeModelLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"onDidChangeZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"onDidCreateEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"onDidCreateModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"ondrag","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragexit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondrop","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondurationchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OneCursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/oneCursor"},{"name":"OneLineRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"onemptied","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onended","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnEnterSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/onEnter"},{"name":"oneOf","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"OneReference","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"OneReferenceRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"onerror","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OneSnippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetSession"},{"name":"onExtensionChanged","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"onfocus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ongotpointercapture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onhashchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnigScanner","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"OnigString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"oninput","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oninvalid","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeydown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeypress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeyup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"onlanguagechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ONLINE_SERVICES_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"onload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadeddata","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadedmetadata","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onlostpointercapture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmessage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmessageerror","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousedown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousemove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousewheel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturedoubletap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgestureend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturehold","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturestart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturetap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsinertiastart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointercancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerdown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointermove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onoffline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ononline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onorientationchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpagehide","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpageshow","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpause","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onplaying","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointercancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerdown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointermove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpopstate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onprogress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onratechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onreadystatechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onrejectionhandled","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onreset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onresize","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onscroll","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsecuritypolicyviolation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onseeked","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onseeking","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselectionchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselectstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onstalled","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onstorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsubmit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsuspend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontimeupdate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontoggle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchcancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchmove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitioncancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionrun","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnTypeFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"OnTypeRenameAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"OnTypeRenameContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"OnTypeRenameProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"onUnexpectedError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"onUnexpectedExternalError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"onunhandledrejection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onunload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvolumechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayactivate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayblur","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayconnect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaydeactivate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaydisconnect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayfocus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypointerrestricted","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypointerunrestricted","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypresentchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onwaiting","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onwheel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onWillDisposeModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"open","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"OPEN_CREATE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_EDITOR_AT_INDEX_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"OPEN_PRIVATECACHE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_READONLY","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_READWRITE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_SHAREDCACHE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_TO_SIDE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OPEN_URI","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OpenAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"openBreakpointSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"OpenContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"OpenDebugConsoleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugViewlet"},{"name":"opendir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"opendirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"OpenEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"OpenEditorsFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"OpenEditorsGroupContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OpenEditorsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/openEditorsView"},{"name":"OpenEditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"opener","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OpenerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/openerService"},{"name":"OpenerValidatorContributions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsValidator"},{"name":"OpenExplorerViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files.contribution"},{"name":"OpenExtensionLogsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/electron-browser/logsActions"},{"name":"OpenExtensionsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions"},{"name":"OpenExtensionsViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"OpenFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenFileFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"openFilePreserveFocusHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"OpenFirstEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenFolderAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenInEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"OpenInEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenIssueReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenIssueReporterActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/common/commands"},{"name":"OpenLastEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenLatestReleaseNotesInBrowserAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"OpenLocalFileCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLocalFileFolderCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLocalFolderCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLogsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/electron-browser/logsActions"},{"name":"OpenMatchToSide","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"openModeSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"OpenNewEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenNewEditorToSideCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenNextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenProcessExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueActions"},{"name":"OpenRecentAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"OpenResultsInEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"OpenSearchEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"OpenSearchEditorToSideAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"openSearchView","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"OpenSearchViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"openStdin","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"openSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"OpenUrlAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/url.contribution"},{"name":"OpenViewPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"OpenWebviewDeveloperToolsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"openWindowCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OpenWindowSessionLogFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsActions"},{"name":"OpenWithAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenWorkspaceButtonContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorWidgets"},{"name":"OpenWorkspaceConfigFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OperatingSystem","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Option","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"optional","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"OPTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"or","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"OrganizeImportsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"organizeImportsCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"orientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Orientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"origin","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"originalFSPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"orthogonal","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"OS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"OS_PROVIDES_FILE_PROTECTION","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"OscillatorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"outerHeight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"outerWidth","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OutgoingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"OutlineAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineConfigKeys","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineElementTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineGroupTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineItemComparator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlinePane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/outline/browser/outlinePane"},{"name":"OutlineSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineViewFiltered","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineViewFocused","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineViewId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineVirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutOfProcessWin32FolderWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/win32/csharpWatcherService"},{"name":"OUTPUT_MIME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OutputAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/node/outputAppender"},{"name":"OutputBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingIO"},{"name":"OutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"OutputChannelModelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModelService"},{"name":"OutputChannelModelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/electron-browser/outputChannelModelService"},{"name":"OutputEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputView"},{"name":"OutputLinkComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkComputer"},{"name":"OutputLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkProvider"},{"name":"OutputPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"OutputRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/outputRenderer"},{"name":"OutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputServices"},{"name":"OutputViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputView"},{"name":"outside","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"OverconstrainedError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OverflowEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OverlayWidgetDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"OverlayWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"OverlayWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"OVERRIDE_PROPERTY_PATTERN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"overrideIdentifierFromKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"OverviewRuler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler"},{"name":"overviewRulerAddedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerCommentingRangeForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentGlyphWidget"},{"name":"overviewRulerCommonContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerCurrentContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerDeletedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"overviewRulerFindMatchForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerIncomingContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerInfo","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"overviewRulerModifiedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"overviewRulerSelectionHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"OverviewRulerZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"OverviewZoneManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"package","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"pad","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"PageCoordinates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"PagedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listPaging"},{"name":"PagedModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"PagedScreenReaderStrategy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaState"},{"name":"PageTransitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PageViewData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/PageViewData"},{"name":"PageViewData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"pageXOffset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pageYOffset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Pane","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"PaneComposite","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panecomposite"},{"name":"PaneCompositePanel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"Panel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PANEL_ACTIVE_TITLE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_ACTIVE_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/outline/browser/outline.contribution"},{"name":"PANEL_INACTIVE_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_INPUT_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PanelActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PanelDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PanelFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"PanelKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"PanelPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelPart"},{"name":"PanelPositionContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"PanelRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PaneView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"PannerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ParameterHintsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHintsModel"},{"name":"ParameterHintsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHintsWidget"},{"name":"ParameterInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ParameterInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ParameterInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"parent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"parentPort","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"parse","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"parse","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/plistParser"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/tokenization/typescript"},{"name":"parseArgs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"parseClassifierString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"parseCLIProcessArgv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"parseCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"ParsedTokenThemeRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ParseErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parseExtensionDevOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDevOptions"},{"name":"parseExtensionHostPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseFloat","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"parseHrefAndDimensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"parseInt","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"parseKeyboardLayoutDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"parseLineAndColumnAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/paths"},{"name":"parseLinkedText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedText"},{"name":"parseMainProcessArgv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"ParseOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parsePathArg","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"parser","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Parser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"parseRawGrammar","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"parseReplaceString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"parseSavedSearchEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"parseSearchPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseTokenTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"parseTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parseUserDataDir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"parseWithLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/plistParser"},{"name":"Part","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/part"},{"name":"PartFingerprint","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"PartFingerprints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"PartialModelCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"PartialViewCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"Parts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"PassThrough","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"PASTE_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"pasteFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"PasteWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"patch","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"Path2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pathIncludedInQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"PathIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"pathOrURIToURI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"pathsToEditors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"pathToFileURL","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"PatternExcludesFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"PatternIncludesFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"PatternInputWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget"},{"name":"patternsToIExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"PAUSE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"PAUSE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"PauseableEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"PaymentAddress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentRequestUpdateEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pbkdf2","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"pbkdf2Sync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"PeekContext","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorGutterBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsFileForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsMatchForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"PeekViewWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"performance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"performance","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"Performance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceEntry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceMark","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceMeasure","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceNavigation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceNavigationTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceObserver","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"PerformanceObserverEntryList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceResourceTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerfviewContrib","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor"},{"name":"PerfviewInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor"},{"name":"PerfWidgetExternal","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PeriodicWave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionRequestedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Permissions","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionStatus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PersistentConnectionEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"PersistentContributableViewsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"PersistentProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"personalbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PICK_WORKSPACE_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"pickerGroupBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"pickerGroupForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"PickerQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/pickerQuickAccess"},{"name":"pid","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Piece","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"pieceToQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"PieceTreeBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"PieceTreeTextBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer"},{"name":"PieceTreeTextBufferBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder"},{"name":"PieceTreeTextBufferFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder"},{"name":"pipeline","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"Placeholder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"PlaceHolderPanelActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PlaceHolderToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"PlaceHolderToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PlaceHolderViewletActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"PLAINTEXT_LANGUAGE_IDENTIFIER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"PLAINTEXT_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"platform","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"platform","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"platform","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"platform","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Platform","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"PlatformToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Plugin","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PluginArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"POINT_CONVERSION_COMPRESSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"POINT_CONVERSION_HYBRID","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"POINT_CONVERSION_UNCOMPRESSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"PointerEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PointerEventHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/pointerHandler"},{"name":"PointerHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/pointerHandler"},{"name":"PointerHandlerLastRenderData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"PopStateEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"popup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/electron-browser/contextmenu"},{"name":"position","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Position","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"positionFromString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"positionIsInRange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"PositionPanelActionConfigs","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"positionToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"posix","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"posix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"postMessage","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"powerMonitor","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"powerSaveBlocker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"POWERSHELL_PATH","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"ppid","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prebakedMiniMaps","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapPreBaked"},{"name":"PreferencesContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferencesContribution"},{"name":"PreferencesEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"PreferencesEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"PreferencesLabel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"PreferencesSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"PreferencesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/browser/preferencesService"},{"name":"preferredSideBySideGroupDirection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"prefersExecuteOnUI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"prefersExecuteOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"PrefixMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"PrefixSumComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/prefixSumComputer"},{"name":"PrefixSumIndexOfResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/prefixSumComputer"},{"name":"prepareActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"prepareCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"prepareQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"prepend","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"prependListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"prependListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prependOnceListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"prependOnceListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prerelease","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"PresentationOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"presentationSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"PreserveCaseCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/replaceInput"},{"name":"prevCharLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"PREVIEW_DIR_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"PREVIOUS_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"PreviousMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousMatchFindAction2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PreviousSelectionMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousSideBarViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"print","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"privateDecrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"privateEncrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"ProblemCollectorEventKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"ProblemHandlingStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"ProblemLocationKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemMatcherParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemMatcherRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemPatternParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemPatternRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"problemsErrorIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"problemsInfoIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"problemsWarningIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"process","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProcessDataFlag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"ProcessExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ProcessExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ProcessExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ProcessExecutionOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ProcessingInstruction","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProcessRunnerDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/node/processRunnerDetector"},{"name":"ProcessState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ProcessTaskSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/node/processTaskSystem"},{"name":"product","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/product/common/product"},{"name":"ProductContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ProductIconThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/productIconThemeData"},{"name":"productService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"profile","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"profileEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ProfileSessionState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"Progress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"ProgressBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"ProgressBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/progressbar/progressbar"},{"name":"progressBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ProgressBarIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"ProgressEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ProgressLocation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressService"},{"name":"Promise","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PromiseRejectionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"promises","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"promises","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"promisify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"prompt","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"protocol","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Protocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Protocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.electron"},{"name":"ProtocolConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"events"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"module"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"stream"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"https-proxy-agent"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"mocha"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Domain"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/AvailabilityData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Base"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ContextTagKeys"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Data"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPoint"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Envelope"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/EventData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/StackFrame"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionDetails"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MessageData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MetricData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/PageViewData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RemoteDependencyData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RequestData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Channel"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/TelemetryClient"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/NodeClient"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/http-proxy-agent/index"},{"name":"provideDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerDecorationsProvider"},{"name":"provideSelectionRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/smartSelect"},{"name":"provideSignatureHelp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/provideSignatureHelp"},{"name":"provideSuggestionItems","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"Proxy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProxyAgent","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-proxy-agent/index"},{"name":"ProxyAuthHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/auth"},{"name":"ProxyIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"pseudoRandomBytes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"publicDecrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"publicEncrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"PublicKeyCredential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushSubscription","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushSubscriptionOptions","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pushToEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"pushToStart","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Query","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionQuery"},{"name":"QueryBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/queryBuilder"},{"name":"QueryGlobTester","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"QueryType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"Queue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"queueMicrotask","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"QuickAccessController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/quickAccess"},{"name":"QuickAccessLeastRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessLeastRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessNavigateNextAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/quickAccessActions"},{"name":"QuickAccessPreviousEditorFromHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessPreviousRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessPreviousRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"QuickAccessViewPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"QuickCommandNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"QuickFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"QuickFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"QuickFixActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"QuickFixController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"QuickHelpNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"quickInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QuickInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputBox"},{"name":"QuickInputButtons","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"QuickInputButtons","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"QuickInputController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInput"},{"name":"QuickInputEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"QuickInputEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"quickInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QuickInputList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputList"},{"name":"QuickInputListFocus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputList"},{"name":"QuickInputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/quickInput"},{"name":"QuickInputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/quickinput/browser/quickInputService"},{"name":"quickInputTitleBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QUICKOPEN_DETAIL_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"QUICKOPEN_SKIP_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"QuickOutlineNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"quickPickItemScorerAccessor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"QuickPickItemScorerAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"QuickSwitchWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"R_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"raceCancellation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"raceTimeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RadioGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"RadioNodeList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RandomAccessReader","kind":"class","kindModifiers":"abstract,export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"RandomBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"randomBytes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomFill","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomFillSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"RandomSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"range","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Range","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"RangeError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RangeHighlightDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/rangeDecorations"},{"name":"RangeHighlightDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"RangeMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"RangesCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"RangesCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"RangeUtil","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/rangeUtil"},{"name":"RatingsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RawContentChangedType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"RawContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"RawDebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/rawDebugSession"},{"name":"rawListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"RawObjectReplElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"rbDelete","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"rcompare","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"rcompareIdentifiers","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ReactionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"ReactionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"read","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Readable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"ReadableStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ReadableStreamReader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"readableToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readCharWidths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"readdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readdir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readDirsInDir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readdirSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readdirWithFileTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"readFromStdin","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"readlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readonly","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ReadonlyEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"readRawMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"ReadStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ReadStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"readSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readTrustedDomains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"readUInt16LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt32BE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt32LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"realcaseSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"realpath","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"realpath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"realpathSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"realpathSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"ReapplyBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"RecommendationWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"recomputeMaxEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"recomputeTreeMetadata","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"ReconnectionPermanentFailureEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ReconnectionRunningEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ReconnectionWaitEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"Recoverable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"RedoWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"RefactorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"refactorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"RefCountedStyleSheet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"ReferenceCollection","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"ReferenceError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ReferenceProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ReferencesController","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesController"},{"name":"ReferencesModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"ReferenceWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget"},{"name":"Reflect","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"RefreshAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"RefreshExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"REFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"REG_BINARY","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_DWORD","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_EXPAND_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_MULTI_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_NONE","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_QWORD","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_TYPES","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"RegexCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"RegExp","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"regExpContainsBackreference","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"regExpFlags","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"regExpLeadsToEndlessLoop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"register","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerAction2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"registerCodeActionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerCodeLensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"registerColorProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerColors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"registerColorThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerColorThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"registerCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"registerCompletionItemProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"registerContextMenuListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/electron-main/contextmenu"},{"name":"registerContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceContributions"},{"name":"registerContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"registerDeclarationProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDefaultLanguageCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerDefinitionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDiffEditorContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerDocumentFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentHighlightProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentRangeFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentRangeSemanticTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentSemanticTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentSymbolProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerEditorAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerEditorCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerEditorContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerFileIconThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerFileIconThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/fileIconThemeSchema"},{"name":"registerFileProtocol","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols"},{"name":"registerFoldingRangeProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerHoverProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerIcon","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"registerImplementationProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerInstantiatedEditorAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerLanguageCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerLinkProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerModelAndPositionCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerModelCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerNotificationCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"registerOnTypeFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerOnTypeRenameProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerOutputTransform","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookRegistry"},{"name":"registerProductIconThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerProductIconThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/productIconThemeSchema"},{"name":"registerReferenceProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerRemoteContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote"},{"name":"registerRenameProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSelectionRangeProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSignatureHelpProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSingleton","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/extensions"},{"name":"registerTerminalActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"registerTestEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"registerTextMime","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"registerThemingParticipant","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"registerTypeDefinitionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerWindowDriver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/browser/driver"},{"name":"registerWindowDriver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-browser/driver"},{"name":"Registry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/registry/common/platform"},{"name":"Registry","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"ReindentLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ReindentSelectedLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ReinstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"rejects","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"RelatedInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"RelatedInformationRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"relative","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"relative","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"relativePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"RelativePattern","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"RelativePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Relay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"RelayURLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/url/electron-browser/urlService"},{"name":"release","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"release","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"releaseEvents","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ReleaseNotesManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/releaseNotesEditor"},{"name":"ReloadAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ReloadWebviewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"ReloadWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"ReloadWindowWithExtensionsDisabledAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"remeasureFonts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"remote","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"REMOTE_EXPLORER_TYPE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"REMOTE_FILE_SYSTEM_CHANNEL_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel"},{"name":"REMOTE_HOST_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"REMOTE_MACHINE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"RemoteAgentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/abstractRemoteAgentService"},{"name":"RemoteAgentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/browser/remoteAgentServiceImpl"},{"name":"RemoteAgentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl"},{"name":"RemoteAuthorities","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/network"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"RemoteAuthorityResolverErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"RemoteAuthorityResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/remoteAuthorityResolverService"},{"name":"RemoteAuthorityResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/electron-browser/remoteAuthorityResolverService"},{"name":"RemoteBadgeWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RemoteConnectionState","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteDependencyData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RemoteDependencyData"},{"name":"RemoteDependencyData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"RemoteDependencyDataConstants","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Constants"},{"name":"RemoteExtensionEnvironmentChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentEnvironmentChannel"},{"name":"RemoteExtensionHostClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHostClient"},{"name":"RemoteExtensionLogFileName","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentService"},{"name":"RemoteExtensionManagementChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc"},{"name":"RemoteExtensionsInstaller","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/remoteExtensionsInstaller"},{"name":"RemoteFileDialogContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel"},{"name":"RemoteFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"RemoteInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"RemoteNameContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchService"},{"name":"RemoteUserConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"RemoteViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/remote"},{"name":"RemoteWindowActiveIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/remoteIndicator"},{"name":"REMOVE_ROOT_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"REMOVE_ROOT_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"removeAccents","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"RemoveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"RemoveActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"RemoveAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeAllListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"removeAllListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"RemoveAllWatchExpressionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeAnsiEscapeCodes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"RemoveBreakpointAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeClasses","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeCSSRulesContainingSelector","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeElementsAfterNulls","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/resolvedKeybindingItem"},{"name":"removeEventListener","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RemoveFromRecentlyOpenedAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"removeFromValueTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"removeListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"removeListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"removeMarkdownEscapes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"removeNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"removeTabIndexAndUpdateFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"rename","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"rename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/rename"},{"name":"RenameAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/rename"},{"name":"renameHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"renameIgnoreError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RenameInputField","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/renameInputField"},{"name":"RenameProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"renameSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"renderCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"RenderedLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewLayer"},{"name":"Renderer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Renderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList"},{"name":"rendererLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"renderExpressionValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"renderFormattedText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"RenderIndentGuides","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"RenderingContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"RenderLineInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"RenderLineNumbersType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"RenderLineNumbersType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"RenderLineOutput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"RenderLineOutput2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderMarkdown","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/markdownRenderer"},{"name":"renderMarkdownDocument","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markdown/common/markdownDocumentRenderer"},{"name":"RenderMinimap","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"RenderMinimap","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"renderText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"renderVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"renderViewLine","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderViewLine2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderViewTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"RenderWhitespace","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"ReopenClosedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ReopenResourcesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"repeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Repl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/repl"},{"name":"REPL_MODE_SLOPPY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"REPL_MODE_STRICT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"REPL_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"ReplAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceActiveKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceAllCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replaceAllCommand"},{"name":"ReplaceAllInFileActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceAllInFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceAllInFolderActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandThatPreservesSelection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandThatSelectsText","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandWithOffsetCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandWithoutChangingPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceInFilesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/replaceInput"},{"name":"ReplaceInputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplacePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"ReplacePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/replace"},{"name":"ReplacePiece","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"ReplacePreviewContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceService"},{"name":"ReplaceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceService"},{"name":"ReplDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplEvaluationInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplEvaluationInputsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplEvaluationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplEvaluationResultsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplRawObjectsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"REPLServer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"ReplSimpleElementsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplVariablesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"report","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"reporters","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"mocha"},{"name":"ReportExtensionIssueAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"ReportPerformanceIssueUsingReporterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueActions"},{"name":"RepositoryPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"RepositoryViewDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"request","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"request","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"request","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/request/browser/request"},{"name":"Request","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"requestAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RequestChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/requestIpc"},{"name":"RequestChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/requestIpc"},{"name":"RequestData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RequestData"},{"name":"RequestData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"RequestInitiator","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RequestMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/electron-main/requestMainService"},{"name":"RequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/browser/requestService"},{"name":"RequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/node/requestService"},{"name":"RequestType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"require","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RequireInterceptor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRequireInterceptor"},{"name":"RerunSearchEditorSearchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"RerunSearchEditorSearchCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"ResetFocusedViewLocationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ResetGroupSizesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"resetSentinel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"ResetViewLocationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"resizeBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"resizeTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"resolve","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"resolve4","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolve6","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveAny","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveCname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveColorValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"resolveCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/commonProperties"},{"name":"ResolvedAuthority","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ResolvedAuthority","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ResolvedKeybinding","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"ResolvedKeybindingItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/resolvedKeybindingItem"},{"name":"ResolvedKeybindingPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"resolveExtensionsSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"resolveMarketplaceHeaders","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService"},{"name":"resolveMx","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveNaptr","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveNs","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolvePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"resolvePatternsForProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"resolvePtr","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Resolver","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveSettingsTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"resolveSoa","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveSrv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveTerminalEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/terminalEncoding"},{"name":"resolveTxt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveWorkbenchCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/browser/workbenchCommonProperties"},{"name":"resolveWorkbenchCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/workbenchCommonProperties"},{"name":"ResourceContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/resources"},{"name":"ResourceDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"ResourceEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/resourceEditorInput"},{"name":"ResourceEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/resourceEditorModel"},{"name":"ResourceGlobMatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"ResourceGlobMatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/resources"},{"name":"ResourceLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"ResourceLabels","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"resourceLanguageSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ResourceMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"ResourceMarkers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"ResourceMarkersRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"ResourceQueue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"ResourcesDropHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"ResourceSelectedForCompareContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"resourceSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"resourcesPath","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ResourceTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resourceTree"},{"name":"resourceUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ResourceWithCommentsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"ResourceWithCommentThreads","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"Response","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ResponseType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ResponsiveState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RESTART_FRAME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"RESTART_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"RESTART_SESSION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"restore","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"restoreFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"restoreParentsScrollTop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"restoreRecentlyOpened","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"restoreWindowsState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsStateStorage"},{"name":"RestrictedRenderingContext","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"resultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"retry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"return","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"REVEAL_IN_EXPLORER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"RevealInSideBarForSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"RevealKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RevealLine_","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"RevealProblemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"revealResourcesInOS","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/electron-browser/fileCommands"},{"name":"RevealTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"reverse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"REVERSE_CONTINUE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"REVERT_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"RevertAndCloseEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"revertLocalChangesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"ReviewViewZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"ReviewZoneWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentThreadWidget"},{"name":"revive","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"reviveQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"reviveWebviewExtensionDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory"},{"name":"reviveWorkspaceEditDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"reviveWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"rewriteAbsolutePaths","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"rewriteWorkspaceFileForNewLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"RGBA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"RGBA8","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/rgba"},{"name":"rgErrorMsgForDisplay","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"rgErrorMsgForDisplay","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"rgPath","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-ripgrep/lib/index"},{"name":"RichEditBracket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"RichEditBrackets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"RichEditSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"rightRotate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"righttest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"rimraf","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RimRafMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"rimrafSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RipgrepParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"RipgrepSearchProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchProvider"},{"name":"RipgrepTextSearchEngine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"rmdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rmdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rootCertificates","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"rot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"RotatingLogger","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"RowCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rowCache"},{"name":"RPCProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RSA_NO_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_OAEP_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_PSS_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_SSLV23_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_X931_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"rsort","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"RTCCertificate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDataChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDataChannelEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtlsTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtlsTransportStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtmfSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDTMFSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDTMFToneChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceCandidate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceCandidatePairChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceGatherer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceGathererEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceTransportStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIdentityAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnectionIceErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnectionIceEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpReceiver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpTransceiver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSctpTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSessionDescription","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSrtpSdesTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSsrcConflictEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsProvider","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsReport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCTrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"rtrim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Rulers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/rulers/rulers"},{"name":"run","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RunAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"runAtThisOrScheduleAtNextAnimationFrame","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"RunAutomaticTasks","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks"},{"name":"runInContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runInExternalTerminal","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"runInNewContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runInThisContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runMain","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"RunOnceScheduler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RunOnceWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RunOnOptions","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunOnOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"RunOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"RuntimeExtensionsEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"RuntimeExtensionsInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput"},{"name":"RuntimeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunToCursorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"runWhenIdle","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"S_IFBLK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFCHR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFIFO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFLNK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFMT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFREG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IROTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWOTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXOTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"safeBtoa","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"safeStringify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"sandbox","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"sandboxed","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"sanitize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"sanitizeFilePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"sanitizeGridNodeDescriptor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"sanitizeProcessEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"sanitizeRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"Sash","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"SashState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"satisfies","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SAVE_ALL_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_ALL_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_ALL_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_AS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_AS_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_WITHOUT_FORMATTING_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILES_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SaveAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"SaveAllInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"SaveExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"SaveLocalFileCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"saveParentsScrollTop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"SaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant"},{"name":"SaveParticipantsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"SaveReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SaveWorkspaceAsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"ScanCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanCodeBinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanCodeUtils","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanError","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"Scanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"scheduleAtNextAnimationFrame","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"schema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchemaCommon"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v1"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v2"},{"name":"Schemas","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/network"},{"name":"Schemas","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"scm","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SCMAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/menus"},{"name":"SCMService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scmService"},{"name":"SCMStatusController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/activity"},{"name":"SCMTreeKeyboardNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMTreeSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"Scope","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ScopedCredential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScopedCredentialInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScopedLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"score","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageSelector"},{"name":"scoreFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"scoreFuzzy2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"scoreItemFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"screen","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screen","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Screen","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenLeft","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScreenOrientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenTop","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenX","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenY","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Script","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"ScriptProcessorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scroll","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Scrollable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"ScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"ScrollbarArrow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarArrow"},{"name":"scrollbars","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrollbarShadow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderActiveBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ScrollbarState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarState"},{"name":"ScrollbarVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"ScrollbarVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"ScrollbarVisibilityController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController"},{"name":"scrollBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ScrollDecorationViewPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration"},{"name":"ScrollPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon"},{"name":"ScrollState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"scrollTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ScrollType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"ScrollType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"scrollX","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrollY","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"scryptSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"sdkVersion","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"SEARCH_EXCLUDE_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-search/typings/xterm-addon-search"},{"name":"SearchChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchIpc"},{"name":"SearchChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchIpc"},{"name":"SearchCompletionExitCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchDND","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor"},{"name":"SearchEditorBodyScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"searchEditorFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"searchEditorFindMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SearchEditorFindMatchClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SearchEditorID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SearchEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput"},{"name":"SearchEditorScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"searchEditorTextInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor"},{"name":"Searcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchHistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchHistoryService"},{"name":"SearchInputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"searchMatchComparer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchParams","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchProviderType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchResultIdx","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SearchResultModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchService"},{"name":"SearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/rawSearchService"},{"name":"SearchSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchView"},{"name":"SearchViewFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"SearchViewPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchView"},{"name":"SearchViewVisibleKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"SearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"SearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"SearchWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SecurityPolicyViolationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SELECT_FOR_COMPARE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SelectActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"selectAllSearchEditorMatchesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"SelectAllSearchEditorMatchesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SelectAllTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SelectAllWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"SelectAndStartAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"selectBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"selectBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBox"},{"name":"SelectBoxList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBoxCustom"},{"name":"SelectBoxNative","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBoxNative"},{"name":"SelectColorThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/themes/browser/themes.contribution"},{"name":"SelectDefaultShellWindowsTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"selectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectHighlightsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"Selection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Selection","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Selection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/selection"},{"name":"Selection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Selection","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Selection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"selectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectionBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"SelectionClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard"},{"name":"SelectionClipboardContributionID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/selectionClipboard"},{"name":"SelectionDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/selection"},{"name":"SelectionDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SelectionDirection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"SelectionHighlighter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"SelectionMatchFindAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"SelectionRange","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SelectionRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SelectionRange","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SelectionRangeRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SelectionsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/selections/selections"},{"name":"selectListBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"selectorPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"self","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SEMANTIC_HIGHLIGHTING_SETTING_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"SemanticTokens","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensBuilder","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensEdits","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensEdits","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensHelp","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/semanticTokensHelp"},{"name":"SemanticTokensLegend","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensLegend","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensProviderStyling","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"SemanticTokensProviderStylingConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"SemVer","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SEMVER_SPEC_VERSION","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"send","kind":"method","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"Sender","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"SENTINEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"SENTINEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"sep","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"sep","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"Separator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"sequence","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Sequence","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/sequence"},{"name":"Sequencer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"SerializableFileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SerializableGrid","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"serialize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"serializeEnvironmentVariableCollection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableShared"},{"name":"serializeFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"serializePipePositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"Serializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"serializeSearchConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"serializeSearchError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"serializeSearchResultForEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"serve","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"serve","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-main/driver"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/electron-main/ipc.electron-main"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.cp"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"ServerExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"ServerResponse","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"SERVFAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ServiceCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/serviceCollection"},{"name":"ServiceUIFrameContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerContainer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerRegistration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"session","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Session","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"Session","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"sessionStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Set","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SET_CONTEXT_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"setARIAContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"setAsyncMode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"setCollapseStateAtLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateForMatchingLines","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateForType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateLevelsDown","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateLevelsUp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateUp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"SetColorThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"SetEditorLayoutAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"setegid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"seteuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setFdLimit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"SetFileIconThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"setFlagsFromString","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"setFullscreen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"setgid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setGlobalLeakWarningThreshold","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"setgroups","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setImmediate","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setImmediate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"setImmediate","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"setInterval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setInterval","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"setLanguageConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"SetLogLevelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsActions"},{"name":"SetMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"setMaxListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"setMaxListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setModelLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setModelMarkers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setMonarchTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"setNodeStickiness","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"setOptions","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"SetPanelPositionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"setPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"setPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"setPriority","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"SetProductIconThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"setProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"setServers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"setSnippetSuggestSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"setTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setTimeout","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setTimeout","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"SettingArrayRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingBoolRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingComplexRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingEnumRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingExcludeRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"settingKeyToDisplayFormat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingMatches","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"SettingNewExtensionsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingNumberRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"settings","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"SETTINGS_COMMAND_OPEN_SETTINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_EDIT_FOCUSED_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FILTER_ONLINE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_LIST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_TOC","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SWITCH_TO_JSON","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"Settings2EditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"SettingsChangeRelauncher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution"},{"name":"settingsCheckboxBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsCheckboxBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsCheckboxForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsEditor2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsEditor2"},{"name":"SettingsEditor2Input","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"SettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"SettingsEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"SettingsGroupTitleRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"SettingsGroupTitleWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsHeaderForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsHeaderWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsNumberInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsNumberInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsNumberInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectListBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsSync"},{"name":"SettingsTargetsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsTextInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsTextInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsTextInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingsTreeElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingsTreeGroupElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeNewExtensionsElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeSettingElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingTextRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingTreeRenderers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingValueType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"setTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"setToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"setuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setUncaughtExceptionCaptureCallback","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setUnexpectedErrorHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"setup","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"setup","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"setupMaster","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"setupTerminalCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalCommands"},{"name":"setupTerminalMenu","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalMenu"},{"name":"setWordDefinitionFor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"setZoomFactor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"setZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"Severity","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/severity"},{"name":"Severity","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"SeverityIcon","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/severityIcon/common/severityIcon"},{"name":"SeverityLevel","kind":"enum","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"SeverityLevel","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"shadowCaretRangeFromPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"ShadowRoot","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SharedArrayBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"sharedLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"SharedProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/sharedProcess"},{"name":"SharedProcessMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-main/sharedProcessMainService"},{"name":"SharedProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService"},{"name":"SharedWorker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"shell","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"SHELL_CWD_INVALID_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"SHELL_PATH_DIRECTORY_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"SHELL_PATH_INVALID_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ShellExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ShellExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ShellExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ShellExecutionOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"shift","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"ShiftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/shiftCommand"},{"name":"shorten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"shouldSetLangEnvVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"shouldSynchronizeModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelService"},{"name":"show","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"SHOW_EDITORS_IN_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SHOW_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ShowActiveFileInExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ShowAllCommandsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"ShowAllEditorsByAppearanceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowAllEditorsByMostRecentlyUsedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowAzureExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowBuiltInExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowCandidateContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/showCandidate"},{"name":"ShowCurrentReleaseNotesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ShowCurrentReleaseNotesActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/common/update"},{"name":"ShowDisabledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowEditorsInActiveGroupByMostRecentlyUsedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowEnabledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"showExtensionQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/format/browser/showExtensionQuery"},{"name":"ShowInstalledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowLanguageExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ShowLanguageExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowNextChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"ShowNextWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ShowOpenedFileInNewWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ShowOutdatedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowPopularExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowPreviousChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"ShowPreviousWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ShowProblemsPanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"ShowRecommendationsOnlyOnDemandKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ShowRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowRecommendedKeymapExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowReleaseNotesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ShowRuntimeExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"showSimpleSuggestions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"ShowViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ShowWebViewEditorFindWidgetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"shuffle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"ShutdownReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"SIDE_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"SidebarFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"SidebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/sidebar/sidebarPart"},{"name":"SideBarVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"SideBySideEditor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SideBySideEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/sideBySideEditor"},{"name":"SideBySideEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SIGABRT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGALRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGBREAK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGBUS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGCHLD","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGCONT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGFPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGHUP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGILL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGINT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGIOT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGKILL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"sign","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"SIGN_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/common/sign"},{"name":"SignatureHelp","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureHelp","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureHelp","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SignatureHelpProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SignatureInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Signer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"SignService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/browser/signService"},{"name":"SignService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/node/signService"},{"name":"SIGPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPOLL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPROF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPWR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGQUIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSEGV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSTKFLT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSTOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSYS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTERM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTRAP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTSTP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTTIN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTTOU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUNUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGURG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUSR1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUSR2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGVTALRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGWINCH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGXCPU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGXFSZ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SimpleBreadcrumbsItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"SimpleBulkEditService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleButton","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"SimpleCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"simpleCheckboxBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"simpleCheckboxBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"simpleCheckboxForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SimpleCommentEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/simpleCommentEditor"},{"name":"SimpleConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleEditorModelResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleEditorProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleFileDialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"SimpleFindReplaceWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindReplaceWidget"},{"name":"SimpleFindWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget"},{"name":"SimpleKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"SimpleLayoutService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleNotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleReplElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"SimpleResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleServicesNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"SimpleUriLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleWorkerClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"SimpleWorkerServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"SimpleWorkspaceContextService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SingleCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"SingleEditorGroupsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"singleLetterHash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"SingleLineInputHeight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"SingleModelEditStackElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"singlePagePager","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"SingleProxyRPCProtocol","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/api/testRPCProtocol"},{"name":"sinon","kind":"alias","kindModifiers":"declare","sortText":"4"},{"name":"Sinon","kind":"var","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"size","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"size","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"Sizing","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"Sizing","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"SlicedLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/lineTokens"},{"name":"SlowBuffer","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"SlowExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions"},{"name":"SmartSnippetInserter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/smartSnippetInserter"},{"name":"SmoothScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"SmoothScrollingOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"SmoothScrollingUpdate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"snapshotToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"SnapUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.snap"},{"name":"Snippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"SnippetCompletion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider"},{"name":"SnippetCompletionProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider"},{"name":"SnippetController2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetController2"},{"name":"SnippetFile","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"snippetFinalTabstopHighlightBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"snippetFinalTabstopHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SnippetParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"SnippetSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetSession"},{"name":"SnippetSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"SnippetSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"SnippetsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/snippetsSync"},{"name":"SnippetString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SnippetString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"snippetTabstopHighlightBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"snippetTabstopHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Socket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dgram"},{"name":"Socket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"SocketDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"sort","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SortBy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"sortedDiff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Sorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"SortLinesAscendingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"SortLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/sortLinesCommand"},{"name":"SortLinesDescendingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"sortMimeTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"SortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"SortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"Source","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"Source","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"Source","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"SourceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"sourceActionCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"SourceBreakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SourceBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SourceBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SourceBufferList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SourceControlInputBoxValidationType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SourceControlInputBoxValidationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SparseEncodedTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"spawn","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"spawn","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"node-pty"},{"name":"spawnRipgrepCmd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"spawnSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"SpdLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/spdlogService"},{"name":"specify","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechGrammar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechGrammarList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognition","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionAlternative","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionResult","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionResultList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"speechSynthesis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisUtterance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisVoice","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SPLIT_EDITOR_DOWN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_LEFT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_RIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_UP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"splitEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SplitEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorOrthogonalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorsVertically","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SplitEditorUpAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"splitGlobAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"SplitInActiveWorkspaceTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SplitLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"SplitLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"splitName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"SplitTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SplitView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"spreadGlobComponents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"spy","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"SQLiteStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/node/storage"},{"name":"SSL_OP_ALL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CIPHER_SERVER_PREFERENCE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CISCO_ANYCONNECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_COOKIE_EXCHANGE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CRYPTOPRO_TLSEXT_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_EPHEMERAL_RSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_LEGACY_SERVER_CONNECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MICROSOFT_SESS_ID_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MSIE_SSLV2_RSA_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_CA_DN_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_CHALLENGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_QUERY_MTU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SSLv2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SSLv3","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TICKET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1_1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1_2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_PKCS1_CHECK_1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_PKCS1_CHECK_2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SINGLE_DH_USE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SINGLE_ECDH_USE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SSLEAY_080_CLIENT_DH_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_BLOCK_PADDING_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_D5_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_ROLLBACK_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"StableEditorScrollState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"StackFrame","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"StackFrame","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/StackFrame"},{"name":"StackFrame","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"StandaloneCodeEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneCodeEditorNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"StandaloneCodeEditorServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeServiceImpl"},{"name":"StandaloneCommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneCommandsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess"},{"name":"StandaloneConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"StandaloneDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneGotoLineQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess"},{"name":"StandaloneGotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess"},{"name":"StandaloneKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneQuickInputServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"StandaloneReferencesController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch"},{"name":"StandaloneTelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneThemeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneThemeServiceImpl"},{"name":"StandardAutoClosingPairConditional","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfiguration"},{"name":"StandardKeyboardEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/keyboardEvent"},{"name":"StandardMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"standardMouseMoveMerger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/globalMouseMoveMonitor"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"StandardWheelEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"StandardWindow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"start","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"start","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"start","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-watchdog/index"},{"name":"StartAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"StartDebugActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActionViewItems"},{"name":"StartDebugQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugQuickAccess"},{"name":"startExtensionHostProcess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup"},{"name":"StartExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"StartFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"StartFindReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"StartFindWithSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"startProfiling","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"StartStopProblemCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"startsWith","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startsWithIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startsWithUTF8BOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterMain"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/processExplorer/processExplorerMain"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/sharedProcessMain"},{"name":"StartupKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"StartupKindToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"StartupProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/startupProfiler"},{"name":"StartupTimings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/startupTimings"},{"name":"stat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"stat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"State","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"stateExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"StatefullMarkdownCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell"},{"name":"StateMachine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"Statement","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"StateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/stateService"},{"name":"StateType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"StaticDND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"StaticExtensionsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/staticExtensions"},{"name":"StaticLanguageSelector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/mockMode"},{"name":"StaticRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StaticRouter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"StaticServices","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneServices"},{"name":"StatisticType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"statLink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"Stats","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"statSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"status","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"status","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"STATUS_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_DEBUGGING_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_DEBUGGING_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_DEBUGGING_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_HOST_NAME_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_HOST_NAME_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_ITEM_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_ITEM_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_CODES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"statusbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StatusbarAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/statusbar/common/statusbar"},{"name":"StatusBarAlignment","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"StatusBarAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"StatusBarColorProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"StatusbarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/statusbar/statusbarPart"},{"name":"StatusLabelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"StatusMessageChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"StatusUpdater","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"stderr","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"stdin","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"stdinDataListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"stdout","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"STEP_BACK_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_INTO_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_INTO_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OUT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OUT_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OVER_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OVER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"StereoPannerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"stop","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"stop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/event"},{"name":"STOP_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STOP_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"StopExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"StopWatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stopwatch"},{"name":"Storage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Storage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"StorageDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/storageDataCleaner"},{"name":"StorageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StorageHint","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"StorageKeysSyncRegistryChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"StorageKeysSyncRegistryChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"StorageKeysSyncRegistryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/storageKeys"},{"name":"StorageMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageMainService"},{"name":"StorageManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StorageManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService"},{"name":"StorageScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"strcmp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"Stream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"StreamDebugAdapter","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"streamToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"streamToBufferReadableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"streamToNodeReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"strict","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"strictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"string","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"String","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StringBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"StringDecoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"string_decoder"},{"name":"stringDiff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"StringDiffSequence","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"StringEOL","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"stringHash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"stringify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"stringify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"StringIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"StringRepresentationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"StringSHA1","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"stringToSnapshot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"stripCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"stripComments","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"stripUTF8BOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"stripWildcards","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"stub","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"styleMedia","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleMedia","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleSheet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleSheetList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SubmenuAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"SubmenuItemAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"substituteMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"SubtleCrypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SuggestAlternatives","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestAlternatives"},{"name":"SuggestController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestController"},{"name":"SuggestEnabledInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput"},{"name":"suggestFilename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"SuggestMemoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"SuggestModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"SuggestWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"suggestWidgetStatusbarMenu","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"suite","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"suiteRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"suiteSetup","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"suiteTeardown","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"super","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"SUPPORTED_CODE_ACTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"SUPPORTED_ENCODINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"SurroundSelectionCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/surroundSelectionCommand"},{"name":"SVGAElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAngle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedAngle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedBoolean","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedEnumeration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedInteger","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedLength","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedLengthList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedNumber","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedNumberList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedPreserveAspectRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedString","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedTransformList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateMotionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateTransformElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimationElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGCircleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGClipPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGComponentTransferFunctionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGCursorElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGDefsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGDescElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElementInstance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElementInstanceList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGEllipseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEBlendElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEColorMatrixElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEComponentTransferElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFECompositeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEConvolveMatrixElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDiffuseLightingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDisplacementMapElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDistantLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDropShadowElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFloodElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncAElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncBElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEGaussianBlurElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMergeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMergeNodeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMorphologyElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEOffsetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEPointLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFESpecularLightingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFESpotLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFETileElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFETurbulenceElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFilterElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGForeignObjectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGeometryElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGraphicsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLength","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLengthList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLinearGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLineElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMarkerElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMaskElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMetadataElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGNumber","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGNumberList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSeg","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegArcAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegArcRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegClosePath","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicSmoothAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicSmoothRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticSmoothAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticSmoothRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoHorizontalAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoHorizontalRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoVerticalAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoVerticalRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegMovetoAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegMovetoRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPatternElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPointList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPolygonElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPolylineElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPreserveAspectRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRadialGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGScriptElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStopElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStringList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStyleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSVGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSwitchElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSymbolElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextContentElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextPositioningElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTitleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTransform","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTransformList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTSpanElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGUnitTypes","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGUseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGViewElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGZoomAndPan","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGZoomEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"switch","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"SwitchPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"SwitchRemoteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/explorerViewItems"},{"name":"SwitchRemoteViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/explorerViewItems"},{"name":"SwitchTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SwitchTerminalActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SwitchWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"symbol","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Symbol","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SYMBOL_ICON_ARRAY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_BOOLEAN_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CLASS_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_COLOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CONSTANT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CONSTRUCTOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_ENUMERATOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_EVENT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FIELD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FILE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FOLDER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FUNCTION_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_INTERFACE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_KEY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_KEYWORD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_METHOD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_MODULE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NAMESPACE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NULL_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NUMBER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_OBJECT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_OPERATOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_PACKAGE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_PROPERTY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_REFERENCE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_SNIPPET_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_STRING_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_STRUCT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_TEXT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_TYPEPARAMETER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_UNIT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_VARIABLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SymbolInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SymbolKinds","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/symbolsQuickAccess"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"symlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"symlink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"symlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"SyncActionDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"SyncDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/descriptors"},{"name":"SyncIgnoredIconAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"SyncManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SyncResource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"SyncStatus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"SyntaxError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SyntaxKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"SyntaxRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"SystemDisabledWarningAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"systemPreferences","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TAB_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_BORDER_TOP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BORDER_TOP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TabCompletionController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/tabCompletion"},{"name":"TabFocus","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"table","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TabsTitleControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/tabsTitleControl"},{"name":"TAG","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"tail","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"tail2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"takeHeapSnapshot","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Task","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Task","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TASK_RUNNING_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"Task2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskConfigSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"TaskDefinition","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskDefinitionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskDefinitionRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskDefinitionRegistry"},{"name":"TaskDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskErrors","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskEvent","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskEventKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskExecuteKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskFilterDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskGroup","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskGroup","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskHandleDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"TaskPanelKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskPanelKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskPresentationOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskQuickPick","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"TaskRevealKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskRevealKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskRunResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugTaskRunner"},{"name":"TaskRunSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskRunType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"tasks","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TASKS_CONFIGURATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TASKS_DEFAULT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TaskScope","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskSequentializer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TaskService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskService"},{"name":"TaskService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/electron-browser/taskService"},{"name":"TaskSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskSourceKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TasksQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/tasksQuickAccess"},{"name":"tasksSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TaskStatusBarContributions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/task.contribution"},{"name":"teardown","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"TelemetryAppenderChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetryIpc"},{"name":"TelemetryAppenderClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetryIpc"},{"name":"TelemetryClient","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/TelemetryClient"},{"name":"TelemetryClient","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"TelemetryContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution"},{"name":"telemetryLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryService"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/browser/telemetryService"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/electron-browser/telemetryService"},{"name":"TelemetryType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"telemetryTypeToBaseType","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"TEMPDIR_PREFIX","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"template","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"Terminal","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"xterm"},{"name":"TERMINAL_ACTION_CATEGORY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_BORDER_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_COMMAND_ID","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_CONFIG_SECTION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_CURSOR_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_CURSOR_FOREGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_FOREGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_SELECTION_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TerminalConfigHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper"},{"name":"terminalConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalConfiguration"},{"name":"TerminalCursorStyle","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TerminalDataBufferer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalDataBuffering"},{"name":"TerminalFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalFindWidget"},{"name":"TerminalInstance","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalInstance"},{"name":"TerminalInstanceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalInstanceService"},{"name":"TerminalInstanceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService"},{"name":"TerminalLinkManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager"},{"name":"TerminalNativeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService"},{"name":"TerminalPasteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"TerminalProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalProcess"},{"name":"TerminalProcessExtHostProxy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy"},{"name":"TerminalProcessManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalProcessManager"},{"name":"TerminalQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalsQuickAccess"},{"name":"terminalSendSequenceCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"TerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalService"},{"name":"TerminalTab","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalTab"},{"name":"TerminalTaskSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem"},{"name":"TerminalValidatedLocalLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider"},{"name":"TerminalViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalView"},{"name":"TerminalWebLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalWebLinkProvider"},{"name":"TerminalWidgetManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager"},{"name":"TerminalWordLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider"},{"name":"TERMINATE_THREAD_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"TerminateResponseCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"TerminateResponseCode","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"TernarySearchTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"test","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"test","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"TEST_VIEW_CONTAINER_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"TestAccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testApplyEditsWithSyncedModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/editableTextModelTestUtils"},{"name":"TestBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestBackupMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test"},{"name":"testCase","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"TestCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"TestChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestCodeEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"TestCodeEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/editorTestServices"},{"name":"TestColorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"testCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCommand"},{"name":"TestCommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/editorTestServices"},{"name":"TestConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/testConfiguration"},{"name":"TestConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/test/common/testConfigurationService"},{"name":"TestContextService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"TestDecorationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/test/foldingModel.test"},{"name":"TestDecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestDialogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test"},{"name":"TestDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/test/common/testDialogService"},{"name":"TestDiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/test/electron-browser/diskFileService.test"},{"name":"TestEditorGroupAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorGroupsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorGroupView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestElectronService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestExperimentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test"},{"name":"TestExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test"},{"name":"TestExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/utils"},{"name":"TestFileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileIconTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"TestFilesConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/test/findController.test"},{"name":"TestHistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestInstantiationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/test/common/instantiationServiceMock"},{"name":"TestLayoutService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestListService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestNativePathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestNativeTextFileServiceWithEncodingOverrides","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestNotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"TestNotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/test/common/testNotificationService"},{"name":"TestPanelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestPathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestReadonlyTextFileEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"testRepeatedActionAndExtractPositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"testRepeatOnly","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"TestRPCProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/api/testRPCProtocol"},{"name":"TestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestServiceAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestServiceAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestServiceClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestSharedProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testTextBufferFactory","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test"},{"name":"TestTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestTextResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestTextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/services/modelService.test"},{"name":"TestTextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"TestThemeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"TestUserDataSyncUtilService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"TestView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/browser/ui/grid/util"},{"name":"TestViewletService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testViewModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/viewModel/testViewModel"},{"name":"TestViewsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestWindowConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestWorkingCopy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test"},{"name":"TestWorkingCopyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/test/common/testWorkspace"},{"name":"TestWorkspace","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/test/common/testWorkspace"},{"name":"Text","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Text","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TEXT_DIFF_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TEXT_FILE_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"TextAreaHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaHandler"},{"name":"TextAreaInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaInput"},{"name":"TextAreaState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaState"},{"name":"TextBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"textBlockQuoteBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textBlockQuoteBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextChange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textChange"},{"name":"textCodeBlockBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextCompareEditorActiveContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextCompareEditorVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextDecoder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextDecoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TextDecoderStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textDiffEditor"},{"name":"TextDiffEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/textDiffEditorModel"},{"name":"TextDocumentSaveReason","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextDocumentSaveReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextDocumentSaveReason","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEdit","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"TextEditElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"TextEditorCursorBlinkingStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"TextEditorCursorBlinkingStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TextEditorDecorationType","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"TextEditorEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"TextEditorLineNumbersStyle","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorLineNumbersStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorLineNumbersStyle","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextEditorOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorSelectionChangeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorSelectionChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorSelectionRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"TextEditorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/browser/history"},{"name":"TextEncoder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextEncoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TextEncoderStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextFileContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"TextFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileEditor"},{"name":"TextFileEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileEditorModel"},{"name":"TextFileEditorModelManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileEditorModelManager"},{"name":"TextFileEditorModelState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileEditorTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileEditorTracker"},{"name":"TextFileLoadReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileOperationError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileOperationResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileSaveErrorHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"TextFileSaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileSaveParticipant"},{"name":"TextInputActionsProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/textInputActions"},{"name":"textLinkActiveForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textLinkForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textmateColorGroupSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"textmateColorSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"textmateColorsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"TextMateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/browser/textMateService"},{"name":"TextMateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateService"},{"name":"TextmateSnippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TextMateWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateWorker"},{"name":"TextMateWorkerHost","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateService"},{"name":"TextMetrics","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"TextModelCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"TextModelResolvedOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"TextModelResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textmodelResolver/common/textModelResolverService"},{"name":"TextModelSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"TextModelTokenization","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelTokens"},{"name":"textPreformatForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationServiceImpl"},{"name":"TextResourceEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textResourceEditor"},{"name":"TextResourceEditorInput","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textresourceProperties/common/textResourcePropertiesService"},{"name":"TextSearchEngineAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/textSearchAdapter"},{"name":"TextSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"TextSearchMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"TextSearchResultsCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"textSeparatorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextSnapshotReadable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackCueList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Themable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemableDecorationAttachmentRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ThemableDecorationRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ThemeColor","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ThemeColor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"themeColorFromId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemeConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"ThemeIcon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ThemeIcon","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemeIcon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ThemeMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/electron-main/themeMainService"},{"name":"ThemeRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"ThemeRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMHelper"},{"name":"ThemeSettings","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"ThemeTrieElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ThemeTrieElementRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"this","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Thread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ThreadAndSessionIds","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"threadId","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"throttle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"ThrottledDelayer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Throttler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"throw","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"throwDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"throwProposedApiError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"throws","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"tildify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"time","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimeBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"timeEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timeline","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimelineElementTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"timelineEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimelineFollowActiveEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TimelineItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TimelineKeyboardNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineListVirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelinePane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelinePaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timeline.contribution"},{"name":"TimelinePaneId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"TimelineService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timelineService"},{"name":"timeLog","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TIMEOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"TimeoutTimer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TimeRanges","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"timeStamp","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timingSafeEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"title","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"TITLE_BAR_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TitlebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/titlebarPart"},{"name":"TitlebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart"},{"name":"TitleCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"TitleControl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/titleControl"},{"name":"TitleEventSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TLSSocket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"TMGrammarFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMGrammarFactory"},{"name":"tmpdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"TMScopeRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMScopeRegistry"},{"name":"toASCII","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"toBackupWorkspaceResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/electron-browser/backup"},{"name":"toBufferOrReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"toCanonicalName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"tocData","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"TOCRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"TOCTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"TOCTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"toDecodeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"toDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"toErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorMessage"},{"name":"toExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"toExtensionDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"toFileChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/watcher"},{"name":"toFileOperationResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"toFileSystemProviderErrorCode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"TOGGLE_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_CONDITIONAL_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_DIFF_IGNORE_TRIM_WHITESPACE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"TOGGLE_DIFF_SIDE_BY_SIDE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"TOGGLE_IGNORE_EXTENSION_ACTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"TOGGLE_INLINE_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"TOGGLE_LOG_POINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"TOGGLE_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ToggleActivityBarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleAutoSaveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ToggleAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ToggleBreakpointsActivatedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"toggleCaseSensitiveCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleCaseSensitiveCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleCaseSensitiveKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"toggleClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"ToggleCollapseAndExpandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"toggleCollapseState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"ToggleColumnSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection"},{"name":"ToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ToggleDevToolsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ToggleEditorLayoutAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleEditorVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleGroupSizesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ToggleHighContrastNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"ToggleMaximizedPanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"ToggleMenuBarAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleMinimapAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleMinimap"},{"name":"ToggleMultiCursorModifierAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier"},{"name":"TogglePanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"ToggleReactionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"toggleRegexCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleRegexCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleRegexKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleRenderControlCharacterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter"},{"name":"ToggleRenderWhitespaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace"},{"name":"toggleSearchEditorCaseSensitiveCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorCaseSensitiveCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorContextLinesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorRegexCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorRegexCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorWholeWordCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorWholeWordCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"ToggleSearchOnTypeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleSearchScopeKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleSharedProcessAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ToggleSidebarPositionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleSidebarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleStatusbarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleTabFocusModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode"},{"name":"ToggleTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"ToggleViewAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ToggleViewModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"toggleWholeWordCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleWholeWordCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleWholeWordKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleWindowTabsBarHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"Token","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"Token","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TOKEN_TYPE_WILDCARD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenClassificationExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/tokenClassificationExtensionPoint"},{"name":"TokenizationRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TokenizationRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/tokenizationRegistry"},{"name":"TokenizationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"TokenizationResult2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"TokenizationStateStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelTokens"},{"name":"TokenizationSupport2Adapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"tokenize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"tokenizeLineToHTML","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/textToHtmlTokenizer"},{"name":"tokenizeToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/textToHtmlTokenizer"},{"name":"TokenMetadata","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TokensStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"TokensStore2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"TokenStyle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenStylingRule","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"tokenStylingSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"TokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"toKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"toLocalISOString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/date"},{"name":"toLocalResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"toMultilineTokens2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"toNamespacedPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"toNodeEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"toolbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ToolBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/toolbar/toolbar"},{"name":"TOOLTIP_HOVER_THRESHOLD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"TooltipWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"toOverrides","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"top","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"top","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"topAsync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"toReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"toResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"toResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"toSlashes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"toStandardTokenType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"toStoreData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"toStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"toString","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"totalmem","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"Touch","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Touch","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"TouchBar","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarButton","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarColorPicker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarGroup","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarLabel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarPopover","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarScrubber","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSegmentedControl","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSlider","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSpacer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TouchList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"toUint32","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"toUint8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"toUnicode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"toValuesTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"toWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"toWorkspaceFolders","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"toWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"trace","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"traceDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"traceProcessWarnings","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"TrackedRangeStickiness","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"TrackedRangeStickiness","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"trackFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"transcode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"transform","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"Transform","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"Transform","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TransformableMarker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"transformAndReviveIncomingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"transformErrorForSerialization","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"transformIncomingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"transformOutgoingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"TransformStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TransitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Translations","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionPoints"},{"name":"translationsConfigFile","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"transparent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TransposeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"Tray","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TreeDragOverBubble","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeDragOverReactions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"TreeError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"treeIndentGuidesStroke","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TreeItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TreeItem2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TreeMouseEventTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"TreeResourceNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"TreeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"TreeViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"TreeVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeWalker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TRIGGER_RENAME_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"TriggerAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/pickerQuickAccess"},{"name":"triggerAsyncId","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"triggerDownload","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"TriggerParameterHintsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHints"},{"name":"Triggers","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TriggerSuggestAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestController"},{"name":"trim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"TrimFinalNewLinesParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"trimTrailingWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/trimTrailingWhitespaceCommand"},{"name":"TrimTrailingWhitespaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"TrimTrailingWhitespaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/trimTrailingWhitespaceCommand"},{"name":"TrimWhitespaceParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"true","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"trueMachineIdKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"truncate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"truncate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"truncateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"TRUSTED_DOMAINS_CONTENT_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"TRUSTED_DOMAINS_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"TrustedDomainsFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsFileSystemProvider"},{"name":"try","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"TunnelCloseableContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelDto","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"TunnelFactoryContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/tunnelFactory"},{"name":"TunnelModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"TunnelPanel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelPanelDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/tunnelService"},{"name":"TunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/node/tunnelService"},{"name":"TunnelType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"TunnelTypeContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"twistiePixels","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"type","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"type","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Type","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/lineCommentCommand"},{"name":"typeAndModifierIdPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TypeDefinitionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TypeError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"typeof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"TypeOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorTypeOperations"},{"name":"types","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TypeWithAutoClosingCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorTypeOperations"},{"name":"ucs2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"UIEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"UIKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"UIKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"UILabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"Uint16Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8ClampedArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8Matrix","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"umask","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"undefined","kind":"var","kindModifiers":"","sortText":"4"},{"name":"UndoIgnoreExtensionRecommendationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UndoRedoElementType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedo"},{"name":"UndoRedoService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedoService"},{"name":"UndoWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"unescape","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"unescape","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"Unicode11Addon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-unicode11/typings/xterm-addon-unicode11"},{"name":"unicodeEscapesToPCRE2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"UninstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"unique","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"uniqueFilter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"unknown","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"UNKNOWN_SOURCE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"UnknownExtensionRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"unlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"unlink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"unlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"UnloadReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"unmnemonicLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"untildify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"UNTITLED_WORKSPACE_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"UntitledTextEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorInput"},{"name":"UntitledTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorModel"},{"name":"UntitledTextEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorService"},{"name":"unwatchFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"unzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"unzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"UpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UpdateAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UpdateChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateIpc"},{"name":"updateColorThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"UpdateContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"updateFileIconThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"updateIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"updateProblemMatchers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v2"},{"name":"updateProductIconThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"updateTreeMetadata","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"UpdateType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"updateViewTypeSchema","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"UpperCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"uppercaseFirstLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"uptime","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"uptime","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Uri","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Uri","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"URI","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"URIError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"UriIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"uriToFsPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uri"},{"name":"URITransformer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"URITransformerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUriTransformerService"},{"name":"url","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"URL","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"URL","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"URLHandlerChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLHandlerChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLHandlerRouter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLSearchParams","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"URLSearchParams","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"URLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/node/urlService"},{"name":"USE_ICACLS","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"USE_SPLIT_JSON_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"useFakeTimers","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"useFakeXMLHttpRequest","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"USER_DATA_SYNC_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"USER_MANIFEST_CACHE_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"USER_STANDALONE_CONFIGURATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"USER_TASKS_GROUP_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskService"},{"name":"userAgent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"UserConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"UserDataAutoSyncChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userDataSync/electron-browser/userDataAutoSyncService"},{"name":"UserDataSycnUtilServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"UserDataSyncBackupStoreService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncBackupStoreService"},{"name":"UserDataSyncChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"UserDataSyncEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncEnablementService"},{"name":"UserDataSyncError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"UserDataSyncErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"userDataSyncLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"UserDataSyncLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncLog"},{"name":"UserDataSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncService"},{"name":"UserDataSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService"},{"name":"UserDataSyncStoreError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"UserDataSyncStoreService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncStoreService"},{"name":"UserDataSyncTestServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"UserDataSyncTrigger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger"},{"name":"UserDataSyncUtilServiceClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncViewContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncView"},{"name":"UserDataSyncWorkbenchContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync"},{"name":"userInfo","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"UserSettings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"UserSettingsLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"UserSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"userSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"useSlashForPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"USLayoutResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding"},{"name":"USUAL_WORD_SEPARATORS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"UTF16be","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16be_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16le","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16le_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8_BOM_CHARACTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"UTF8_with_bom","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"utimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"utimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"UV_UDP_REUSEADDR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"V4MAPPED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"valid","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ValidAnnotatedEditOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"validateConstraint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"validateConstraints","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"ValidatedEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"validateFileName","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"validateFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"validatePaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/paths"},{"name":"validateProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"validateTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"ValidationState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"ValidationStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"ValidityState","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"validRange","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"values","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"values","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"var","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Variable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"Variable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"VARIABLES_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"VariablesDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"variableSetEmitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"VariablesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"VariablesView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"verbose","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"Verbose","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"Verbosity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"VerifiedTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem"},{"name":"verify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"Verify","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"version","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"version","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"version","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"version","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"versions","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"VerticalRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"VerticalScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/verticalScrollbar"},{"name":"VideoPlaybackQuality","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"View","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewImpl"},{"name":"VIEW_CONTAINER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"ViewColumn","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ViewColumn","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ViewColumn","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"viewColumnToEditorGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/editor"},{"name":"ViewConfigurationChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewContainerLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"ViewContentPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"ViewContentSizeChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewContentWidgets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets"},{"name":"ViewContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewContext"},{"name":"ViewController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewController"},{"name":"ViewCursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewCursors/viewCursor"},{"name":"ViewCursors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewCursors/viewCursors"},{"name":"ViewCursorStateChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewDecorationsChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewDescriptorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/views/browser/viewDescriptorService"},{"name":"ViewEventDispatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEventDispatcher"},{"name":"ViewEventEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewEventHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewEventHandler"},{"name":"ViewEventsCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewFlushedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewFocusChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewIdentifierMap","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewLanguageConfigurationEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLayout"},{"name":"Viewlet","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/remote.contribution"},{"name":"ViewletActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ViewletDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ViewletRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ViewLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"ViewLineData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewLineMappingChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLineOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"ViewLineRenderingData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewLines","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLines"},{"name":"ViewLinesChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLinesDeletedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLinesInsertedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLineToken","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewLineTokenFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewMenuActions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewMenuActions"},{"name":"ViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModelImpl"},{"name":"ViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugViewModel"},{"name":"ViewModelDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewModelDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModelDecorations"},{"name":"ViewOutgoingEvents","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOutgoingEvents"},{"name":"ViewOverlayLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ViewOverlayWidgets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets"},{"name":"ViewPane","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewPaneContainer"},{"name":"ViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewPaneContainer"},{"name":"ViewPart","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"Viewport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewportData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLinesViewportData"},{"name":"ViewQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"ViewRevealRangeRequestEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"viewsContainersContribution","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/viewsExtensionPoint"},{"name":"ViewScrollChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"ViewsWelcomeContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution"},{"name":"viewsWelcomeExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewsWelcomeExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewThemeChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewTokensChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewTokensColorsChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"viewTypeSchamaAddition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"ViewZoneDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"ViewZones","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewZones/viewZones"},{"name":"ViewZonesChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"VirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"VirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"virtualMachineHint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/id"},{"name":"VirualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"VisibleLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewLayer"},{"name":"VisibleRanges","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"visit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"void","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"VRDisplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRDisplayCapabilities","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRDisplayEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VREyeParameters","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRFieldOfView","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRFrameData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRPose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"vs","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"vs_code_editor_walkthrough","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/vs_code_editor_walkthrough"},{"name":"vs_code_welcome_page","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page"},{"name":"vs_dark","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"VS_DARK_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VS_HC_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VS_LIGHT_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VSBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"VTTCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VTTRegion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"W_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WAIT_BETWEEN_RESEND","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"WALK_THROUGH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"WalkThroughArrowDown","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughArrowUp","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider"},{"name":"WalkThroughInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput"},{"name":"WalkThroughModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput"},{"name":"WalkThroughPageDown","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughPageUp","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"WalkThroughSnippetContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider"},{"name":"warn","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Warning","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"watch","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"watch","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/chokidar/types/index"},{"name":"WATCH_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"WatcherChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherIpc"},{"name":"WatcherChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherIpc"},{"name":"WatcherChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherIpc"},{"name":"WatcherChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherIpc"},{"name":"WatchExpressionsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/watchExpressionsView"},{"name":"WatchExpressionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/watchExpressionsView"},{"name":"watchFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"watchFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"watchFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"WatchingProblemCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"WatermarkContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/watermark/browser/watermark"},{"name":"WaveShaperNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WeakMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WeakMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"WeakSet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebAssembly","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"WebAuthentication","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebAuthnAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webContents","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebContents","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"webFrame","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebGL2RenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLActiveInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebglAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-webgl/typings/xterm-addon-webgl"},{"name":"WebGLBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLContextEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLFramebuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLObject","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLProgram","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLQuery","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLRenderbuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLRenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLSampler","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLShader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLShaderPrecisionFormat","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLSync","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLTexture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLTransformFeedback","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLUniformLocation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLVertexArrayObject","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebIssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/browser/issueService"},{"name":"webkitCancelAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitConvertPointFromNodeToPage","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitConvertPointFromPageToNode","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"WebKitCSSMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebKitPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webkitRequestAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitRTCPeerConnection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webkitURL","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebLinksAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-web-links/typings/xterm-addon-web-links"},{"name":"WebRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebResourceIdentityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/common/resourceIdentityService"},{"name":"WebSocket","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebSocketNodeSocket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"WebTelemetryAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/browser/telemetryService"},{"name":"webviewDeveloperCategory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"WebviewEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditor"},{"name":"WebviewEditorCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"WebViewEditorFindNextCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"WebViewEditorFindPreviousCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"WebviewEditorInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory"},{"name":"WebviewEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"WebviewFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewFindWidget"},{"name":"webviewHasOwnEditFunctionsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"webviewHasOwnEditFunctionsContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"WebviewIconManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewIconManager"},{"name":"WebviewInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInput"},{"name":"WebviewMessageChannels","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/baseWebviewElement"},{"name":"WebviewPortMappingManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/portMapping"},{"name":"WebviewResourceResponse","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"WebviewResourceScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"WebviewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewService"},{"name":"webviewTag","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebviewThemeDataProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/themeing"},{"name":"WebWorkerExtensionHostStarter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter"},{"name":"WelcomeInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomeOverlayAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay"},{"name":"WelcomePageAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"welcomePageBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomePageContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/welcomeView"},{"name":"WheelEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"whenDeleted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"whenProviderRegistered","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"while","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"WholeWordsCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"Widget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/widget"},{"name":"widgetShadow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"WidgetVerticalAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager"},{"name":"WillSaveStateReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"win32","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"win32","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"win32","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"Win32UpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.win32"},{"name":"window","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"window","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Window","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WINDOW_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WINDOW_INACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WindowDriverChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverRegistryChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverRegistryChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windows"},{"name":"windowOpenNoOpener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"windowSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"WindowsExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"WindowsKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"windowsKeyboardMappingEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"WindowsMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsMainService"},{"name":"WindowsNativeResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"WindowsShellHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/windowsShellHelper"},{"name":"WindowsShellType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"windowsStore","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Winreg","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"with","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"withEditorModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/editorTestUtils"},{"name":"withFormatting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"withNullAsUndefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"withTestCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"withTestNotebook","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"withUndefinedAsNull","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"WordCharacterClass","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"WordCharacterClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"WordContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/wordContextKey"},{"name":"WordDistance","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/wordDistance"},{"name":"WordLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"WordNavigationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordPartLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"WordPartOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordPartRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"WordRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"WordSelectionRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/wordSelections"},{"name":"Workbench","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/workbench"},{"name":"WORKBENCH_BACKGROUND","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WorkbenchAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchColorsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"WorkbenchCompressibleAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchCompressibleObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchConfigurationNodeBase","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/configuration"},{"name":"WorkbenchContextKeysHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkbenchDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchInstantiationService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"workbenchInstantiationService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"WorkbenchIssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueService"},{"name":"WorkbenchKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keybindingService"},{"name":"WorkbenchList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListAutomaticKeyboardNavigation","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListAutomaticKeyboardNavigationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListDoubleSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListFocusContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListHasSelectionOrFocus","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListMultiSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListSupportsKeyboardNavigation","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListSupportsMultiSelectContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchModeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/mode/common/workbenchModeService"},{"name":"WorkbenchObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchPagedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchReferencesController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch"},{"name":"WorkbenchState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WorkbenchStateContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkbenchThemeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/workbenchThemeService"},{"name":"worker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"Worker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Worker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"Worker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"workerData","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"WorkerExtHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"WorkerExtHostTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"WorkerExtHostTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"workers","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"WorkingCopyCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"WorkingCopyFileOperationParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant"},{"name":"WorkingCopyFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileService"},{"name":"WorkingCopyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"Worklet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"workspace","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Workspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WORKSPACE_EXTENSION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"WORKSPACE_FILTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"WORKSPACE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WORKSPACE_STANDALONE_CONFIGURATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WorkspaceBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"WorkspaceChangeExtHostRelauncher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution"},{"name":"WorkspaceConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"WorkspaceConfigurationEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"WorkspaceConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"WorkspaceEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"WorkspaceEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"WorkspaceEdit","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"WorkspaceFileEdit","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"WorkspaceFolder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WorkspaceFolderCountContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkspaceRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations"},{"name":"WorkspaceRecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"WorkspaceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configurationService"},{"name":"WorkspaceSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"workspaceSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WorkspacesHistoryMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService"},{"name":"WorkspacesMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"WorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesService"},{"name":"WorkspaceSymbol","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"WorkspaceSymbolProviderRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"WorkspaceTags","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"WorkspaceTagsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTagsService"},{"name":"WorkspaceTextEdit","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"WorkspaceWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/workspaceWatcher"},{"name":"wrap","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"WrappingIndent","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"WrappingIndent","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"wrapWithCorrelationContext","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"Writable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"WritableStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"write","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"writeFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFileSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"writeHeapSnapshot","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"writeProfile","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"writer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"WriteStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"WriteStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"writeSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeTransientState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleWordWrap"},{"name":"writeUInt16LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt32BE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt32LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writev","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writevSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"WSA_E_CANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSA_E_NO_MORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEACCES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEADDRINUSE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEADDRNOTAVAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEAFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEALREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEBADF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNABORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDESTADDRREQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDISCON","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDQUOT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEFAULT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEHOSTDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEHOSTUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINPROGRESS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVAL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVALIDPROCTABLE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVALIDPROVIDER","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEISCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAELOOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEMFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEMSGSIZE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENAMETOOLONG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOBUFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOMORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOPROTOOPT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTEMPTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEOPNOTSUPP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROCLIM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROTONOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROTOTYPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROVIDERFAILEDINIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEREMOTE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESHUTDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESOCKTNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESTALE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAETIMEDOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAETOOMANYREFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEUSERS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEWOULDBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSANOTINITIALISED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASERVICE_NOT_FOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASYSCALLFAILURE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASYSNOTREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSATYPE_NOT_FOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAVERNOTSUPPORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"X_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"x01","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x02","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x03","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x04","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x05","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x06","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x07","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x08","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x09","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x10","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x11","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x12","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x13","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x14","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x15","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x16","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x17","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x18","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x19","kind":"const","kindModifiers":"","sortText":"4"},{"name":"xdescribe","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"xdgRuntimeDir","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"xit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLDocument","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequestEventTarget","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequestUpload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLSerializer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathEvaluator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathExpression","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathResult","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XSLTProcessor","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"yield","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Z_ASCII","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BEST_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BEST_SPEED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BINARY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BUF_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DATA_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFAULT_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFAULT_STRATEGY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFLATED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_ERRNO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FILTERED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FINISH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FIXED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FULL_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_HUFFMAN_ONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_MEM_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NEED_DICT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NO_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NO_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_PARTIAL_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_RLE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_STREAM_END","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_STREAM_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_SYNC_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_TEXT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_TREES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_UNKNOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_VERSION_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"zip","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"ZipFile","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"ZipFile","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yazl/index"},{"name":"ZoneWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"ZoomInAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ZoomOutAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ZoomResetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"}]}}'; + data = new ExtHostDocumentData(undefined!, URI.file(''), [ - line + perfData._$_$_expensive ], '\n', 'text', 1, false); let range = data.document.getWordRangeAtPosition(new Position(0, 1_177_170), regex)!; diff --git a/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts b/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts index 3c7b6919f56..139d67793dc 100644 --- a/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts +++ b/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts @@ -111,6 +111,41 @@ suite('NotebookConcatDocument', function () { assert.deepStrictEqual(actual, lines); } + test('contains', function () { + + const cellUri1 = CellUri.generate(notebook.uri, 1); + const cellUri2 = CellUri.generate(notebook.uri, 2); + + extHostNotebooks.$acceptModelChanged(notebookUri, { + kind: NotebookCellsChangeType.ModelChange, + versionId: notebook.versionId + 1, + changes: [[0, 0, [{ + handle: 1, + uri: cellUri1, + source: ['Hello', 'World', 'Hello World!'], + language: 'test', + cellKind: CellKind.Code, + outputs: [], + }, { + handle: 2, + uri: cellUri2, + source: ['Hallo', 'Welt', 'Hallo Welt!'], + language: 'test', + cellKind: CellKind.Code, + outputs: [], + }]]] + }); + + + assert.equal(notebook.cells.length, 1 + 2); // markdown and code + + let doc = new ExtHostNotebookConcatDocument(extHostNotebooks, extHostDocuments, notebook, undefined); + + assert.equal(doc.contains(cellUri1), true); + assert.equal(doc.contains(cellUri2), true); + assert.equal(doc.contains(URI.parse('some://miss/path')), false); + }); + test('location, position mapping', function () { extHostNotebooks.$acceptModelChanged(notebookUri, { @@ -454,4 +489,53 @@ suite('NotebookConcatDocument', function () { assert.equal(doc.getText(new Range(0, 0, 1, 0)), 'Hello\n'); assert.equal(doc.getText(new Range(2, 0, 4, 0)), 'Hello World!\nHallo\n'); }); + + test('validateRange/Position', function () { + + extHostNotebooks.$acceptModelChanged(notebookUri, { + kind: NotebookCellsChangeType.ModelChange, + versionId: notebook.versionId + 1, + changes: [[0, 0, [{ + handle: 1, + uri: CellUri.generate(notebook.uri, 1), + source: ['Hello', 'World', 'Hello World!'], + language: 'test', + cellKind: CellKind.Code, + outputs: [], + }, { + handle: 2, + uri: CellUri.generate(notebook.uri, 2), + source: ['Hallo', 'Welt', 'Hallo Welt!'], + language: 'test', + cellKind: CellKind.Code, + outputs: [], + }]]] + }); + + assert.equal(notebook.cells.length, 1 + 2); // markdown and code + + let doc = new ExtHostNotebookConcatDocument(extHostNotebooks, extHostDocuments, notebook, undefined); + assertLines(doc, 'Hello', 'World', 'Hello World!', 'Hallo', 'Welt', 'Hallo Welt!'); + + + function assertPosition(actual: vscode.Position, expectedLine: number, expectedCh: number) { + assert.equal(actual.line, expectedLine); + assert.equal(actual.character, expectedCh); + } + + + // "fixed" + assertPosition(doc.validatePosition(new Position(0, 1000)), 0, 5); + assertPosition(doc.validatePosition(new Position(2, 1000)), 2, 12); + assertPosition(doc.validatePosition(new Position(5, 1000)), 5, 11); + assertPosition(doc.validatePosition(new Position(5000, 1000)), 5, 11); + + // "good" + assertPosition(doc.validatePosition(new Position(0, 1)), 0, 1); + assertPosition(doc.validatePosition(new Position(0, 5)), 0, 5); + assertPosition(doc.validatePosition(new Position(2, 8)), 2, 8); + assertPosition(doc.validatePosition(new Position(2, 12)), 2, 12); + assertPosition(doc.validatePosition(new Position(5, 11)), 5, 11); + + }); }); diff --git a/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts index 306c6662332..d0f65701a26 100644 --- a/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts @@ -95,10 +95,6 @@ suite('MainThreadEditors', () => { services.set(IEditorGroupsService, new TestEditorGroupsService()); services.set(ITextFileService, new class extends mock() { isDirty() { return false; } - create(resource: URI) { - createdResources.add(resource); - return Promise.resolve(Object.create(null)); - } files = { onDidSave: Event.None, onDidRevert: Event.None, @@ -107,16 +103,24 @@ suite('MainThreadEditors', () => { }); services.set(IWorkingCopyFileService, new class extends mock() { onDidRunWorkingCopyFileOperation = Event.None; - move(source: URI, target: URI) { + create(resource: URI) { + createdResources.add(resource); + return Promise.resolve(Object.create(null)); + } + move(files: { source: URI, target: URI }[]) { + const { source, target } = files[0]; movedResources.set(source, target); return Promise.resolve(Object.create(null)); } - copy(source: URI, target: URI) { + copy(files: { source: URI, target: URI }[]) { + const { source, target } = files[0]; copiedResources.set(source, target); return Promise.resolve(Object.create(null)); } - delete(resource: URI) { - deletedResources.add(resource); + delete(resources: URI[]) { + for (const resource of resources) { + deletedResources.add(resource); + } return Promise.resolve(undefined); } }); diff --git a/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts b/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts index 067919112c6..1a39ca03966 100644 --- a/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts @@ -32,7 +32,7 @@ suite('Breadcrumb Model', function () { test('only uri, inside workspace', function () { - let model = new EditorBreadcrumbsModel(URI.parse('foo:/bar/baz/ws/some/path/file.ts'), undefined, configService, configService, workspaceService); + let model = new EditorBreadcrumbsModel(URI.parse('foo:/bar/baz/ws/some/path/file.ts'), URI.parse('foo:/bar/baz/ws/some/path/file.ts'), undefined, configService, configService, workspaceService); let elements = model.getElements(); assert.equal(elements.length, 3); @@ -45,9 +45,24 @@ suite('Breadcrumb Model', function () { assert.equal(three.uri.toString(), 'foo:/bar/baz/ws/some/path/file.ts'); }); + test('display uri matters for FileElement', function () { + + let model = new EditorBreadcrumbsModel(URI.parse('foo:/bar/baz/ws/some/PATH/file.ts'), URI.parse('foo:/bar/baz/ws/some/path/file.ts'), undefined, configService, configService, workspaceService); + let elements = model.getElements(); + + assert.equal(elements.length, 3); + let [one, two, three] = elements as FileElement[]; + assert.equal(one.kind, FileKind.FOLDER); + assert.equal(two.kind, FileKind.FOLDER); + assert.equal(three.kind, FileKind.FILE); + assert.equal(one.uri.toString(), 'foo:/bar/baz/ws/some'); + assert.equal(two.uri.toString(), 'foo:/bar/baz/ws/some/PATH'); + assert.equal(three.uri.toString(), 'foo:/bar/baz/ws/some/PATH/file.ts'); + }); + test('only uri, outside workspace', function () { - let model = new EditorBreadcrumbsModel(URI.parse('foo:/outside/file.ts'), undefined, configService, configService, workspaceService); + let model = new EditorBreadcrumbsModel(URI.parse('foo:/outside/file.ts'), URI.parse('foo:/outside/file.ts'), undefined, configService, configService, workspaceService); let elements = model.getElements(); assert.equal(elements.length, 2); diff --git a/src/vs/workbench/test/browser/parts/editor/editor.test.ts b/src/vs/workbench/test/browser/parts/editor/editor.test.ts index e974da14e70..74821dc414f 100644 --- a/src/vs/workbench/test/browser/parts/editor/editor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editor.test.ts @@ -34,8 +34,8 @@ suite('Workbench editor', () => { const untitled = instantiationService.createInstance(UntitledTextEditorInput, service.create()); assert.equal(toResource(untitled)!.toString(), untitled.resource.toString()); - assert.equal(toResource(untitled, { supportSideBySide: SideBySideEditor.MASTER })!.toString(), untitled.resource.toString()); - assert.equal(toResource(untitled, { supportSideBySide: SideBySideEditor.DETAILS })!.toString(), untitled.resource.toString()); + assert.equal(toResource(untitled, { supportSideBySide: SideBySideEditor.PRIMARY })!.toString(), untitled.resource.toString()); + assert.equal(toResource(untitled, { supportSideBySide: SideBySideEditor.SECONDARY })!.toString(), untitled.resource.toString()); assert.equal(toResource(untitled, { supportSideBySide: SideBySideEditor.BOTH })!.toString(), untitled.resource.toString()); assert.equal(toResource(untitled, { filterByScheme: Schemas.untitled })!.toString(), untitled.resource.toString()); assert.equal(toResource(untitled, { filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), untitled.resource.toString()); @@ -44,8 +44,8 @@ suite('Workbench editor', () => { const file = new TestEditorInput(URI.file('/some/path.txt'), 'editorResourceFileTest'); assert.equal(toResource(file)!.toString(), file.resource.toString()); - assert.equal(toResource(file, { supportSideBySide: SideBySideEditor.MASTER })!.toString(), file.resource.toString()); - assert.equal(toResource(file, { supportSideBySide: SideBySideEditor.DETAILS })!.toString(), file.resource.toString()); + assert.equal(toResource(file, { supportSideBySide: SideBySideEditor.PRIMARY })!.toString(), file.resource.toString()); + assert.equal(toResource(file, { supportSideBySide: SideBySideEditor.SECONDARY })!.toString(), file.resource.toString()); assert.equal(toResource(file, { supportSideBySide: SideBySideEditor.BOTH })!.toString(), file.resource.toString()); assert.equal(toResource(file, { filterByScheme: Schemas.file })!.toString(), file.resource.toString()); assert.equal(toResource(file, { filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), file.resource.toString()); @@ -56,20 +56,20 @@ suite('Workbench editor', () => { assert.ok(!toResource(diffEditorInput)); assert.ok(!toResource(diffEditorInput, { filterByScheme: Schemas.file })); - assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.MASTER })!.toString(), file.resource.toString()); - assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.MASTER, filterByScheme: Schemas.file })!.toString(), file.resource.toString()); - assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.MASTER, filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), file.resource.toString()); + assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.PRIMARY })!.toString(), file.resource.toString()); + assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.PRIMARY, filterByScheme: Schemas.file })!.toString(), file.resource.toString()); + assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.PRIMARY, filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), file.resource.toString()); - assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.DETAILS })!.toString(), untitled.resource.toString()); - assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.DETAILS, filterByScheme: Schemas.untitled })!.toString(), untitled.resource.toString()); - assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.DETAILS, filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), untitled.resource.toString()); + assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.SECONDARY })!.toString(), untitled.resource.toString()); + assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: Schemas.untitled })!.toString(), untitled.resource.toString()); + assert.equal(toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), untitled.resource.toString()); - assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH }) as { master: URI, detail: URI }).master.toString(), file.resource.toString()); - assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { master: URI, detail: URI }).master.toString(), file.resource.toString()); - assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { master: URI, detail: URI }).master.toString(), file.resource.toString()); + assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); + assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); + assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH }) as { master: URI, detail: URI }).detail.toString(), untitled.resource.toString()); - assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { master: URI, detail: URI }).detail.toString(), untitled.resource.toString()); - assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { master: URI, detail: URI }).detail.toString(), untitled.resource.toString()); + assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); + assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); + assert.equal((toResource(diffEditorInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); }); }); diff --git a/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts b/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts index f2197f693bb..6c41c464c08 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts @@ -150,6 +150,8 @@ class NonSerializableTestEditorInput extends EditorInput { class TestFileEditorInput extends EditorInput implements IFileEditorInput { + readonly label = this.resource; + constructor(public id: string, public resource: URI) { super(); } @@ -277,9 +279,11 @@ suite('Workbench editor groups', () => { group.openEditor(input1, { pinned: true, active: true }); assert.equal(group.contains(input1), true); - assert.equal(group.contains(input1, true), true); + assert.equal(group.contains(input1, { strictEquals: true }), true); + assert.equal(group.contains(input1, { supportSideBySide: true }), true); assert.equal(group.contains(input2), false); - assert.equal(group.contains(input2, true), false); + assert.equal(group.contains(input2, { strictEquals: true }), false); + assert.equal(group.contains(input2, { supportSideBySide: true }), false); assert.equal(group.contains(diffInput1), false); assert.equal(group.contains(diffInput2), false); @@ -307,7 +311,7 @@ suite('Workbench editor groups', () => { group.closeEditor(input1); assert.equal(group.contains(input1), false); - assert.equal(group.contains(input1, true), true); + assert.equal(group.contains(input1, { supportSideBySide: true }), true); assert.equal(group.contains(input2), true); assert.equal(group.contains(diffInput1), true); assert.equal(group.contains(diffInput2), true); @@ -315,27 +319,27 @@ suite('Workbench editor groups', () => { group.closeEditor(input2); assert.equal(group.contains(input1), false); - assert.equal(group.contains(input1, true), true); + assert.equal(group.contains(input1, { supportSideBySide: true }), true); assert.equal(group.contains(input2), false); - assert.equal(group.contains(input2, true), true); + assert.equal(group.contains(input2, { supportSideBySide: true }), true); assert.equal(group.contains(diffInput1), true); assert.equal(group.contains(diffInput2), true); group.closeEditor(diffInput1); assert.equal(group.contains(input1), false); - assert.equal(group.contains(input1, true), true); + assert.equal(group.contains(input1, { supportSideBySide: true }), true); assert.equal(group.contains(input2), false); - assert.equal(group.contains(input2, true), true); + assert.equal(group.contains(input2, { supportSideBySide: true }), true); assert.equal(group.contains(diffInput1), false); assert.equal(group.contains(diffInput2), true); group.closeEditor(diffInput2); assert.equal(group.contains(input1), false); - assert.equal(group.contains(input1, true), false); + assert.equal(group.contains(input1, { supportSideBySide: true }), false); assert.equal(group.contains(input2), false); - assert.equal(group.contains(input2, true), false); + assert.equal(group.contains(input2, { supportSideBySide: true }), false); assert.equal(group.contains(diffInput1), false); assert.equal(group.contains(diffInput2), false); diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 2e8dea553a5..ffe65cfc0fa 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -23,7 +23,7 @@ import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbe import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ILifecycleService, BeforeShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase, WillShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { FileOperationEvent, IFileService, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, ICreateFileOptions, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions, IReadFileOptions, IFileContent, IFileStreamContent, FileOperationError } from 'vs/platform/files/common/files'; +import { FileOperationEvent, IFileService, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, ICreateFileOptions, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions, IReadFileOptions, IFileContent, IFileStreamContent, FileOperationError, IFileSystemProviderWithFileReadStreamCapability } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; @@ -110,6 +110,10 @@ import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; +import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider'; +import { newWriteableStream, ReadableStreamEvents } from 'vs/base/common/stream'; +import { EncodingOracle, IEncodingOverride } from 'vs/workbench/services/textfile/browser/textFileService'; +import { UTF16le, UTF16be, UTF8_with_bom } from 'vs/workbench/services/textfile/common/encoding'; export function createFileEditorInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined, undefined); @@ -273,6 +277,31 @@ export class TestTextFileService extends BrowserTextFileService { } } +export class TestBrowserTextFileServiceWithEncodingOverrides extends BrowserTextFileService { + + private _testEncoding: TestEncodingOracle | undefined; + get encoding(): TestEncodingOracle { + if (!this._testEncoding) { + this._testEncoding = this._register(this.instantiationService.createInstance(TestEncodingOracle)); + } + + return this._testEncoding; + } +} + +class TestEncodingOracle extends EncodingOracle { + + protected get encodingOverrides(): IEncodingOverride[] { + return [ + { extension: 'utf16le', encoding: UTF16le }, + { extension: 'utf16be', encoding: UTF16be }, + { extension: 'utf8bom', encoding: UTF8_with_bom } + ]; + } + + protected set encodingOverrides(overrides: IEncodingOverride[]) { } +} + class TestEnvironmentServiceWithArgs extends BrowserWorkbenchEnvironmentService { args = []; } @@ -495,6 +524,7 @@ export class TestViewsService implements IViewsService { openView(id: string, focus?: boolean | undefined): Promise { return Promise.resolve(null); } closeView(id: string): void { } getViewProgressIndicator(id: string) { return null!; } + getActiveViewPaneContainerWithId(id: string) { return null; } } export class TestEditorGroupsService implements IEditorGroupsService { @@ -835,6 +865,7 @@ export class TestFileService implements IFileService { getWriteEncoding(_resource: URI): IResourceEncoding { return { encoding: 'utf8', hasBOM: false }; } dispose(): void { } + async canCreateFile(source: URI, options?: ICreateFileOptions): Promise { return true; } async canMove(source: URI, target: URI, overwrite?: boolean | undefined): Promise { return true; } async canCopy(source: URI, target: URI, overwrite?: boolean | undefined): Promise { return true; } async canDelete(resource: URI, options?: { useTrash?: boolean | undefined; recursive?: boolean | undefined; } | undefined): Promise { return true; } @@ -944,6 +975,39 @@ export class RemoteFileSystemProvider implements IFileSystemProvider { private toFileResource(resource: URI): URI { return resource.with({ scheme: Schemas.file, authority: '' }); } } +export class TestInMemoryFileSystemProvider extends InMemoryFileSystemProvider implements IFileSystemProviderWithFileReadStreamCapability { + readonly capabilities: FileSystemProviderCapabilities = + FileSystemProviderCapabilities.FileReadWrite + | FileSystemProviderCapabilities.PathCaseSensitive + | FileSystemProviderCapabilities.FileReadStream; + + + readFileStream(resource: URI): ReadableStreamEvents { + const BUFFER_SIZE = 64 * 1024; + const stream = newWriteableStream(data => VSBuffer.concat(data.map(data => VSBuffer.wrap(data))).buffer); + + (async () => { + try { + const data = await this.readFile(resource); + + let offset = 0; + while (offset < data.length) { + await timeout(0); + await stream.write(data.subarray(offset, offset + BUFFER_SIZE)); + offset += BUFFER_SIZE; + } + + await timeout(0); + stream.end(); + } catch (error) { + stream.end(error); + } + })(); + + return stream; + } +} + export const productService: IProductService = { _serviceBrand: undefined, ...product }; export class TestHostService implements IHostService { @@ -1056,11 +1120,13 @@ export function registerTestEditor(id: string, inputs: SyncDescriptor { diff --git a/src/vs/workbench/test/common/workbenchTestServices.ts b/src/vs/workbench/test/common/workbenchTestServices.ts index 5ec62b286e5..3dda9efc00d 100644 --- a/src/vs/workbench/test/common/workbenchTestServices.ts +++ b/src/vs/workbench/test/common/workbenchTestServices.ts @@ -18,7 +18,8 @@ import { WorkingCopyService, IWorkingCopy } from 'vs/workbench/services/workingC import { NullExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IWorkingCopyFileService, IWorkingCopyFileOperationParticipant, WorkingCopyFileEvent } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { FileOperation, IFileStatWithMetadata } from 'vs/platform/files/common/files'; +import { IFileStatWithMetadata } from 'vs/platform/files/common/files'; +import { VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; export class TestTextResourcePropertiesService implements ITextResourcePropertiesService { @@ -134,17 +135,17 @@ export class TestWorkingCopyFileService implements IWorkingCopyFileService { addFileOperationParticipant(participant: IWorkingCopyFileOperationParticipant): IDisposable { return Disposable.None; } - async runFileOperationParticipants(target: URI, source: URI | undefined, operation: FileOperation): Promise { } - - async delete(resource: URI, options?: { useTrash?: boolean | undefined; recursive?: boolean | undefined; } | undefined): Promise { } + async delete(resources: URI[], options?: { useTrash?: boolean | undefined; recursive?: boolean | undefined; } | undefined): Promise { } registerWorkingCopyProvider(provider: (resourceOrFolder: URI) => IWorkingCopy[]): IDisposable { return Disposable.None; } getDirty(resource: URI): IWorkingCopy[] { return []; } - move(source: URI, target: URI, overwrite?: boolean | undefined): Promise { throw new Error('Method not implemented.'); } + create(resource: URI, contents?: VSBuffer | VSBufferReadable | VSBufferReadableStream, options?: { overwrite?: boolean | undefined; } | undefined): Promise { throw new Error('Method not implemented.'); } - copy(source: URI, target: URI, overwrite?: boolean | undefined): Promise { throw new Error('Method not implemented.'); } + move(files: { source: URI; target: URI; }[], options?: { overwrite?: boolean }): Promise { throw new Error('Method not implemented.'); } + + copy(files: { source: URI; target: URI; }[], options?: { overwrite?: boolean }): Promise { throw new Error('Method not implemented.'); } } export function mock(): Ctor { diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index a080fba7091..deb8846ac4b 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -7,7 +7,8 @@ import { workbenchInstantiationService as browserWorkbenchInstantiationService, import { Event } from 'vs/base/common/event'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { NativeWorkbenchEnvironmentService, INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { NativeTextFileService, EncodingOracle, IEncodingOverride } from 'vs/workbench/services/textfile/electron-browser/nativeTextFileService'; +import { NativeTextFileService, } from 'vs/workbench/services/textfile/electron-browser/nativeTextFileService'; +import { EncodingOracle, IEncodingOverride } from 'vs/workbench/services/textfile/browser/textFileService'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { FileOperationError, IFileService } from 'vs/platform/files/common/files'; import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; @@ -29,7 +30,7 @@ import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; import { LogLevel, ILogService } from 'vs/platform/log/common/log'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; -import { UTF16le, UTF16be, UTF8_with_bom } from 'vs/base/node/encoding'; +import { UTF16le, UTF16be, UTF8_with_bom } from 'vs/workbench/services/textfile/common/encoding'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; @@ -39,6 +40,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { INativeWindowConfiguration } from 'vs/platform/windows/node/window'; import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { MouseInputEvent } from 'vs/base/parts/sandbox/common/electronTypes'; export const TestWindowConfiguration: INativeWindowConfiguration = { windowId: 0, @@ -173,6 +175,7 @@ export class TestElectronService implements IElectronService { onWindowUnmaximize: Event = Event.None; onWindowFocus: Event = Event.None; onWindowBlur: Event = Event.None; + onOSResume: Event = Event.None; windowCount = Promise.resolve(1); getWindowCount(): Promise { return this.windowCount; } @@ -212,11 +215,13 @@ export class TestElectronService implements IElectronService { async moveWindowTabToNewWindow(): Promise { } async mergeAllWindowTabs(): Promise { } async toggleWindowTabsBar(): Promise { } + async notifyReady(): Promise { } async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined; } | undefined): Promise { } async reload(): Promise { } async closeWindow(): Promise { } async closeWindowById(): Promise { } async quit(): Promise { } + async exit(code: number): Promise { } async openDevTools(options?: Electron.OpenDevToolsOptions | undefined): Promise { } async toggleDevTools(): Promise { } async startCrashReporter(options: Electron.CrashReporterStartOptions): Promise { } @@ -228,6 +233,7 @@ export class TestElectronService implements IElectronService { async writeClipboardBuffer(format: string, buffer: Uint8Array, type?: 'selection' | 'clipboard' | undefined): Promise { } async readClipboardBuffer(format: string): Promise { return Uint8Array.from([]); } async hasClipboard(format: string, type?: 'selection' | 'clipboard' | undefined): Promise { return false; } + async sendInputEvent(event: MouseInputEvent): Promise { } } export function workbenchInstantiationService(): ITestInstantiationService { diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index dfa6a353a34..6ba5cea20fe 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -73,9 +73,10 @@ import 'vs/workbench/services/mode/common/workbenchModeService'; import 'vs/workbench/services/commands/common/commandService'; import 'vs/workbench/services/themes/browser/workbenchThemeService'; import 'vs/workbench/services/label/common/labelService'; +import 'vs/workbench/services/extensionManagement/common/webExtensionsScannerService'; import 'vs/workbench/services/extensionManagement/common/extensionEnablementService'; +import 'vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService'; import 'vs/workbench/services/notification/common/notificationService'; -import 'vs/workbench/services/extensions/common/staticExtensions'; import 'vs/workbench/services/userDataSync/common/userDataSyncUtil'; import 'vs/workbench/services/remote/common/remoteExplorerService'; import 'vs/workbench/services/workingCopy/common/workingCopyService'; @@ -85,6 +86,7 @@ import 'vs/workbench/services/views/browser/viewDescriptorService'; import 'vs/workbench/services/quickinput/browser/quickInputService'; import 'vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService'; import 'vs/workbench/services/authentication/browser/authenticationService'; +import 'vs/workbench/services/hover/browser/hoverService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionGalleryService'; @@ -111,10 +113,10 @@ import { IDownloadService } from 'vs/platform/download/common/download'; import { DownloadService } from 'vs/platform/download/common/downloadService'; import { OpenerService } from 'vs/editor/browser/services/openerService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; -import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; +import { IUserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { UserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSyncResourceEnablementService'; -registerSingleton(IUserDataSyncEnablementService, UserDataSyncEnablementService); +registerSingleton(IUserDataSyncResourceEnablementService, UserDataSyncResourceEnablementService); registerSingleton(IGlobalExtensionEnablementService, GlobalExtensionEnablementService); registerSingleton(IExtensionGalleryService, ExtensionGalleryService, true); registerSingleton(IContextViewService, ContextViewService, true); @@ -174,7 +176,6 @@ import 'vs/workbench/contrib/sash/browser/sash.contribution'; // SCM import 'vs/workbench/contrib/scm/browser/scm.contribution'; -import 'vs/workbench/contrib/scm/browser/scmViewlet'; // Debug import 'vs/workbench/contrib/debug/browser/debug.contribution'; @@ -207,6 +208,7 @@ import 'vs/workbench/contrib/output/browser/outputView'; // Terminal import 'vs/workbench/contrib/terminal/common/environmentVariable.contribution'; +import 'vs/workbench/contrib/terminal/common/terminalExtensionPoints.contribution'; import 'vs/workbench/contrib/terminal/browser/terminal.contribution'; import 'vs/workbench/contrib/terminal/browser/terminalView'; diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 8b9eca46171..8399a2ea199 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -34,7 +34,6 @@ import 'vs/workbench/electron-browser/desktop.main'; //#region --- workbench services -import 'vs/workbench/services/dialogs/electron-browser/fileDialogService'; import 'vs/workbench/services/integrity/node/integrityService'; import 'vs/workbench/services/textMate/electron-browser/textMateService'; import 'vs/workbench/services/search/node/searchService'; @@ -44,7 +43,6 @@ import 'vs/workbench/services/dialogs/electron-browser/dialogService'; import 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; import 'vs/workbench/services/keybinding/electron-browser/keybinding.contribution'; import 'vs/workbench/services/extensions/electron-browser/extensionService'; -import 'vs/workbench/services/contextmenu/electron-sandbox/contextmenuService'; // TODO@Miguel this cannot be moved to sandbox due to https://github.com/microsoft/vscode/issues/98495 import 'vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService'; import 'vs/workbench/services/extensionManagement/electron-browser/extensionTipsService'; import 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; @@ -52,7 +50,6 @@ import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; import 'vs/workbench/services/configurationResolver/electron-browser/configurationResolverService'; import 'vs/workbench/services/extensionManagement/node/extensionManagementService'; import 'vs/workbench/services/accessibility/electron-browser/accessibilityService'; -import 'vs/workbench/services/remote/node/tunnelService'; import 'vs/workbench/services/backup/node/backupFileService'; import 'vs/workbench/services/workspaces/electron-browser/workspaceEditingService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService'; @@ -60,7 +57,6 @@ import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncService' import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncAccountService'; import 'vs/workbench/services/sharedProcess/electron-browser/sharedProcessService'; import 'vs/workbench/services/localizations/electron-browser/localizationsService'; -import 'vs/workbench/services/clipboard/electron-browser/clipboardService'; import 'vs/workbench/services/path/electron-browser/pathService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -68,9 +64,12 @@ import { ICredentialsService } from 'vs/platform/credentials/common/credentials' import { KeytarCredentialsService } from 'vs/platform/credentials/node/credentialsService'; import { IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataAutoSyncService } from 'vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { TunnelService } from 'vs/platform/remote/node/tunnelService'; registerSingleton(ICredentialsService, KeytarCredentialsService, true); registerSingleton(IUserDataAutoSyncService, UserDataAutoSyncService); +registerSingleton(ITunnelService, TunnelService); //#endregion diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index dd514a58ff6..4ab428b3565 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -19,6 +19,7 @@ import 'vs/workbench/workbench.common.main'; //#region --- workbench services +import 'vs/workbench/services/dialogs/electron-sandbox/fileDialogService'; import 'vs/workbench/services/workspaces/electron-sandbox/workspacesService'; import 'vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService'; import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; @@ -30,6 +31,8 @@ import 'vs/workbench/services/title/electron-sandbox/titleService'; import 'vs/workbench/services/host/electron-sandbox/desktopHostService'; import 'vs/workbench/services/request/electron-sandbox/requestService'; import 'vs/workbench/services/extensionResourceLoader/electron-sandbox/extensionResourceLoaderService'; +import 'vs/workbench/services/clipboard/electron-sandbox/clipboardService'; +import 'vs/workbench/services/contextmenu/electron-sandbox/contextmenuService'; //#endregion diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index 3a9b9113d12..05124a2197b 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -17,6 +17,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IWorkspaceProvider, IWorkspace } from 'vs/workbench/services/host/browser/browserHostService'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { IProductConfiguration } from 'vs/platform/product/common/productService'; interface IResourceUriProvider { (uri: URI): URI; @@ -259,6 +260,11 @@ interface IWorkbenchConstructionOptions { */ readonly staticExtensions?: ReadonlyArray; + /** + * Service end-point hosting builtin extensions + */ + readonly builtinExtensionsServiceUrl?: string; + /** * Support for URL callbacks. */ @@ -282,15 +288,25 @@ interface IWorkbenchConstructionOptions { */ readonly commands?: readonly ICommand[]; + /** + * Optional default layout to apply on first time the workspace is opened. + */ + readonly defaultLayout?: IDefaultLayout; + + //#endregion + + + //#region Branding + /** * Optional home indicator to appear above the hamburger menu in the activity bar. */ readonly homeIndicator?: IHomeIndicator; /** - * Optional default layout to apply on first time the workspace is opened. + * Optional override for the product configuration properties. */ - readonly defaultLayout?: IDefaultLayout; + readonly productConfiguration?: Partial; //#endregion @@ -438,14 +454,16 @@ export { ICommand, commands, - // Home Indicator + // Branding IHomeIndicator, + IProductConfiguration, // Default layout + IDefaultView, IDefaultEditor, IDefaultLayout, IDefaultPanelLayout, - IDefaultSideBarLayout, + IDefaultSideBarLayout }; //#endregion diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 1b8690e456b..153ac595d03 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -61,8 +61,7 @@ import { BackupFileService } from 'vs/workbench/services/backup/common/backupFil import { IExtensionManagementService, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionTipsService'; import { ExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagementService'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; -import { TunnelService } from 'vs/workbench/services/remote/common/tunnelService'; +import { ITunnelService, TunnelService } from 'vs/platform/remote/common/tunnel'; import { ILoggerService } from 'vs/platform/log/common/log'; import { FileLoggerService } from 'vs/platform/log/common/fileLogService'; import { UserDataSyncMachinesService, IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index 4e15358eeb0..4fee84023ec 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -33,8 +33,8 @@ export function setup() { await app.workbench.search.openSearchViewlet(); await app.workbench.search.waitForTitle(title => /suchen/i.test(title)); - await app.workbench.scm.openSCMViewlet(); - await app.workbench.scm.waitForTitle(title => /quellcodeverwaltung/i.test(title)); + // await app.workbench.scm.openSCMViewlet(); + // await app.workbench.scm.waitForTitle(title => /quellcodeverwaltung/i.test(title)); // See https://github.com/microsoft/vscode/issues/93462 // await app.workbench.debug.openDebugViewlet(); diff --git a/test/unit/browser/renderer.html b/test/unit/browser/renderer.html index 61b2de146ab..27f7ecd3c42 100644 --- a/test/unit/browser/renderer.html +++ b/test/unit/browser/renderer.html @@ -51,10 +51,12 @@ catchError: true, baseUrl: new URL('../../../src', baseUrl).href, paths: { - 'vs': new URL(`../../../${!!isBuild ? 'out-build' : 'out'}/vs`, baseUrl).href, + vs: new URL(`../../../${!!isBuild ? 'out-build' : 'out'}/vs`, baseUrl).href, assert: new URL('../assert.js', baseUrl).href, sinon: new URL('../../../node_modules/sinon/pkg/sinon-1.17.7.js', baseUrl).href, - xterm: new URL('../../../node_modules/xterm/lib/xterm.js', baseUrl).href + xterm: new URL('../../../node_modules/xterm/lib/xterm.js', baseUrl).href, + 'iconv-lite-umd': new URL('../../../node_modules/iconv-lite-umd/lib/iconv-lite-umd.js', baseUrl).href, + jschardet: new URL('../../../node_modules/jschardet/dist/jschardet.min.js', baseUrl).href } }); diff --git a/test/unit/electron/index.js b/test/unit/electron/index.js index 1911ffc1772..6d1c7653799 100644 --- a/test/unit/electron/index.js +++ b/test/unit/electron/index.js @@ -117,7 +117,9 @@ app.on('ready', () => { webSecurity: false, webviewTag: true, preload: path.join(__dirname, '..', '..', '..', 'src', 'vs', 'base', 'parts', 'sandbox', 'electron-browser', 'preload.js'), // ensure similar environment as VSCode as tests may depend on this - enableWebSQL: false + enableWebSQL: false, + enableRemoteModule: false, + nativeWindowOpen: true } }); diff --git a/yarn.lock b/yarn.lock index 283315f8e58..4d9927a94b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -222,13 +222,6 @@ dependencies: "@types/node" "*" -"@types/iconv-lite@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@types/iconv-lite/-/iconv-lite-0.0.1.tgz#aa3b8bda2be512b1ae0a057b942e869c370a5569" - integrity sha1-qjuL2ivlErGuCgV7lC6GnDcKVWk= - dependencies: - "@types/node" "*" - "@types/json-schema@^7.0.3": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" @@ -340,41 +333,51 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz#4ac00ecca3bbea740c577f1843bc54fa69c3def2" - integrity sha512-D52KwdgkjYc+fmTZKW7CZpH5ZBJREJKZXRrveMiRCmlzZ+Rw9wRVJ1JAmHQ9b/+Ehy1ZeaylofDB9wwXUt83wg== +"@typescript-eslint/eslint-plugin@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.2.0.tgz#7fb997f391af32ae6ca1dbe56bcefe4dd30bda14" + integrity sha512-t9RTk/GyYilIXt6BmZurhBzuMT9kLKw3fQoJtK9ayv0tXTlznXEAnx07sCLXdkN3/tZDep1s1CEV95CWuARYWA== dependencies: - "@typescript-eslint/experimental-utils" "3.1.0" + "@typescript-eslint/experimental-utils" "3.2.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.1.0.tgz#2d5dba7c2ac2a3da3bfa3f461ff64de38587a872" - integrity sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w== +"@typescript-eslint/experimental-utils@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.2.0.tgz#4dab8fc9f44f059ec073470a81bb4d7d7d51e6c5" + integrity sha512-UbJBsk+xO9dIFKtj16+m42EvUvsjZbbgQ2O5xSTSfVT1Z3yGkL90DVu0Hd3029FZ5/uBgl+F3Vo8FAcEcqc6aQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "3.1.0" + "@typescript-eslint/typescript-estree" "3.2.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.1.0.tgz#9c02ba5d88ad2355672f39e6cd4176f172dd47f8" - integrity sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q== +"@typescript-eslint/experimental-utils@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.3.0.tgz#d72a946e056a83d4edf97f3411cceb639b0b8c87" + integrity sha512-d4pGIAbu/tYsrPrdHCQ5xfadJGvlkUxbeBB56nO/VGmEDi/sKmfa5fGty5t5veL1OyJBrUmSiRn1R1qfVDydrg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "3.3.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.3.0.tgz#fcae40012ded822aa8b2739a1a03a4e3c5bbb7bb" + integrity sha512-a7S0Sqn/+RpOOWTcaLw6RD4obsharzxmgMfdK24l364VxuBODXjuJM7ImCkSXEN7oz52aiZbXSbc76+2EsE91w== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.1.0" - "@typescript-eslint/typescript-estree" "3.1.0" + "@typescript-eslint/experimental-utils" "3.3.0" + "@typescript-eslint/typescript-estree" "3.3.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.1.0.tgz#eaff52d31e615e05b894f8b9d2c3d8af152a5dd2" - integrity sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ== +"@typescript-eslint/typescript-estree@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.2.0.tgz#c735f1ca6b4d3cd671f30de8c9bde30843e7ead8" + integrity sha512-uh+Y2QO7dxNrdLw7mVnjUqkwO/InxEqwN0wF+Za6eo3coxls9aH9kQ/5rSvW2GcNanebRTmsT5w1/92lAOb1bA== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" @@ -384,172 +387,179 @@ semver "^7.3.2" tsutils "^3.17.1" -"@webassemblyjs/ast@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" - integrity sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA== +"@typescript-eslint/typescript-estree@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.3.0.tgz#841ffed25c29b0049ebffb4c2071268a34558a2a" + integrity sha512-3SqxylENltEvJsjjMSDCUx/edZNSC7wAqifUU1Ywp//0OWEZwMZJfecJud9XxJ/40rAKEbJMKBOQzeOjrLJFzQ== dependencies: - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - debug "^3.1.0" - mamacro "^0.0.3" + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" -"@webassemblyjs/floating-point-hex-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" - integrity sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA== - -"@webassemblyjs/helper-api-error@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" - integrity sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg== - -"@webassemblyjs/helper-buffer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" - integrity sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA== +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== dependencies: - debug "^3.1.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" -"@webassemblyjs/helper-code-frame@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" - integrity sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ== +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== dependencies: - "@webassemblyjs/wast-printer" "1.5.13" + "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/helper-fsm@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" - integrity sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg== +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== -"@webassemblyjs/helper-module-context@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" - integrity sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ== +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== dependencies: - debug "^3.1.0" - mamacro "^0.0.3" + "@webassemblyjs/ast" "1.9.0" -"@webassemblyjs/helper-wasm-bytecode@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" - integrity sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw== +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== -"@webassemblyjs/helper-wasm-section@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" - integrity sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw== +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - debug "^3.1.0" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" -"@webassemblyjs/ieee754@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" - integrity sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg== +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: - ieee754 "^1.1.11" + "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" - integrity sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg== +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== dependencies: - long "4.0.0" + "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" - integrity sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng== +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== -"@webassemblyjs/wasm-edit@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" - integrity sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw== +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/helper-wasm-section" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - "@webassemblyjs/wast-printer" "1.5.13" - debug "^3.1.0" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/wasm-gen@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" - integrity sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA== +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wasm-opt@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" - integrity sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg== +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - debug "^3.1.0" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" -"@webassemblyjs/wasm-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" - integrity sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg== +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wast-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" - integrity sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A== +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/floating-point-hex-parser" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-code-frame" "1.5.13" - "@webassemblyjs/helper-fsm" "1.5.13" - long "^3.2.0" - mamacro "^0.0.3" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" - integrity sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ== +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - long "^3.2.0" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== - dependencies: - acorn "^5.0.0" - acorn-jsx@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" @@ -560,16 +570,16 @@ acorn-jsx@^5.1.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== -acorn@^5.0.0, acorn@^5.6.2: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - acorn@^6.0.2: version "6.0.7" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.7.tgz#490180ce18337270232d9488a44be83d9afb7fd3" integrity sha512-HNJNgE60C9eOTgn974Tlp3dpLZdUr+SoxxDwPaY9J/kDNOLQTkaDgwBUXAF4SSsrAwD9RpdxuHK/EbuF+W9Ahw== +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + acorn@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" @@ -582,6 +592,11 @@ agent-base@4: dependencies: es6-promisify "^5.0.0" +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -596,6 +611,11 @@ agent-base@~4.2.1: dependencies: es6-promisify "^5.0.0" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" @@ -985,11 +1005,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= - assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -1017,7 +1032,7 @@ async-done@^1.2.0, async-done@^1.2.2: process-nextick-args "^1.0.7" stream-exhaust "^1.0.1" -async-each@^1.0.0, async-each@^1.0.1: +async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" integrity sha1-GdOGodntxufByF04iu28xW0zYC0= @@ -1078,17 +1093,12 @@ autoprefixer@^6.3.1: postcss "^5.2.16" postcss-value-parser "^3.2.3" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -aws4@^1.2.1, aws4@^1.6.0: +aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= @@ -1231,6 +1241,11 @@ bluebird@^3.5.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -1246,13 +1261,6 @@ boolean@^3.0.0: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.0.tgz#fab78d5907dbae6216ab46d32733bb7b76b99e76" integrity sha512-OElxJ1lUSinuoUnkpOgLmxp0DC4ytEhODEL6QJU0NpxE/mI4rUSh8h1P1Wkvfi3xQEBcxXR2gBIPNYNuaFcAbQ== -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= - dependencies: - hoek "2.x.x" - boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -1284,7 +1292,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -1460,6 +1468,27 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1518,11 +1547,6 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000760.tgz#3ea29473eb78a6ccb09f2eb73ac9e1debfec528d" integrity sha1-PqKUc+t4psywny63Osnh3r/sUo0= -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" - integrity sha1-cVuW6phBWTzDMGeSP17GDr2k99c= - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1535,16 +1559,7 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@2.4.2, chalk@^2.1.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -1564,6 +1579,15 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" @@ -1629,25 +1653,39 @@ chokidar@^2.0.0: optionalDependencies: fsevents "^1.2.7" -chokidar@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" + async-each "^1.0.1" + braces "^2.3.2" glob-parent "^3.1.0" - inherits "^2.0.1" + inherits "^2.0.3" is-binary-path "^1.0.0" is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.2.2" + fsevents "^1.2.7" + +chokidar@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" chownr@^1.0.1: version "1.0.1" @@ -1667,10 +1705,10 @@ chrome-remote-interface@0.26.1: commander "2.11.x" ws "^3.3.3" -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== dependencies: tslib "^1.9.0" @@ -1938,10 +1976,10 @@ commander@^2.19.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commandpost@^1.0.0: version "1.2.1" @@ -1985,6 +2023,21 @@ concat-with-sourcemaps@^1.0.0: dependencies: source-map "^0.5.1" +concurrently@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.2.0.tgz#ead55121d08a0fc817085584c123cedec2e08975" + integrity sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw== + dependencies: + chalk "^2.4.2" + date-fns "^2.0.1" + lodash "^4.17.15" + read-pkg "^4.0.1" + rxjs "^6.5.2" + spawn-command "^0.0.2-1" + supports-color "^6.1.0" + tree-kill "^1.2.2" + yargs "^13.3.0" + config-chain@^1.1.11, config-chain@^1.1.12: version "1.1.12" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" @@ -2086,17 +2139,6 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -coveralls@^2.11.11: - version "2.13.3" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.3.tgz#9ad7c2ae527417f361e8b626483f48ee92dd2bc7" - integrity sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw== - dependencies: - js-yaml "3.6.1" - lcov-parse "0.0.10" - log-driver "1.2.5" - minimist "1.2.0" - request "2.79.0" - create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -2128,7 +2170,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2144,13 +2186,6 @@ crypt@~0.0.1: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= - dependencies: - boom "2.x.x" - cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" @@ -2307,6 +2342,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +date-fns@^2.0.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba" + integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw== + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -2338,6 +2378,13 @@ debug@3.1.0: dependencies: ms "2.0.0" +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -2345,13 +2392,6 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2697,10 +2737,10 @@ electron-to-chromium@^1.2.7: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" integrity sha1-eOy4o5kGYYe7N07t412ccFZagD0= -electron@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/electron/-/electron-7.3.1.tgz#3574f85866b97a8712265442dbf7244cac639910" - integrity sha512-T1yuQqjTpRIh/oQ1rIhuN2aIk0YZaielyn09oxrMMwvL+C3bHvpPUJSCZrtVSzdUmTORhQRM9FZPzheBsneVUA== +electron@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-7.3.2.tgz#184b69fe9089693e179b3b34effa975dfc8e505d" + integrity sha512-5uSWVfCJogiPiU0G+RKi4ECnNs0gPNjAwYVE9KR7RXaOJYcpNIC5RFejaaUnuRoBssJ5B1n/5WU6wDUxvPajWQ== dependencies: "@electron/get" "^1.0.1" "@types/node" "^12.0.12" @@ -2741,6 +2781,11 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encodeurl@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2760,7 +2805,7 @@ end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -2769,6 +2814,15 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" +enhanced-resolve@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" + integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -2793,6 +2847,13 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.35" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f" @@ -2882,6 +2943,14 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-scope@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" @@ -3083,10 +3152,10 @@ event-stream@~3.3.4: stream-combiner "^0.2.2" through "^2.3.8" -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -3170,7 +3239,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: +extend@^3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= @@ -3294,6 +3363,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -3378,6 +3452,15 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-parent-dir@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" @@ -3405,16 +3488,6 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -findup-sync@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" @@ -3425,6 +3498,16 @@ findup-sync@^2.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + fined@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" @@ -3512,15 +3595,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" @@ -3630,14 +3704,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - fsevents@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" @@ -3651,6 +3717,11 @@ fsevents@~2.1.1: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.1.tgz#74c64e21df71721845d0c44fe54b7f56b82995a9" integrity sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw== +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" @@ -3685,18 +3756,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - integrity sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ= - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA= - dependencies: - is-property "^1.0.0" - gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -3879,7 +3938,7 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.6: +glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -3904,13 +3963,6 @@ global-agent@^2.0.2: semver "^6.3.0" serialize-error "^5.0.0" -global-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -3920,6 +3972,13 @@ global-modules@^1.0.0: is-windows "^1.0.1" resolve-dir "^1.0.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" @@ -4032,6 +4091,11 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= +graceful-fs@^4.1.15: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" @@ -4297,16 +4361,6 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - integrity sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0= - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -4421,16 +4475,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" @@ -4450,11 +4494,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= - hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" @@ -4507,15 +4546,6 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -4546,6 +4576,14 @@ https-proxy-agent@^3.0.0: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== + dependencies: + agent-base "5" + debug "4" + husky@^0.13.1: version "0.13.4" resolved "https://registry.yarnpkg.com/husky/-/husky-0.13.4.tgz#48785c5028de3452a51c48c12c4f94b2124a1407" @@ -4556,12 +4594,10 @@ husky@^0.13.1: is-ci "^1.0.9" normalize-path "^1.0.0" -iconv-lite@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550" - integrity sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw== - dependencies: - safer-buffer ">= 2.1.2 < 3" +iconv-lite-umd@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.5.tgz#6a1f621a3b4d125f72feff813a9839e1ebd6c722" + integrity sha512-WDegH4al+e3n3jTOStRvm+jzDA3JMUQGgzdAsMxAgcgB0Oi72HjfdsoX08ieKsy3rKexXVjWZr41aOIUaCZnMg== iconv-lite@^0.4.19: version "0.4.19" @@ -4589,7 +4625,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -ieee754@^1.1.11, ieee754@^1.1.4: +ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== @@ -4624,7 +4660,7 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@2.0.0: +import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== @@ -4642,10 +4678,10 @@ indexes-of@^1.0.1: resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" @@ -4723,16 +4759,16 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" -interpret@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== - interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -4937,16 +4973,6 @@ is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-my-json-valid@^2.12.4: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" - integrity sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ== - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -5022,11 +5048,6 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= - is-relative@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" @@ -5225,14 +5246,6 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" - integrity sha1-bl/mfYsgXOTSL60Ft3geja3MSzA= - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - js-yaml@^3.12.0: version "3.12.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" @@ -5262,10 +5275,10 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jschardet@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.1.1.tgz#af6f8fd0b3b0f5d46a8fd9614a4fce490575c184" - integrity sha512-pA5qG9Zwm8CBpGlK/lo2GE9jPxwqRgMV7Lzc/1iaPccw6v4Rhj8Zg2BTyrdmHmxlJojnbLupLeRnaPLsq03x6Q== +jschardet@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.2.1.tgz#03b0264669a90c7a5c436a68c5a7d4e4cb0c9823" + integrity sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw== jsdoctypeparser@^6.1.0: version "6.1.0" @@ -5304,7 +5317,7 @@ json-edm-parser@0.1.2: dependencies: jsonparse "~1.2.0" -json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -5384,11 +5397,6 @@ jsonparse@~1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" integrity sha1-XAxWhRBxYOcv50ib3eoLRMK8Z70= -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk= - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -5496,11 +5504,6 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -lcov-parse@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" - integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= - lead@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" @@ -5548,19 +5551,10 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - integrity sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI= - -loader-utils@1.2.3, loader-utils@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" @@ -5571,6 +5565,24 @@ loader-utils@^1.0.2, loader-utils@^1.1.0: emojis-list "^2.0.0" json5 "^0.5.0" +loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -5597,11 +5609,6 @@ lodash.clone@^4.3.2: resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.isequal@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -5667,26 +5674,11 @@ lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -log-driver@1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" - integrity sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY= - lolex@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" integrity sha1-fD2mL/yzDw9agKJWbKJORdigHzE= -long@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= - lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -5718,6 +5710,13 @@ lru-cache@^4.1.3: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" @@ -5730,6 +5729,14 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + make-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" @@ -5744,11 +5751,6 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -5842,7 +5844,7 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -5850,6 +5852,14 @@ memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + merge-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-1.0.1.tgz#2a64b24457becd4e4dc608283247e94ce589aa32" @@ -5883,7 +5893,7 @@ micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5920,7 +5930,7 @@ mime-db@~1.36.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.17: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= @@ -5992,7 +6002,7 @@ minimatch@0.3: lru-cache "2" sigmund "~1.0.0" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -6004,7 +6014,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -6050,6 +6060,22 @@ mississippi@^2.0.0: stream-each "^1.1.0" through2 "^2.0.0" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -6075,6 +6101,13 @@ mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd dependencies: minimist "0.0.8" +mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + mkpath@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91" @@ -6234,6 +6267,11 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== +neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + nice-try@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" @@ -6251,10 +6289,10 @@ node-addon-api@1.6.2: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.6.2.tgz#d8aad9781a5cfc4132cc2fecdbdd982534265217" integrity sha512-479Bjw9nTE5DdBSZZWprFryHGjUaQC31y1wHo19We/k0BZlrmhqQitWoUL0cD8+scljCbIUL+E58oRDEakdGGA== -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -6263,10 +6301,10 @@ node-libs-browser@^2.0.0: constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" + events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.0" + path-browserify "0.0.1" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -6277,8 +6315,8 @@ node-libs-browser@^2.0.0: timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" + util "^0.11.0" + vm-browserify "^1.0.1" node-pre-gyp@^0.10.0: version "0.10.3" @@ -6457,7 +6495,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" integrity sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw== -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= @@ -6818,6 +6856,14 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-node-version@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" @@ -6852,10 +6898,10 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-dirname@^1.0.0: version "1.0.2" @@ -6960,6 +7006,11 @@ picomatch@^2.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -6970,6 +7021,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -7528,11 +7584,6 @@ q@^1.0.1, q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@~6.3.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" - integrity sha1-51vV9uJoEioqDgvaYwslUMFmUCw= - qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -7597,6 +7648,13 @@ randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: dependencies: safe-buffer "^5.1.0" +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" @@ -7642,6 +7700,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= + dependencies: + normalize-package-data "^2.3.2" + parse-json "^4.0.0" + pify "^3.0.0" + read@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -7725,16 +7792,6 @@ readable-stream@~2.0.0: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -7751,6 +7808,13 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -7870,32 +7934,6 @@ replacestream@^4.0.0: object-assign "^4.0.1" readable-stream "^2.0.2" -request@2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" - integrity sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4= - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - "request@>= 2.44.0 < 3.0.0", request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -8081,6 +8119,13 @@ rimraf@^2.4.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.0.5" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8134,6 +8179,13 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" +rxjs@^6.5.2: + version "6.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" + integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== + dependencies: + tslib "^1.9.0" + rxjs@^6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" @@ -8190,12 +8242,13 @@ sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" + ajv-errors "^1.0.0" ajv-keywords "^3.1.0" schema-utils@^2.0.0, schema-utils@^2.0.1: @@ -8218,10 +8271,10 @@ semver-greatest-satisfied-range@^1.1.0: dependencies: sver-compat "^1.5.0" -semver-umd@^5.5.6: - version "5.5.6" - resolved "https://registry.yarnpkg.com/semver-umd/-/semver-umd-5.5.6.tgz#1d185bbd2caec825c564b54907cd09e14083f228" - integrity sha512-6ARYXVi4Y4VO5HfyCjT/6xyykBtJwEXSGQ8ON4UPQSFOjZUDsbAE0J614QcBBsLTTyQMEqvsXN804vAqpydjzw== +semver-umd@^5.5.7: + version "5.5.7" + resolved "https://registry.yarnpkg.com/semver-umd/-/semver-umd-5.5.7.tgz#966beb5e96c7da6fbf09c3da14c2872d6836c528" + integrity sha512-XgjPNlD0J6aIc8xoTN6GQGwWc2Xg0kq8NzrqMVuKG/4Arl6ab1F8+Am5Y/XKKCR+FceFr2yN/Uv5ZJBhRyRqKg== "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0: version "5.4.1" @@ -8270,16 +8323,18 @@ serialize-javascript@^1.4.0: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== +serialize-javascript@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" + integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== + dependencies: + randombytes "^2.1.0" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" @@ -8413,13 +8468,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= - dependencies: - hoek "2.x.x" - sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" @@ -8466,6 +8514,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -8493,6 +8549,11 @@ sparkles@^1.0.0: resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" integrity sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM= +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + spdlog@^0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/spdlog/-/spdlog-0.11.1.tgz#29721b31018a5fe6a3ce2531f9d8d43e0bd6b825" @@ -8590,6 +8651,13 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + stack-chain@^1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-1.3.7.tgz#d192c9ff4ea6a22c94c4dd459171e3f00cea1285" @@ -8738,7 +8806,7 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4, stringstream@~0.0.5: +stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= @@ -8833,13 +8901,6 @@ supports-color@1.2.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" integrity sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4= -supports-color@6.1.0, supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -8866,6 +8927,20 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" @@ -8919,6 +8994,11 @@ tapable@^1.0.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" integrity sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg== +tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + tar-fs@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.1.tgz#e44086c1c60d31a4f0cf893b1c4e155dabfae9e2" @@ -8970,6 +9050,30 @@ temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +terser-webpack-plugin@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" + integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^3.1.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -9139,7 +9243,7 @@ touch@0.0.3: dependencies: nopt "~1.0.10" -tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= @@ -9206,11 +9310,6 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= - tunnel@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.4.tgz#2d3785a158c174c9a16dc2c046ec5fc5f1742213" @@ -9264,38 +9363,16 @@ typescript@^2.6.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" integrity sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q= -typescript@^3.9.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== +typescript@^4.0.0-dev.20200629: + version "4.0.0-dev.20200629" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.0-dev.20200629.tgz#4631667ebffe3a340beee885a4bebe3a73b6f18e" + integrity sha512-c4DUu7KvTcx4x7V8sBWexYNkCfioiH1huOJL6WFAA8Oot0Gr/+PlKKDBS9fYjsadEv1JI1qboJKobwLQn0kQXw== uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" integrity sha1-ftUNXg+an7ClczeSWfKndFjVAZI= -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglifyjs-webpack-plugin@^1.2.4: - version "1.2.7" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" - integrity sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA== - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -9365,6 +9442,13 @@ unique-filename@^1.1.0: dependencies: unique-slug "^2.0.0" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + unique-slug@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" @@ -9393,11 +9477,16 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.0.5, upath@^1.1.0: +upath@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + uri-js@^4.2.1, uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -9452,10 +9541,10 @@ util@0.10.3, "util@>=0.10.3 <1": dependencies: inherits "2.0.1" -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== dependencies: inherits "2.0.3" @@ -9469,16 +9558,16 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -v8-compile-cache@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" - integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== - v8-compile-cache@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== +v8-compile-cache@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + v8-inspect-profiler@^0.0.20: version "0.0.20" resolved "https://registry.yarnpkg.com/v8-inspect-profiler/-/v8-inspect-profiler-0.0.20.tgz#f7ad0f8178dcea2f1504334e8844ef38181792ab" @@ -9642,12 +9731,10 @@ vinyl@~2.0.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== vsce@1.48.0: version "1.48.0" @@ -9720,10 +9807,13 @@ vscode-proxy-agent@^0.5.2: https-proxy-agent "^2.2.3" socks-proxy-agent "^4.0.1" -vscode-ripgrep@^1.5.8: - version "1.5.8" - resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.5.8.tgz#32cb33da6d1a9ca8f5de8c2813ed5114fd55fc11" - integrity sha512-l6Pv/t1Jk63RU+kEkMO04XxnNRYdyzuesizj9AzFpcfrUxxpAjEJBK1qO9Mov30UUGZl7uDUBn+uCv9koaHPPA== +vscode-ripgrep@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.7.0.tgz#ec912e04aa29f7d73bcef04b7576b792f12c9b38" + integrity sha512-sQY/u0ymc9YMiPaSsMmdZSFQ6PTS2UxcGuiQkF7aoIezDxZcGE1sMarqftWEl9wYWYc9hElYm00WpoFgzj1oUg== + dependencies: + https-proxy-agent "^4.0.0" + proxy-from-env "^1.1.0" vscode-sqlite3@4.0.10: version "4.0.10" @@ -9732,10 +9822,10 @@ vscode-sqlite3@4.0.10: dependencies: nan "^2.14.0" -vscode-textmate@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.1.1.tgz#d88dbf271bee7cede455a21bd4894ba5724a4a7e" - integrity sha512-5VHjF+Fglf9d2JI5OyQ7FHutK6/29G0qYyD920K0SWO7uY8JTWbqyKAHEtfB/ZDk2fOe/E23n3wz9fHXKi63yg== +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== vscode-windows-ca-certs@0.2.0: version "0.2.0" @@ -9759,85 +9849,92 @@ vso-node-api@6.1.2-preview: typed-rest-client "^0.9.0" underscore "^1.8.3" -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== dependencies: - chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" -webpack-cli@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.8.tgz#caeaebcc26f685db1736e5decd3f01aac30123ec" - integrity sha512-RANYSXwikSWINjHMd/mtesblNSpjpDLoYTBtP99n1RhXqVI/wxN40Auqy42I7y4xrbmRBoA5Zy5E0JSBD5XRhw== +webpack-cli@^3.3.12: + version "3.3.12" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" + integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== dependencies: - chalk "2.4.2" - cross-spawn "6.0.5" - enhanced-resolve "4.1.0" - findup-sync "3.0.0" - global-modules "2.0.0" - import-local "2.0.0" - interpret "1.2.0" - loader-utils "1.2.3" - supports-color "6.1.0" - v8-compile-cache "2.0.3" - yargs "13.2.4" + chalk "^2.4.2" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.1" + findup-sync "^3.0.0" + global-modules "^2.0.0" + import-local "^2.0.0" + interpret "^1.4.0" + loader-utils "^1.4.0" + supports-color "^6.1.0" + v8-compile-cache "^2.1.1" + yargs "^13.3.2" -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - integrity sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw== +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-stream@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.1.1.tgz#15b1d91da6887a37f6832128383ae0282bd7d0e7" - integrity sha512-Q6Wn8brjTGGWIobttGPt3JQzBkGgipqXSnkP8/+dJWHMG9DDSu3PGfctUo3Fp6asBGu+Vrb/g1qnvTGQECobOQ== +webpack-stream@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-5.2.1.tgz#35c992161399fe8cad9c10d4a5c258f022629b39" + integrity sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A== dependencies: - fancy-log "^1.3.2" + fancy-log "^1.3.3" lodash.clone "^4.3.2" lodash.some "^4.2.2" memory-fs "^0.4.1" plugin-error "^1.0.1" - supports-color "^5.3.0" + supports-color "^5.5.0" through "^2.3.8" vinyl "^2.1.0" - webpack "^4.7.0" + webpack "^4.26.1" -webpack@^4.16.5, webpack@^4.7.0: - version "4.16.5" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.5.tgz#29fb39462823d7eb8aefcab8b45f7f241db0d092" - integrity sha512-i5cHYHonzSc1zBuwB5MSzW4v9cScZFbprkHK8ZgzPDCRkQXGGpYzPmJhbus5bOrZ0tXTcQp+xyImRSvKb0b+Kw== +webpack@^4.26.1, webpack@^4.43.0: + version "4.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/wasm-edit" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" + eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.0.1" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.1" + webpack-sources "^1.4.1" when@^3.7.7: version "3.7.8" @@ -9920,10 +10017,10 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== dependencies: errno "~0.1.7" @@ -10084,6 +10181,14 @@ yargs-parser@^13.1.0: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" @@ -10091,7 +10196,7 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs@13.2.4, yargs@^13.2.4: +yargs@^13.2.4: version "13.2.4" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== @@ -10108,6 +10213,22 @@ yargs@13.2.4, yargs@^13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" +yargs@^13.3.0, yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"